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 + | NotAny + | NotAny + | NotAny + | NotAny + | NotAny + | NotAny; /** @ts-ignore For users who use Deno */ type FetchRequestInit = NonNullable[1]>; -/* eslint-enable */ type RequestInits = - | NotAny - | NotAny - | NotAny - | NotAny - | NotAny - | NotAny; + | NotAny + | NotAny + | NotAny + | NotAny + | NotAny + | NotAny; /** * This type contains `RequestInit` options that may be available on the current runtime, * including per-platform extensions like `dispatcher`, `agent`, `client`, etc. */ export type MergedRequestInit = RequestInits & - /** We don't include these in the types as they'll be overridden for every request. */ - Partial>; + /** We don't include these in the types as they'll be overridden for every request. */ + Partial>; diff --git a/packages/google-calendar/src/internal/uploads.ts b/packages/google-calendar/src/internal/uploads.ts index f8966501..7294ecfb 100644 --- a/packages/google-calendar/src/internal/uploads.ts +++ b/packages/google-calendar/src/internal/uploads.ts @@ -1,31 +1,32 @@ -import { type RequestOptions } from "./request-options"; +import type { RequestOptions } from "./request-options"; import type { FilePropertyBag, Fetch } from "./builtin-types"; import type { GoogleCalendar } from "../client"; import { ReadableStreamFrom } from "./shims"; export type BlobPart = string | ArrayBuffer | ArrayBufferView | Blob | DataView; type FsReadStream = AsyncIterable & { - path: string | { toString(): string }; + path: string | { toString(): string }; }; // https://github.com/oven-sh/bun/issues/5980 interface BunFile extends Blob { - readonly name?: string | undefined; + readonly name?: string | undefined; } export const checkFileSupport = () => { - if (typeof File === "undefined") { - const { process } = globalThis as any; - const isOldNode = - typeof process?.versions?.node === "string" && - parseInt(process.versions.node.split(".")) < 20; - throw new Error( - "`File` is not defined as a global, which is required for file uploads." + - (isOldNode - ? " Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`." - : ""), - ); - } + if (typeof File === "undefined") { + const { process } = globalThis as any; + const isOldNode = + typeof process?.versions?.node === "string" && + Number.parseInt(process.versions.node.split(".")) < 20; + throw new Error( + `\`File\` is not defined as a global, which is required for file uploads.${ + isOldNode + ? " Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`." + : "" + }`, + ); + } }; /** @@ -44,57 +45,55 @@ export type Uploadable = File | Response | FsReadStream | BunFile; * for environments that don't define a global `File` yet. */ export function makeFile( - fileBits: BlobPart[], - fileName: string | undefined, - options?: FilePropertyBag, + fileBits: BlobPart[], + fileName: string | undefined, + options?: FilePropertyBag, ): File { - checkFileSupport(); - return new File(fileBits as any, fileName ?? "unknown_file", options); + checkFileSupport(); + return new File(fileBits as any, fileName ?? "unknown_file", options); } export function getName(value: any): string | undefined { - return ( - ( - (typeof value === "object" && - value !== null && - (("name" in value && value.name && String(value.name)) || - ("url" in value && value.url && String(value.url)) || - ("filename" in value && value.filename && String(value.filename)) || - ("path" in value && value.path && String(value.path)))) || - "" - ) - .split(/[\\/]/) - .pop() || undefined - ); + return ( + ( + (typeof value === "object" && + value !== null && + (("name" in value && value.name && String(value.name)) || + ("url" in value && value.url && String(value.url)) || + ("filename" in value && value.filename && String(value.filename)) || + ("path" in value && value.path && String(value.path)))) || + "" + ) + .split(/[\\/]/) + .pop() || undefined + ); } export const isAsyncIterable = (value: any): value is AsyncIterable => - value != null && - typeof value === "object" && - typeof value[Symbol.asyncIterator] === "function"; + value != null && typeof value === "object" && typeof value[Symbol.asyncIterator] === "function"; /** * Returns a multipart/form-data request if any part of the given request body contains a File / Blob value. * Otherwise returns the request as is. */ export const maybeMultipartFormRequestOptions = async ( - opts: RequestOptions, - fetch: GoogleCalendar | Fetch, + opts: RequestOptions, + fetch: GoogleCalendar | Fetch, ): Promise => { - if (!hasUploadableValue(opts.body)) return opts; + if (!hasUploadableValue(opts.body)) return opts; - return { ...opts, body: await createForm(opts.body, fetch) }; + return { ...opts, body: await createForm(opts.body, fetch) }; }; type MultipartFormRequestOptions = Omit & { - body: unknown; + body: unknown; }; export const multipartFormRequestOptions = async ( - opts: MultipartFormRequestOptions, - fetch: GoogleCalendar | Fetch, + opts: MultipartFormRequestOptions, + fetch: GoogleCalendar | Fetch, ): Promise => { - return { ...opts, body: await createForm(opts.body, fetch) }; + return { ...opts, body: await createForm(opts.body, fetch) }; }; const supportsFormDataMap = new WeakMap>(); @@ -105,52 +104,43 @@ const supportsFormDataMap = new WeakMap>(); * This function detects if the fetch function provided supports the global FormData object to avoid * confusing error messages later on. */ -function supportsFormData( - fetchObject: GoogleCalendar | Fetch, -): Promise { - const fetch: Fetch = - typeof fetchObject === "function" - ? fetchObject - : (fetchObject as any).fetch; - const cached = supportsFormDataMap.get(fetch); - if (cached) return cached; - const promise = (async () => { - try { - const FetchResponse = ( - "Response" in fetch - ? fetch.Response - : (await fetch("data:,")).constructor - ) as typeof Response; - const data = new FormData(); - if (data.toString() === (await new FetchResponse(data).text())) { - return false; - } - return true; - } catch { - // avoid false negatives - return true; - } - })(); - supportsFormDataMap.set(fetch, promise); - return promise; +function supportsFormData(fetchObject: GoogleCalendar | Fetch): Promise { + const fetch: Fetch = typeof fetchObject === "function" ? fetchObject : (fetchObject as any).fetch; + const cached = supportsFormDataMap.get(fetch); + if (cached) return cached; + const promise = (async () => { + try { + const FetchResponse = ( + "Response" in fetch ? fetch.Response : (await fetch("data:,")).constructor + ) as typeof Response; + const data = new FormData(); + if (data.toString() === (await new FetchResponse(data).text())) { + return false; + } + return true; + } catch { + // avoid false negatives + return true; + } + })(); + supportsFormDataMap.set(fetch, promise); + return promise; } export const createForm = async >( - body: T | undefined, - fetch: GoogleCalendar | Fetch, + body: T | undefined, + fetch: GoogleCalendar | Fetch, ): Promise => { - if (!(await supportsFormData(fetch))) { - throw new TypeError( - "The provided fetch function does not support file uploads with the current global FormData class.", - ); - } - const form = new FormData(); - await Promise.all( - Object.entries(body || {}).map(([key, value]) => - addFormValue(form, key, value), - ), - ); - return form; + if (!(await supportsFormData(fetch))) { + throw new TypeError( + "The provided fetch function does not support file uploads with the current global FormData class.", + ); + } + const form = new FormData(); + await Promise.all( + Object.entries(body || {}).map(([key, value]) => addFormValue(form, key, value)), + ); + return form; }; // We check for Blob not File because Bun.File doesn't inherit from File, @@ -158,65 +148,50 @@ export const createForm = async >( const isNamedBlob = (value: object) => value instanceof Blob && "name" in value; const isUploadable = (value: unknown) => - typeof value === "object" && - value !== null && - (value instanceof Response || isAsyncIterable(value) || isNamedBlob(value)); + typeof value === "object" && + value !== null && + (value instanceof Response || isAsyncIterable(value) || isNamedBlob(value)); const hasUploadableValue = (value: unknown): boolean => { - if (isUploadable(value)) return true; - if (Array.isArray(value)) return value.some(hasUploadableValue); - if (value && typeof value === "object") { - for (const k in value) { - if (hasUploadableValue((value as any)[k])) return true; - } - } - return false; + if (isUploadable(value)) return true; + if (Array.isArray(value)) return value.some(hasUploadableValue); + if (value && typeof value === "object") { + for (const k in value) { + if (hasUploadableValue((value as any)[k])) return true; + } + } + return false; }; -const addFormValue = async ( - form: FormData, - key: string, - value: unknown, -): Promise => { - if (value === undefined) return; - if (value == null) { - throw new TypeError( - `Received null for "${key}"; to pass null in FormData, you must use the string 'null'`, - ); - } - - // TODO: make nested formats configurable - if ( - typeof value === "string" || - typeof value === "number" || - typeof value === "boolean" - ) { - form.append(key, String(value)); - } else if (value instanceof Response) { - form.append(key, makeFile([await value.blob()], getName(value))); - } else if (isAsyncIterable(value)) { - form.append( - key, - makeFile( - [await new Response(ReadableStreamFrom(value)).blob()], - getName(value), - ), - ); - } else if (isNamedBlob(value)) { - form.append(key, value, getName(value)); - } else if (Array.isArray(value)) { - await Promise.all( - value.map((entry) => addFormValue(form, key + "[]", entry)), - ); - } else if (typeof value === "object") { - await Promise.all( - Object.entries(value).map(([name, prop]) => - addFormValue(form, `${key}[${name}]`, prop), - ), - ); - } else { - throw new TypeError( - `Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`, - ); - } +const addFormValue = async (form: FormData, key: string, value: unknown): Promise => { + if (value === undefined) return; + if (value == null) { + throw new TypeError( + `Received null for "${key}"; to pass null in FormData, you must use the string 'null'`, + ); + } + + // TODO: make nested formats configurable + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + form.append(key, String(value)); + } else if (value instanceof Response) { + form.append(key, makeFile([await value.blob()], getName(value))); + } else if (isAsyncIterable(value)) { + form.append( + key, + makeFile([await new Response(ReadableStreamFrom(value)).blob()], getName(value)), + ); + } else if (isNamedBlob(value)) { + form.append(key, value, getName(value)); + } else if (Array.isArray(value)) { + await Promise.all(value.map((entry) => addFormValue(form, `${key}[]`, entry))); + } else if (typeof value === "object") { + await Promise.all( + Object.entries(value).map(([name, prop]) => addFormValue(form, `${key}[${name}]`, prop)), + ); + } else { + throw new TypeError( + `Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`, + ); + } }; diff --git a/packages/google-calendar/src/internal/utils/base64.ts b/packages/google-calendar/src/internal/utils/base64.ts index 6cfb2834..6867103b 100644 --- a/packages/google-calendar/src/internal/utils/base64.ts +++ b/packages/google-calendar/src/internal/utils/base64.ts @@ -3,44 +3,42 @@ import { GoogleCalendarError } from "../../core/error"; import { encodeUTF8 } from "./bytes"; -export const toBase64 = ( - data: string | Uint8Array | null | undefined, -): string => { - if (!data) return ""; - - if (typeof (globalThis as any).Buffer !== "undefined") { - return (globalThis as any).Buffer.from(data).toString("base64"); - } - - if (typeof data === "string") { - data = encodeUTF8(data); - } - - if (typeof btoa !== "undefined") { - return btoa(String.fromCharCode.apply(null, data as any)); - } - - throw new GoogleCalendarError( - "Cannot generate base64 string; Expected `Buffer` or `btoa` to be defined", - ); +export const toBase64 = (data: string | Uint8Array | null | undefined): string => { + if (!data) return ""; + + if (typeof (globalThis as any).Buffer !== "undefined") { + return (globalThis as any).Buffer.from(data).toString("base64"); + } + + if (typeof data === "string") { + data = encodeUTF8(data); + } + + if (typeof btoa !== "undefined") { + return btoa(String.fromCharCode.apply(null, data as any)); + } + + throw new GoogleCalendarError( + "Cannot generate base64 string; Expected `Buffer` or `btoa` to be defined", + ); }; export const fromBase64 = (str: string): Uint8Array => { - if (typeof (globalThis as any).Buffer !== "undefined") { - const buf = (globalThis as any).Buffer.from(str, "base64"); - return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); - } - - if (typeof atob !== "undefined") { - const bstr = atob(str); - const buf = new Uint8Array(bstr.length); - for (let i = 0; i < bstr.length; i++) { - buf[i] = bstr.charCodeAt(i); - } - return buf; - } - - throw new GoogleCalendarError( - "Cannot decode base64 string; Expected `Buffer` or `atob` to be defined", - ); + if (typeof (globalThis as any).Buffer !== "undefined") { + const buf = (globalThis as any).Buffer.from(str, "base64"); + return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); + } + + if (typeof atob !== "undefined") { + const bstr = atob(str); + const buf = new Uint8Array(bstr.length); + for (let i = 0; i < bstr.length; i++) { + buf[i] = bstr.charCodeAt(i); + } + return buf; + } + + throw new GoogleCalendarError( + "Cannot decode base64 string; Expected `Buffer` or `atob` to be defined", + ); }; diff --git a/packages/google-calendar/src/internal/utils/bytes.ts b/packages/google-calendar/src/internal/utils/bytes.ts index 3cc9f007..aa43d31e 100644 --- a/packages/google-calendar/src/internal/utils/bytes.ts +++ b/packages/google-calendar/src/internal/utils/bytes.ts @@ -1,34 +1,32 @@ export function concatBytes(buffers: Uint8Array[]): Uint8Array { - let length = 0; - for (const buffer of buffers) { - length += buffer.length; - } - const output = new Uint8Array(length); - let index = 0; - for (const buffer of buffers) { - output.set(buffer, index); - index += buffer.length; - } + let length = 0; + for (const buffer of buffers) { + length += buffer.length; + } + const output = new Uint8Array(length); + let index = 0; + for (const buffer of buffers) { + output.set(buffer, index); + index += buffer.length; + } - return output; + return output; } let encodeUTF8_: (str: string) => Uint8Array; export function encodeUTF8(str: string) { - let encoder; - return ( - encodeUTF8_ ?? - ((encoder = new (globalThis as any).TextEncoder()), - (encodeUTF8_ = encoder.encode.bind(encoder))) - )(str); + let encoder; + return ( + encodeUTF8_ ?? + ((encoder = new (globalThis as any).TextEncoder()), (encodeUTF8_ = encoder.encode.bind(encoder))) + )(str); } let decodeUTF8_: (bytes: Uint8Array) => string; export function decodeUTF8(bytes: Uint8Array) { - let decoder; - return ( - decodeUTF8_ ?? - ((decoder = new (globalThis as any).TextDecoder()), - (decodeUTF8_ = decoder.decode.bind(decoder))) - )(bytes); + let decoder; + return ( + decodeUTF8_ ?? + ((decoder = new (globalThis as any).TextDecoder()), (decodeUTF8_ = decoder.decode.bind(decoder))) + )(bytes); } diff --git a/packages/google-calendar/src/internal/utils/env.ts b/packages/google-calendar/src/internal/utils/env.ts index 081de994..62339b89 100644 --- a/packages/google-calendar/src/internal/utils/env.ts +++ b/packages/google-calendar/src/internal/utils/env.ts @@ -8,11 +8,11 @@ * Will return undefined if the environment variable doesn't exist or cannot be accessed. */ export const readEnv = (env: string): string | undefined => { - if (typeof (globalThis as any).process !== "undefined") { - return (globalThis as any).process.env?.[env]?.trim() ?? undefined; - } - if (typeof (globalThis as any).Deno !== "undefined") { - return (globalThis as any).Deno.env?.get?.(env)?.trim(); - } - return undefined; + if (typeof (globalThis as any).process !== "undefined") { + return (globalThis as any).process.env?.[env]?.trim() ?? undefined; + } + if (typeof (globalThis as any).Deno !== "undefined") { + return (globalThis as any).Deno.env?.get?.(env)?.trim(); + } + return undefined; }; diff --git a/packages/google-calendar/src/internal/utils/log.ts b/packages/google-calendar/src/internal/utils/log.ts index da231934..79a6bc46 100644 --- a/packages/google-calendar/src/internal/utils/log.ts +++ b/packages/google-calendar/src/internal/utils/log.ts @@ -1,129 +1,124 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { hasOwn } from "./values"; -import { type GoogleCalendar } from "../../client"; -import { RequestOptions } from "../request-options"; +import type { GoogleCalendar } from "../../client"; +import type { RequestOptions } from "../request-options"; type LogFn = (message: string, ...rest: unknown[]) => void; export type Logger = { - error: LogFn; - warn: LogFn; - info: LogFn; - debug: LogFn; + error: LogFn; + warn: LogFn; + info: LogFn; + debug: LogFn; }; export type LogLevel = "off" | "error" | "warn" | "info" | "debug"; const levelNumbers = { - off: 0, - error: 200, - warn: 300, - info: 400, - debug: 500, + off: 0, + error: 200, + warn: 300, + info: 400, + debug: 500, }; export const parseLogLevel = ( - maybeLevel: string | undefined, - sourceName: string, - client: GoogleCalendar, + maybeLevel: string | undefined, + sourceName: string, + client: GoogleCalendar, ): LogLevel | undefined => { - if (!maybeLevel) { - return undefined; - } - if (hasOwn(levelNumbers, maybeLevel)) { - return maybeLevel; - } - loggerFor(client).warn( - `${sourceName} was set to ${JSON.stringify(maybeLevel)}, expected one of ${JSON.stringify( - Object.keys(levelNumbers), - )}`, - ); - return undefined; + if (!maybeLevel) { + return undefined; + } + if (hasOwn(levelNumbers, maybeLevel)) { + return maybeLevel; + } + loggerFor(client).warn( + `${sourceName} was set to ${JSON.stringify(maybeLevel)}, expected one of ${JSON.stringify( + Object.keys(levelNumbers), + )}`, + ); + return undefined; }; function noop() {} -function makeLogFn( - fnLevel: keyof Logger, - logger: Logger | undefined, - logLevel: LogLevel, -) { - if (!logger || levelNumbers[fnLevel] > levelNumbers[logLevel]) { - return noop; - } else { - // Don't wrap logger functions, we want the stacktrace intact! - return logger[fnLevel].bind(logger); - } +function makeLogFn(fnLevel: keyof Logger, logger: Logger | undefined, logLevel: LogLevel) { + if (!logger || levelNumbers[fnLevel] > levelNumbers[logLevel]) { + return noop; + } + // Don't wrap logger functions, we want the stacktrace intact! + return logger[fnLevel].bind(logger); } const noopLogger = { - error: noop, - warn: noop, - info: noop, - debug: noop, + error: noop, + warn: noop, + info: noop, + debug: noop, }; -let cachedLoggers = new WeakMap(); +const cachedLoggers = new WeakMap(); export function loggerFor(client: GoogleCalendar): Logger { - const logger = client.logger; - const logLevel = client.logLevel ?? "off"; - if (!logger) { - return noopLogger; - } + const logger = client.logger; + const logLevel = client.logLevel ?? "off"; + if (!logger) { + return noopLogger; + } - const cachedLogger = cachedLoggers.get(logger); - if (cachedLogger && cachedLogger[0] === logLevel) { - return cachedLogger[1]; - } + const cachedLogger = cachedLoggers.get(logger); + if (cachedLogger && cachedLogger[0] === logLevel) { + return cachedLogger[1]; + } - const levelLogger = { - error: makeLogFn("error", logger, logLevel), - warn: makeLogFn("warn", logger, logLevel), - info: makeLogFn("info", logger, logLevel), - debug: makeLogFn("debug", logger, logLevel), - }; + const levelLogger = { + error: makeLogFn("error", logger, logLevel), + warn: makeLogFn("warn", logger, logLevel), + info: makeLogFn("info", logger, logLevel), + debug: makeLogFn("debug", logger, logLevel), + }; - cachedLoggers.set(logger, [logLevel, levelLogger]); + cachedLoggers.set(logger, [logLevel, levelLogger]); - return levelLogger; + return levelLogger; } export const formatRequestDetails = (details: { - options?: RequestOptions | undefined; - headers?: Headers | Record | undefined; - retryOfRequestLogID?: string | undefined; - retryOf?: string | undefined; - url?: string | undefined; - status?: number | undefined; - method?: string | undefined; - durationMs?: number | undefined; - message?: unknown; - body?: unknown; + options?: RequestOptions | undefined; + headers?: Headers | Record | undefined; + retryOfRequestLogID?: string | undefined; + retryOf?: string | undefined; + url?: string | undefined; + status?: number | undefined; + method?: string | undefined; + durationMs?: number | undefined; + message?: unknown; + body?: unknown; }) => { - if (details.options) { - details.options = { ...details.options }; - delete details.options["headers"]; // redundant + leaks internals - } - if (details.headers) { - details.headers = Object.fromEntries( - (details.headers instanceof Headers - ? [...details.headers] - : Object.entries(details.headers) - ).map(([name, value]) => [ - name, - name.toLowerCase() === "authorization" || - name.toLowerCase() === "cookie" || - name.toLowerCase() === "set-cookie" - ? "***" - : value, - ]), - ); - } - if ("retryOfRequestLogID" in details) { - if (details.retryOfRequestLogID) { - details.retryOf = details.retryOfRequestLogID; - } - delete details.retryOfRequestLogID; - } - return details; + if (details.options) { + details.options = { ...details.options }; + details.options.headers = undefined; // redundant + leaks internals + } + if (details.headers) { + details.headers = Object.fromEntries( + (details.headers instanceof Headers + ? [...details.headers] + : Object.entries(details.headers) + ).map(([name, value]) => [ + name, + name.toLowerCase() === "authorization" || + name.toLowerCase() === "cookie" || + name.toLowerCase() === "set-cookie" + ? "***" + : value, + ]), + ); + } + if ("retryOfRequestLogID" in details) { + if (details.retryOfRequestLogID) { + details.retryOf = details.retryOfRequestLogID; + } + details.retryOfRequestLogID = undefined; + } + return details; }; diff --git a/packages/google-calendar/src/internal/utils/path.ts b/packages/google-calendar/src/internal/utils/path.ts index 2ad46a69..26eadb60 100644 --- a/packages/google-calendar/src/internal/utils/path.ts +++ b/packages/google-calendar/src/internal/utils/path.ts @@ -9,62 +9,57 @@ import { GoogleCalendarError } from "../../core/error"; * > pchar = unreserved / pct-encoded / sub-delims / ":" / "@" */ export function encodeURIPath(str: string) { - return str.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g, encodeURIComponent); + return str.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g, encodeURIComponent); } export const createPathTagFunction = (pathEncoder = encodeURIPath) => - function path( - statics: readonly string[], - ...params: readonly unknown[] - ): string { - // If there are no params, no processing is needed. - if (statics.length === 1) return statics[0]!; + function path(statics: readonly string[], ...params: readonly unknown[]): string { + // If there are no params, no processing is needed. + if (statics.length === 1) return statics[0]!; - let postPath = false; - const path = statics.reduce((previousValue, currentValue, index) => { - if (/[?#]/.test(currentValue)) { - postPath = true; - } - return ( - previousValue + - currentValue + - (index === params.length - ? "" - : (postPath ? encodeURIComponent : pathEncoder)( - String(params[index]), - )) - ); - }, ""); + let postPath = false; + const path = statics.reduce((previousValue, currentValue, index) => { + if (/[?#]/.test(currentValue)) { + postPath = true; + } + return ( + previousValue + + currentValue + + (index === params.length + ? "" + : (postPath ? encodeURIComponent : pathEncoder)(String(params[index]))) + ); + }, ""); - const pathOnly = path.split(/[?#]/, 1)[0]!; - const invalidSegments = []; - const invalidSegmentPattern = /(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi; - let match; + const pathOnly = path.split(/[?#]/, 1)[0]!; + const invalidSegments = []; + const invalidSegmentPattern = /(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi; + let match; - // Find all invalid segments - while ((match = invalidSegmentPattern.exec(pathOnly)) !== null) { - invalidSegments.push({ - start: match.index, - length: match[0].length, - }); - } + // Find all invalid segments + while ((match = invalidSegmentPattern.exec(pathOnly)) !== null) { + invalidSegments.push({ + start: match.index, + length: match[0].length, + }); + } - if (invalidSegments.length > 0) { - let lastEnd = 0; - const underline = invalidSegments.reduce((acc, segment) => { - const spaces = " ".repeat(segment.start - lastEnd); - const arrows = "^".repeat(segment.length); - lastEnd = segment.start + segment.length; - return acc + spaces + arrows; - }, ""); + if (invalidSegments.length > 0) { + let lastEnd = 0; + const underline = invalidSegments.reduce((acc, segment) => { + const spaces = " ".repeat(segment.start - lastEnd); + const arrows = "^".repeat(segment.length); + lastEnd = segment.start + segment.length; + return acc + spaces + arrows; + }, ""); - throw new GoogleCalendarError( - `Path parameters result in path with invalid segments:\n${path}\n${underline}`, - ); - } + throw new GoogleCalendarError( + `Path parameters result in path with invalid segments:\n${path}\n${underline}`, + ); + } - return path; - }; + return path; + }; /** * URI-encodes path params and ensures no unsafe /./ or /../ path segments are introduced. diff --git a/packages/google-calendar/src/internal/utils/sleep.ts b/packages/google-calendar/src/internal/utils/sleep.ts index a217a2b9..65e52962 100644 --- a/packages/google-calendar/src/internal/utils/sleep.ts +++ b/packages/google-calendar/src/internal/utils/sleep.ts @@ -1,4 +1,3 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -export const sleep = (ms: number) => - new Promise((resolve) => setTimeout(resolve, ms)); +export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); diff --git a/packages/google-calendar/src/internal/utils/uuid.ts b/packages/google-calendar/src/internal/utils/uuid.ts index 7e650a86..57b693cf 100644 --- a/packages/google-calendar/src/internal/utils/uuid.ts +++ b/packages/google-calendar/src/internal/utils/uuid.ts @@ -3,17 +3,17 @@ /** * https://stackoverflow.com/a/2117523 */ -export let uuid4 = function () { - const { crypto } = globalThis as any; - if (crypto?.randomUUID) { - uuid4 = crypto.randomUUID.bind(crypto); - return crypto.randomUUID(); - } - const u8 = new Uint8Array(1); - const randomByte = crypto - ? () => crypto.getRandomValues(u8)[0]! - : () => (Math.random() * 0xff) & 0xff; - return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => - (+c ^ (randomByte() & (15 >> (+c / 4)))).toString(16), - ); +export let uuid4 = () => { + const { crypto } = globalThis as any; + if (crypto?.randomUUID) { + uuid4 = crypto.randomUUID.bind(crypto); + return crypto.randomUUID(); + } + const u8 = new Uint8Array(1); + const randomByte = crypto + ? () => crypto.getRandomValues(u8)[0]! + : () => (Math.random() * 0xff) & 0xff; + return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => + (+c ^ (randomByte() & (15 >> (+c / 4)))).toString(16), + ); }; diff --git a/packages/google-calendar/src/internal/utils/values.ts b/packages/google-calendar/src/internal/utils/values.ts index d728f3ee..0e99c128 100644 --- a/packages/google-calendar/src/internal/utils/values.ts +++ b/packages/google-calendar/src/internal/utils/values.ts @@ -6,106 +6,96 @@ import { GoogleCalendarError } from "../../core/error"; const startsWithSchemeRegexp = /^[a-z][a-z0-9+.-]*:/i; export const isAbsoluteURL = (url: string): boolean => { - return startsWithSchemeRegexp.test(url); + return startsWithSchemeRegexp.test(url); }; /** Returns an object if the given value isn't an object, otherwise returns as-is */ export function maybeObj(x: unknown): object { - if (typeof x !== "object") { - return {}; - } + if (typeof x !== "object") { + return {}; + } - return x ?? {}; + return x ?? {}; } // https://stackoverflow.com/a/34491287 export function isEmptyObj(obj: Object | null | undefined): boolean { - if (!obj) return true; - for (const _k in obj) return false; - return true; + if (!obj) return true; + for (const _k in obj) return false; + return true; } -// https://eslint.org/docs/latest/rules/no-prototype-builtins -export function hasOwn( - obj: T, - key: PropertyKey, -): key is keyof T { - return Object.prototype.hasOwnProperty.call(obj, key); +export function hasOwn(obj: T, key: PropertyKey): key is keyof T { + return Object.prototype.hasOwnProperty.call(obj, key); } export function isObj(obj: unknown): obj is Record { - return obj != null && typeof obj === "object" && !Array.isArray(obj); + return obj != null && typeof obj === "object" && !Array.isArray(obj); } export const ensurePresent = (value: T | null | undefined): T => { - if (value == null) { - throw new GoogleCalendarError( - `Expected a value to be given but received ${value} instead.`, - ); - } + if (value == null) { + throw new GoogleCalendarError(`Expected a value to be given but received ${value} instead.`); + } - return value; + return value; }; export const validatePositiveInteger = (name: string, n: unknown): number => { - if (typeof n !== "number" || !Number.isInteger(n)) { - throw new GoogleCalendarError(`${name} must be an integer`); - } - if (n < 0) { - throw new GoogleCalendarError(`${name} must be a positive integer`); - } - return n; + if (typeof n !== "number" || !Number.isInteger(n)) { + throw new GoogleCalendarError(`${name} must be an integer`); + } + if (n < 0) { + throw new GoogleCalendarError(`${name} must be a positive integer`); + } + return n; }; export const coerceInteger = (value: unknown): number => { - if (typeof value === "number") return Math.round(value); - if (typeof value === "string") return parseInt(value, 10); + if (typeof value === "number") return Math.round(value); + if (typeof value === "string") return Number.parseInt(value, 10); - throw new GoogleCalendarError( - `Could not coerce ${value} (type: ${typeof value}) into a number`, - ); + throw new GoogleCalendarError(`Could not coerce ${value} (type: ${typeof value}) into a number`); }; export const coerceFloat = (value: unknown): number => { - if (typeof value === "number") return value; - if (typeof value === "string") return parseFloat(value); + if (typeof value === "number") return value; + if (typeof value === "string") return Number.parseFloat(value); - throw new GoogleCalendarError( - `Could not coerce ${value} (type: ${typeof value}) into a number`, - ); + throw new GoogleCalendarError(`Could not coerce ${value} (type: ${typeof value}) into a number`); }; export const coerceBoolean = (value: unknown): boolean => { - if (typeof value === "boolean") return value; - if (typeof value === "string") return value === "true"; - return Boolean(value); + if (typeof value === "boolean") return value; + if (typeof value === "string") return value === "true"; + return Boolean(value); }; export const maybeCoerceInteger = (value: unknown): number | undefined => { - if (value === undefined) { - return undefined; - } - return coerceInteger(value); + if (value === undefined) { + return undefined; + } + return coerceInteger(value); }; export const maybeCoerceFloat = (value: unknown): number | undefined => { - if (value === undefined) { - return undefined; - } - return coerceFloat(value); + if (value === undefined) { + return undefined; + } + return coerceFloat(value); }; export const maybeCoerceBoolean = (value: unknown): boolean | undefined => { - if (value === undefined) { - return undefined; - } - return coerceBoolean(value); + if (value === undefined) { + return undefined; + } + return coerceBoolean(value); }; export const safeJSON = (text: string) => { - try { - return JSON.parse(text); - } catch (err) { - return undefined; - } + try { + return JSON.parse(text); + } catch (err) { + return undefined; + } }; diff --git a/packages/google-calendar/src/resources/calendars/acl.ts b/packages/google-calendar/src/resources/calendars/acl.ts index c49ae68b..e7c880f2 100644 --- a/packages/google-calendar/src/resources/calendars/acl.ts +++ b/packages/google-calendar/src/resources/calendars/acl.ts @@ -1,786 +1,773 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { APIResource } from "../../core/resource"; -import * as Shared from "../shared"; -import { APIPromise } from "../../core/api-promise"; +import type * as Shared from "../shared"; +import type { APIPromise } from "../../core/api-promise"; import { buildHeaders } from "../../internal/headers"; -import { RequestOptions } from "../../internal/request-options"; +import type { RequestOptions } from "../../internal/request-options"; import { path } from "../../internal/utils/path"; export class ACL extends APIResource { - /** - * Creates an access control rule. - */ - create( - calendarID: string, - params: ACLCreateParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - userIp, - ...body - } = params ?? {}; - return this._client.post(path`/calendars/${calendarID}/acl`, { - query: { - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - userIp, - }, - body, - ...options, - }); - } - - /** - * Returns the rules in the access control list for the calendar. - */ - retrieve( - calendarID: string, - query: ACLRetrieveParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - return this._client.get(path`/calendars/${calendarID}/acl`, { - query, - ...options, - }); - } - - /** - * Deletes an access control rule. - */ - delete( - ruleID: string, - params: ACLDeleteParams, - options?: RequestOptions, - ): APIPromise { - const { - calendarId, - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - userIp, - } = params; - return this._client.delete(path`/calendars/${calendarId}/acl/${ruleID}`, { - query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, - ...options, - headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), - }); - } - - /** - * Returns an access control rule. - */ - retrieveRule( - ruleID: string, - params: ACLRetrieveRuleParams, - options?: RequestOptions, - ): APIPromise { - const { calendarId, ...query } = params; - return this._client.get(path`/calendars/${calendarId}/acl/${ruleID}`, { - query, - ...options, - }); - } - - /** - * Updates an access control rule. - */ - updateRule( - ruleID: string, - params: ACLUpdateRuleParams, - options?: RequestOptions, - ): APIPromise { - const { - calendarId, - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - userIp, - ...body - } = params; - return this._client.put(path`/calendars/${calendarId}/acl/${ruleID}`, { - query: { - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - userIp, - }, - body, - ...options, - }); - } - - /** - * Watch for changes to ACL resources. - */ - watch( - calendarID: string, - params: ACLWatchParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - fields, - key, - maxResults, - oauth_token, - pageToken, - prettyPrint, - quotaUser, - showDeleted, - syncToken, - userIp, - ...body - } = params ?? {}; - return this._client.post(path`/calendars/${calendarID}/acl/watch`, { - query: { - alt, - fields, - key, - maxResults, - oauth_token, - pageToken, - prettyPrint, - quotaUser, - showDeleted, - syncToken, - userIp, - }, - body, - ...options, - }); - } + /** + * Creates an access control rule. + */ + create( + calendarID: string, + params: ACLCreateParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { + alt, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + userIp, + ...body + } = params ?? {}; + return this._client.post(path`/calendars/${calendarID}/acl`, { + query: { + alt, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + userIp, + }, + body, + ...options, + }); + } + + /** + * Returns the rules in the access control list for the calendar. + */ + retrieve( + calendarID: string, + query: ACLRetrieveParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + return this._client.get(path`/calendars/${calendarID}/acl`, { + query, + ...options, + }); + } + + /** + * Deletes an access control rule. + */ + delete(ruleID: string, params: ACLDeleteParams, options?: RequestOptions): APIPromise { + const { calendarId, alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp } = params; + return this._client.delete(path`/calendars/${calendarId}/acl/${ruleID}`, { + query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, + ...options, + headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), + }); + } + + /** + * Returns an access control rule. + */ + retrieveRule( + ruleID: string, + params: ACLRetrieveRuleParams, + options?: RequestOptions, + ): APIPromise { + const { calendarId, ...query } = params; + return this._client.get(path`/calendars/${calendarId}/acl/${ruleID}`, { + query, + ...options, + }); + } + + /** + * Updates an access control rule. + */ + updateRule( + ruleID: string, + params: ACLUpdateRuleParams, + options?: RequestOptions, + ): APIPromise { + const { + calendarId, + alt, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + userIp, + ...body + } = params; + return this._client.put(path`/calendars/${calendarId}/acl/${ruleID}`, { + query: { + alt, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + userIp, + }, + body, + ...options, + }); + } + + /** + * Watch for changes to ACL resources. + */ + watch( + calendarID: string, + params: ACLWatchParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { + alt, + fields, + key, + maxResults, + oauth_token, + pageToken, + prettyPrint, + quotaUser, + showDeleted, + syncToken, + userIp, + ...body + } = params ?? {}; + return this._client.post(path`/calendars/${calendarID}/acl/watch`, { + query: { + alt, + fields, + key, + maxResults, + oauth_token, + pageToken, + prettyPrint, + quotaUser, + showDeleted, + syncToken, + userIp, + }, + body, + ...options, + }); + } } export interface ACLRule { - /** - * Identifier of the Access Control List (ACL) rule. See Sharing calendars. - */ - id?: string; - - /** - * ETag of the resource. - */ - etag?: string; - - /** - * Type of the resource ("calendar#aclRule"). - */ - kind?: string; - - /** - * The role assigned to the scope. Possible values are: - * - * - "none" - Provides no access. - * - "freeBusyReader" - Provides read access to free/busy information. - * - "reader" - Provides read access to the calendar. Private events will appear to - * users with reader access, but event details will be hidden. - * - "writer" - Provides read and write access to the calendar. Private events will - * appear to users with writer access, and event details will be visible. - * - "owner" - Provides ownership of the calendar. This role has all of the - * permissions of the writer role with the additional ability to see and - * manipulate ACLs. - */ - role?: string; - - /** - * The extent to which calendar access is granted by this ACL rule. - */ - scope?: ACLRule.Scope; + /** + * Identifier of the Access Control List (ACL) rule. See Sharing calendars. + */ + id?: string; + + /** + * ETag of the resource. + */ + etag?: string; + + /** + * Type of the resource ("calendar#aclRule"). + */ + kind?: string; + + /** + * The role assigned to the scope. Possible values are: + * + * - "none" - Provides no access. + * - "freeBusyReader" - Provides read access to free/busy information. + * - "reader" - Provides read access to the calendar. Private events will appear to + * users with reader access, but event details will be hidden. + * - "writer" - Provides read and write access to the calendar. Private events will + * appear to users with writer access, and event details will be visible. + * - "owner" - Provides ownership of the calendar. This role has all of the + * permissions of the writer role with the additional ability to see and + * manipulate ACLs. + */ + role?: string; + + /** + * The extent to which calendar access is granted by this ACL rule. + */ + scope?: ACLRule.Scope; } export namespace ACLRule { - /** - * The extent to which calendar access is granted by this ACL rule. - */ - export interface Scope { - /** - * The type of the scope. Possible values are: - * - * - "default" - The public scope. This is the default value. - * - "user" - Limits the scope to a single user. - * - "group" - Limits the scope to a group. - * - "domain" - Limits the scope to a domain. Note: The permissions granted to the - * "default", or public, scope apply to any user, authenticated or not. - */ - type?: string; - - /** - * The email address of a user or group, or the name of a domain, depending on the - * scope type. Omitted for type "default". - */ - value?: string; - } + /** + * The extent to which calendar access is granted by this ACL rule. + */ + export interface Scope { + /** + * The type of the scope. Possible values are: + * + * - "default" - The public scope. This is the default value. + * - "user" - Limits the scope to a single user. + * - "group" - Limits the scope to a group. + * - "domain" - Limits the scope to a domain. Note: The permissions granted to the + * "default", or public, scope apply to any user, authenticated or not. + */ + type?: string; + + /** + * The email address of a user or group, or the name of a domain, depending on the + * scope type. Omitted for type "default". + */ + value?: string; + } } export interface ACLRetrieveResponse { - /** - * ETag of the collection. - */ - etag?: string; - - /** - * List of rules on the access control list. - */ - items?: Array; - - /** - * Type of the collection ("calendar#acl"). - */ - kind?: string; - - /** - * Token used to access the next page of this result. Omitted if no further results - * are available, in which case nextSyncToken is provided. - */ - nextPageToken?: string; - - /** - * Token used at a later point in time to retrieve only the entries that have - * changed since this result was returned. Omitted if further results are - * available, in which case nextPageToken is provided. - */ - nextSyncToken?: string; + /** + * ETag of the collection. + */ + etag?: string; + + /** + * List of rules on the access control list. + */ + items?: Array; + + /** + * Type of the collection ("calendar#acl"). + */ + kind?: string; + + /** + * Token used to access the next page of this result. Omitted if no further results + * are available, in which case nextSyncToken is provided. + */ + nextPageToken?: string; + + /** + * Token used at a later point in time to retrieve only the entries that have + * changed since this result was returned. Omitted if further results are + * available, in which case nextPageToken is provided. + */ + nextSyncToken?: string; } export interface ACLCreateParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Whether to send notifications about the calendar sharing change. - * Optional. The default is True. - */ - sendNotifications?: boolean; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: Identifier of the Access Control List (ACL) rule. See Sharing - * calendars. - */ - id?: string; - - /** - * Body param: ETag of the resource. - */ - etag?: string; - - /** - * Body param: Type of the resource ("calendar#aclRule"). - */ - kind?: string; - - /** - * Body param: The role assigned to the scope. Possible values are: - * - * - "none" - Provides no access. - * - "freeBusyReader" - Provides read access to free/busy information. - * - "reader" - Provides read access to the calendar. Private events will appear to - * users with reader access, but event details will be hidden. - * - "writer" - Provides read and write access to the calendar. Private events will - * appear to users with writer access, and event details will be visible. - * - "owner" - Provides ownership of the calendar. This role has all of the - * permissions of the writer role with the additional ability to see and - * manipulate ACLs. - */ - role?: string; - - /** - * Body param: The extent to which calendar access is granted by this ACL rule. - */ - scope?: ACLCreateParams.Scope; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Whether to send notifications about the calendar sharing change. + * Optional. The default is True. + */ + sendNotifications?: boolean; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: Identifier of the Access Control List (ACL) rule. See Sharing + * calendars. + */ + id?: string; + + /** + * Body param: ETag of the resource. + */ + etag?: string; + + /** + * Body param: Type of the resource ("calendar#aclRule"). + */ + kind?: string; + + /** + * Body param: The role assigned to the scope. Possible values are: + * + * - "none" - Provides no access. + * - "freeBusyReader" - Provides read access to free/busy information. + * - "reader" - Provides read access to the calendar. Private events will appear to + * users with reader access, but event details will be hidden. + * - "writer" - Provides read and write access to the calendar. Private events will + * appear to users with writer access, and event details will be visible. + * - "owner" - Provides ownership of the calendar. This role has all of the + * permissions of the writer role with the additional ability to see and + * manipulate ACLs. + */ + role?: string; + + /** + * Body param: The extent to which calendar access is granted by this ACL rule. + */ + scope?: ACLCreateParams.Scope; } export namespace ACLCreateParams { - /** - * The extent to which calendar access is granted by this ACL rule. - */ - export interface Scope { - /** - * The type of the scope. Possible values are: - * - * - "default" - The public scope. This is the default value. - * - "user" - Limits the scope to a single user. - * - "group" - Limits the scope to a group. - * - "domain" - Limits the scope to a domain. Note: The permissions granted to the - * "default", or public, scope apply to any user, authenticated or not. - */ - type?: string; - - /** - * The email address of a user or group, or the name of a domain, depending on the - * scope type. Omitted for type "default". - */ - value?: string; - } + /** + * The extent to which calendar access is granted by this ACL rule. + */ + export interface Scope { + /** + * The type of the scope. Possible values are: + * + * - "default" - The public scope. This is the default value. + * - "user" - Limits the scope to a single user. + * - "group" - Limits the scope to a group. + * - "domain" - Limits the scope to a domain. Note: The permissions granted to the + * "default", or public, scope apply to any user, authenticated or not. + */ + type?: string; + + /** + * The email address of a user or group, or the name of a domain, depending on the + * scope type. Omitted for type "default". + */ + value?: string; + } } export interface ACLRetrieveParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Maximum number of entries returned on one result page. By default the value is - * 100 entries. The page size can never be larger than 250 entries. Optional. - */ - maxResults?: number; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Token specifying which result page to return. Optional. - */ - pageToken?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Whether to include deleted ACLs in the result. Deleted ACLs are represented by - * role equal to "none". Deleted ACLs will always be included if syncToken is - * provided. Optional. The default is False. - */ - showDeleted?: boolean; - - /** - * Token obtained from the nextSyncToken field returned on the last page of results - * from the previous list request. It makes the result of this list request contain - * only entries that have changed since then. All entries deleted since the - * previous list request will always be in the result set and it is not allowed to - * set showDeleted to False. If the syncToken expires, the server will respond with - * a 410 GONE response code and the client should clear its storage and perform a - * full synchronization without any syncToken. Learn more about incremental - * synchronization. Optional. The default is to return all entries. - */ - syncToken?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Maximum number of entries returned on one result page. By default the value is + * 100 entries. The page size can never be larger than 250 entries. Optional. + */ + maxResults?: number; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Token specifying which result page to return. Optional. + */ + pageToken?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Whether to include deleted ACLs in the result. Deleted ACLs are represented by + * role equal to "none". Deleted ACLs will always be included if syncToken is + * provided. Optional. The default is False. + */ + showDeleted?: boolean; + + /** + * Token obtained from the nextSyncToken field returned on the last page of results + * from the previous list request. It makes the result of this list request contain + * only entries that have changed since then. All entries deleted since the + * previous list request will always be in the result set and it is not allowed to + * set showDeleted to False. If the syncToken expires, the server will respond with + * a 410 GONE response code and the client should clear its storage and perform a + * full synchronization without any syncToken. Learn more about incremental + * synchronization. Optional. The default is to return all entries. + */ + syncToken?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface ACLDeleteParams { - /** - * Path param: Calendar identifier. To retrieve calendar IDs call the - * calendarList.list method. If you want to access the primary calendar of the - * currently logged in user, use the "primary" keyword. - */ - calendarId: string; - - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Path param: Calendar identifier. To retrieve calendar IDs call the + * calendarList.list method. If you want to access the primary calendar of the + * currently logged in user, use the "primary" keyword. + */ + calendarId: string; + + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface ACLRetrieveRuleParams { - /** - * Path param: Calendar identifier. To retrieve calendar IDs call the - * calendarList.list method. If you want to access the primary calendar of the - * currently logged in user, use the "primary" keyword. - */ - calendarId: string; - - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Path param: Calendar identifier. To retrieve calendar IDs call the + * calendarList.list method. If you want to access the primary calendar of the + * currently logged in user, use the "primary" keyword. + */ + calendarId: string; + + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface ACLUpdateRuleParams { - /** - * Path param: Calendar identifier. To retrieve calendar IDs call the - * calendarList.list method. If you want to access the primary calendar of the - * currently logged in user, use the "primary" keyword. - */ - calendarId: string; - - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Whether to send notifications about the calendar sharing change. - * Note that there are no notifications on access removal. Optional. The default is - * True. - */ - sendNotifications?: boolean; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: Identifier of the Access Control List (ACL) rule. See Sharing - * calendars. - */ - id?: string; - - /** - * Body param: ETag of the resource. - */ - etag?: string; - - /** - * Body param: Type of the resource ("calendar#aclRule"). - */ - kind?: string; - - /** - * Body param: The role assigned to the scope. Possible values are: - * - * - "none" - Provides no access. - * - "freeBusyReader" - Provides read access to free/busy information. - * - "reader" - Provides read access to the calendar. Private events will appear to - * users with reader access, but event details will be hidden. - * - "writer" - Provides read and write access to the calendar. Private events will - * appear to users with writer access, and event details will be visible. - * - "owner" - Provides ownership of the calendar. This role has all of the - * permissions of the writer role with the additional ability to see and - * manipulate ACLs. - */ - role?: string; - - /** - * Body param: The extent to which calendar access is granted by this ACL rule. - */ - scope?: ACLUpdateRuleParams.Scope; + /** + * Path param: Calendar identifier. To retrieve calendar IDs call the + * calendarList.list method. If you want to access the primary calendar of the + * currently logged in user, use the "primary" keyword. + */ + calendarId: string; + + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Whether to send notifications about the calendar sharing change. + * Note that there are no notifications on access removal. Optional. The default is + * True. + */ + sendNotifications?: boolean; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: Identifier of the Access Control List (ACL) rule. See Sharing + * calendars. + */ + id?: string; + + /** + * Body param: ETag of the resource. + */ + etag?: string; + + /** + * Body param: Type of the resource ("calendar#aclRule"). + */ + kind?: string; + + /** + * Body param: The role assigned to the scope. Possible values are: + * + * - "none" - Provides no access. + * - "freeBusyReader" - Provides read access to free/busy information. + * - "reader" - Provides read access to the calendar. Private events will appear to + * users with reader access, but event details will be hidden. + * - "writer" - Provides read and write access to the calendar. Private events will + * appear to users with writer access, and event details will be visible. + * - "owner" - Provides ownership of the calendar. This role has all of the + * permissions of the writer role with the additional ability to see and + * manipulate ACLs. + */ + role?: string; + + /** + * Body param: The extent to which calendar access is granted by this ACL rule. + */ + scope?: ACLUpdateRuleParams.Scope; } export namespace ACLUpdateRuleParams { - /** - * The extent to which calendar access is granted by this ACL rule. - */ - export interface Scope { - /** - * The type of the scope. Possible values are: - * - * - "default" - The public scope. This is the default value. - * - "user" - Limits the scope to a single user. - * - "group" - Limits the scope to a group. - * - "domain" - Limits the scope to a domain. Note: The permissions granted to the - * "default", or public, scope apply to any user, authenticated or not. - */ - type?: string; - - /** - * The email address of a user or group, or the name of a domain, depending on the - * scope type. Omitted for type "default". - */ - value?: string; - } + /** + * The extent to which calendar access is granted by this ACL rule. + */ + export interface Scope { + /** + * The type of the scope. Possible values are: + * + * - "default" - The public scope. This is the default value. + * - "user" - Limits the scope to a single user. + * - "group" - Limits the scope to a group. + * - "domain" - Limits the scope to a domain. Note: The permissions granted to the + * "default", or public, scope apply to any user, authenticated or not. + */ + type?: string; + + /** + * The email address of a user or group, or the name of a domain, depending on the + * scope type. Omitted for type "default". + */ + value?: string; + } } export interface ACLWatchParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: Maximum number of entries returned on one result page. By default - * the value is 100 entries. The page size can never be larger than 250 entries. - * Optional. - */ - maxResults?: number; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Token specifying which result page to return. Optional. - */ - pageToken?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Whether to include deleted ACLs in the result. Deleted ACLs are - * represented by role equal to "none". Deleted ACLs will always be included if - * syncToken is provided. Optional. The default is False. - */ - showDeleted?: boolean; - - /** - * Query param: Token obtained from the nextSyncToken field returned on the last - * page of results from the previous list request. It makes the result of this list - * request contain only entries that have changed since then. All entries deleted - * since the previous list request will always be in the result set and it is not - * allowed to set showDeleted to False. If the syncToken expires, the server will - * respond with a 410 GONE response code and the client should clear its storage - * and perform a full synchronization without any syncToken. Learn more about - * incremental synchronization. Optional. The default is to return all entries. - */ - syncToken?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: A UUID or similar unique string that identifies this channel. - */ - id?: string; - - /** - * Body param: An arbitrary string delivered to the target address with each - * notification delivered over this channel. Optional. - */ - token?: string; - - /** - * Body param: The address where notifications are delivered for this channel. - */ - address?: string; - - /** - * Body param: Date and time of notification channel expiration, expressed as a - * Unix timestamp, in milliseconds. Optional. - */ - expiration?: string; - - /** - * Body param: Identifies this as a notification channel used to watch for changes - * to a resource, which is "api#channel". - */ - kind?: string; - - /** - * Body param: Additional parameters controlling delivery channel behavior. - * Optional. - */ - params?: Record; - - /** - * Body param: A Boolean value to indicate whether payload is wanted. Optional. - */ - payload?: boolean; - - /** - * Body param: An opaque ID that identifies the resource being watched on this - * channel. Stable across different API versions. - */ - resourceId?: string; - - /** - * Body param: A version-specific identifier for the watched resource. - */ - resourceUri?: string; - - /** - * Body param: The type of delivery mechanism used for this channel. Valid values - * are "web_hook" (or "webhook"). Both values refer to a channel where Http - * requests are used to deliver messages. - */ - type?: string; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: Maximum number of entries returned on one result page. By default + * the value is 100 entries. The page size can never be larger than 250 entries. + * Optional. + */ + maxResults?: number; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Token specifying which result page to return. Optional. + */ + pageToken?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Whether to include deleted ACLs in the result. Deleted ACLs are + * represented by role equal to "none". Deleted ACLs will always be included if + * syncToken is provided. Optional. The default is False. + */ + showDeleted?: boolean; + + /** + * Query param: Token obtained from the nextSyncToken field returned on the last + * page of results from the previous list request. It makes the result of this list + * request contain only entries that have changed since then. All entries deleted + * since the previous list request will always be in the result set and it is not + * allowed to set showDeleted to False. If the syncToken expires, the server will + * respond with a 410 GONE response code and the client should clear its storage + * and perform a full synchronization without any syncToken. Learn more about + * incremental synchronization. Optional. The default is to return all entries. + */ + syncToken?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: A UUID or similar unique string that identifies this channel. + */ + id?: string; + + /** + * Body param: An arbitrary string delivered to the target address with each + * notification delivered over this channel. Optional. + */ + token?: string; + + /** + * Body param: The address where notifications are delivered for this channel. + */ + address?: string; + + /** + * Body param: Date and time of notification channel expiration, expressed as a + * Unix timestamp, in milliseconds. Optional. + */ + expiration?: string; + + /** + * Body param: Identifies this as a notification channel used to watch for changes + * to a resource, which is "api#channel". + */ + kind?: string; + + /** + * Body param: Additional parameters controlling delivery channel behavior. + * Optional. + */ + params?: Record; + + /** + * Body param: A Boolean value to indicate whether payload is wanted. Optional. + */ + payload?: boolean; + + /** + * Body param: An opaque ID that identifies the resource being watched on this + * channel. Stable across different API versions. + */ + resourceId?: string; + + /** + * Body param: A version-specific identifier for the watched resource. + */ + resourceUri?: string; + + /** + * Body param: The type of delivery mechanism used for this channel. Valid values + * are "web_hook" (or "webhook"). Both values refer to a channel where Http + * requests are used to deliver messages. + */ + type?: string; } export declare namespace ACL { - export { - type ACLRule as ACLRule, - type ACLRetrieveResponse as ACLRetrieveResponse, - type ACLCreateParams as ACLCreateParams, - type ACLRetrieveParams as ACLRetrieveParams, - type ACLDeleteParams as ACLDeleteParams, - type ACLRetrieveRuleParams as ACLRetrieveRuleParams, - type ACLUpdateRuleParams as ACLUpdateRuleParams, - type ACLWatchParams as ACLWatchParams, - }; + export { + ACLRule, + type ACLRetrieveResponse, + ACLCreateParams, + type ACLRetrieveParams, + type ACLDeleteParams, + type ACLRetrieveRuleParams, + type ACLUpdateRuleParams, + type ACLWatchParams, + }; } diff --git a/packages/google-calendar/src/resources/calendars/calendars.ts b/packages/google-calendar/src/resources/calendars/calendars.ts index f39f75a5..7cebc1b0 100644 --- a/packages/google-calendar/src/resources/calendars/calendars.ts +++ b/packages/google-calendar/src/resources/calendars/calendars.ts @@ -3,555 +3,535 @@ import { APIResource } from "../../core/resource"; import * as ACLAPI from "./acl"; import { - ACL, - ACLCreateParams, - ACLDeleteParams, - ACLRetrieveParams, - ACLRetrieveResponse, - ACLRetrieveRuleParams, - ACLRule, - ACLUpdateRuleParams, - ACLWatchParams, + ACL, + ACLCreateParams, + ACLDeleteParams, + ACLRetrieveParams, + ACLRetrieveResponse, + ACLRetrieveRuleParams, + ACLRule, + ACLUpdateRuleParams, + ACLWatchParams, } from "./acl"; import * as EventsAPI from "./events"; import { - Event, - EventCreateParams, - EventDeleteParams, - EventImportParams, - EventInstancesParams, - EventListParams, - EventMoveParams, - EventQuickAddParams, - EventRetrieveParams, - EventUpdateParams, - EventWatchParams, - Events, + Event, + EventCreateParams, + EventDeleteParams, + EventImportParams, + EventInstancesParams, + EventListParams, + EventMoveParams, + EventQuickAddParams, + EventRetrieveParams, + EventUpdateParams, + EventWatchParams, + Events, } from "./events"; -import { APIPromise } from "../../core/api-promise"; +import type { APIPromise } from "../../core/api-promise"; import { buildHeaders } from "../../internal/headers"; -import { RequestOptions } from "../../internal/request-options"; +import type { RequestOptions } from "../../internal/request-options"; import { path } from "../../internal/utils/path"; export class Calendars extends APIResource { - acl: ACLAPI.ACL = new ACLAPI.ACL(this._client); - events: EventsAPI.Events = new EventsAPI.Events(this._client); - - /** - * Creates a secondary calendar. - */ - create( - params: CalendarCreateParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - userIp, - ...body - } = params ?? {}; - return this._client.post("/calendars", { - query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, - body, - ...options, - }); - } - - /** - * Returns metadata for a calendar. - */ - retrieve( - calendarID: string, - query: CalendarRetrieveParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - return this._client.get(path`/calendars/${calendarID}`, { - query, - ...options, - }); - } - - /** - * Updates metadata for a calendar. - */ - update( - calendarID: string, - params: CalendarUpdateParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - userIp, - ...body - } = params ?? {}; - return this._client.put(path`/calendars/${calendarID}`, { - query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, - body, - ...options, - }); - } - - /** - * Deletes a secondary calendar. Use calendars.clear for clearing all events on - * primary calendars. - */ - delete( - calendarID: string, - params: CalendarDeleteParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp } = - params ?? {}; - return this._client.delete(path`/calendars/${calendarID}`, { - query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, - ...options, - headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), - }); - } - - /** - * Clears a primary calendar. This operation deletes all events associated with the - * primary calendar of an account. - */ - clear( - calendarID: string, - params: CalendarClearParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp } = - params ?? {}; - return this._client.post(path`/calendars/${calendarID}/clear`, { - query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, - ...options, - headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), - }); - } + acl: ACLAPI.ACL = new ACLAPI.ACL(this._client); + events: EventsAPI.Events = new EventsAPI.Events(this._client); + + /** + * Creates a secondary calendar. + */ + create( + params: CalendarCreateParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp, ...body } = params ?? {}; + return this._client.post("/calendars", { + query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, + body, + ...options, + }); + } + + /** + * Returns metadata for a calendar. + */ + retrieve( + calendarID: string, + query: CalendarRetrieveParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + return this._client.get(path`/calendars/${calendarID}`, { + query, + ...options, + }); + } + + /** + * Updates metadata for a calendar. + */ + update( + calendarID: string, + params: CalendarUpdateParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp, ...body } = params ?? {}; + return this._client.put(path`/calendars/${calendarID}`, { + query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, + body, + ...options, + }); + } + + /** + * Deletes a secondary calendar. Use calendars.clear for clearing all events on + * primary calendars. + */ + delete( + calendarID: string, + params: CalendarDeleteParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp } = params ?? {}; + return this._client.delete(path`/calendars/${calendarID}`, { + query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, + ...options, + headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), + }); + } + + /** + * Clears a primary calendar. This operation deletes all events associated with the + * primary calendar of an account. + */ + clear( + calendarID: string, + params: CalendarClearParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp } = params ?? {}; + return this._client.post(path`/calendars/${calendarID}/clear`, { + query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, + ...options, + headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), + }); + } } export interface Calendar { - /** - * Identifier of the calendar. To retrieve IDs call the calendarList.list() method. - */ - id?: string; - - /** - * Conferencing properties for this calendar, for example what types of conferences - * are allowed. - */ - conferenceProperties?: Calendar.ConferenceProperties; - - /** - * Description of the calendar. Optional. - */ - description?: string; - - /** - * ETag of the resource. - */ - etag?: string; - - /** - * Type of the resource ("calendar#calendar"). - */ - kind?: string; - - /** - * Geographic location of the calendar as free-form text. Optional. - */ - location?: string; - - /** - * Title of the calendar. - */ - summary?: string; - - /** - * The time zone of the calendar. (Formatted as an IANA Time Zone Database name, - * e.g. "Europe/Zurich".) Optional. - */ - timeZone?: string; + /** + * Identifier of the calendar. To retrieve IDs call the calendarList.list() method. + */ + id?: string; + + /** + * Conferencing properties for this calendar, for example what types of conferences + * are allowed. + */ + conferenceProperties?: Calendar.ConferenceProperties; + + /** + * Description of the calendar. Optional. + */ + description?: string; + + /** + * ETag of the resource. + */ + etag?: string; + + /** + * Type of the resource ("calendar#calendar"). + */ + kind?: string; + + /** + * Geographic location of the calendar as free-form text. Optional. + */ + location?: string; + + /** + * Title of the calendar. + */ + summary?: string; + + /** + * The time zone of the calendar. (Formatted as an IANA Time Zone Database name, + * e.g. "Europe/Zurich".) Optional. + */ + timeZone?: string; } export namespace Calendar { - /** - * Conferencing properties for this calendar, for example what types of conferences - * are allowed. - */ - export interface ConferenceProperties { - /** - * The types of conference solutions that are supported for this calendar. The - * possible values are: - * - * - "eventHangout" - * - "eventNamedHangout" - * - "hangoutsMeet" Optional. - */ - allowedConferenceSolutionTypes?: Array; - } + /** + * Conferencing properties for this calendar, for example what types of conferences + * are allowed. + */ + export interface ConferenceProperties { + /** + * The types of conference solutions that are supported for this calendar. The + * possible values are: + * + * - "eventHangout" + * - "eventNamedHangout" + * - "hangoutsMeet" Optional. + */ + allowedConferenceSolutionTypes?: Array; + } } export interface CalendarCreateParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: Identifier of the calendar. To retrieve IDs call the - * calendarList.list() method. - */ - id?: string; - - /** - * Body param: Conferencing properties for this calendar, for example what types of - * conferences are allowed. - */ - conferenceProperties?: CalendarCreateParams.ConferenceProperties; - - /** - * Body param: Description of the calendar. Optional. - */ - description?: string; - - /** - * Body param: ETag of the resource. - */ - etag?: string; - - /** - * Body param: Type of the resource ("calendar#calendar"). - */ - kind?: string; - - /** - * Body param: Geographic location of the calendar as free-form text. Optional. - */ - location?: string; - - /** - * Body param: Title of the calendar. - */ - summary?: string; - - /** - * Body param: The time zone of the calendar. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) Optional. - */ - timeZone?: string; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: Identifier of the calendar. To retrieve IDs call the + * calendarList.list() method. + */ + id?: string; + + /** + * Body param: Conferencing properties for this calendar, for example what types of + * conferences are allowed. + */ + conferenceProperties?: CalendarCreateParams.ConferenceProperties; + + /** + * Body param: Description of the calendar. Optional. + */ + description?: string; + + /** + * Body param: ETag of the resource. + */ + etag?: string; + + /** + * Body param: Type of the resource ("calendar#calendar"). + */ + kind?: string; + + /** + * Body param: Geographic location of the calendar as free-form text. Optional. + */ + location?: string; + + /** + * Body param: Title of the calendar. + */ + summary?: string; + + /** + * Body param: The time zone of the calendar. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) Optional. + */ + timeZone?: string; } export namespace CalendarCreateParams { - /** - * Conferencing properties for this calendar, for example what types of conferences - * are allowed. - */ - export interface ConferenceProperties { - /** - * The types of conference solutions that are supported for this calendar. The - * possible values are: - * - * - "eventHangout" - * - "eventNamedHangout" - * - "hangoutsMeet" Optional. - */ - allowedConferenceSolutionTypes?: Array; - } + /** + * Conferencing properties for this calendar, for example what types of conferences + * are allowed. + */ + export interface ConferenceProperties { + /** + * The types of conference solutions that are supported for this calendar. The + * possible values are: + * + * - "eventHangout" + * - "eventNamedHangout" + * - "hangoutsMeet" Optional. + */ + allowedConferenceSolutionTypes?: Array; + } } export interface CalendarRetrieveParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface CalendarUpdateParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: Identifier of the calendar. To retrieve IDs call the - * calendarList.list() method. - */ - id?: string; - - /** - * Body param: Conferencing properties for this calendar, for example what types of - * conferences are allowed. - */ - conferenceProperties?: CalendarUpdateParams.ConferenceProperties; - - /** - * Body param: Description of the calendar. Optional. - */ - description?: string; - - /** - * Body param: ETag of the resource. - */ - etag?: string; - - /** - * Body param: Type of the resource ("calendar#calendar"). - */ - kind?: string; - - /** - * Body param: Geographic location of the calendar as free-form text. Optional. - */ - location?: string; - - /** - * Body param: Title of the calendar. - */ - summary?: string; - - /** - * Body param: The time zone of the calendar. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) Optional. - */ - timeZone?: string; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: Identifier of the calendar. To retrieve IDs call the + * calendarList.list() method. + */ + id?: string; + + /** + * Body param: Conferencing properties for this calendar, for example what types of + * conferences are allowed. + */ + conferenceProperties?: CalendarUpdateParams.ConferenceProperties; + + /** + * Body param: Description of the calendar. Optional. + */ + description?: string; + + /** + * Body param: ETag of the resource. + */ + etag?: string; + + /** + * Body param: Type of the resource ("calendar#calendar"). + */ + kind?: string; + + /** + * Body param: Geographic location of the calendar as free-form text. Optional. + */ + location?: string; + + /** + * Body param: Title of the calendar. + */ + summary?: string; + + /** + * Body param: The time zone of the calendar. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) Optional. + */ + timeZone?: string; } export namespace CalendarUpdateParams { - /** - * Conferencing properties for this calendar, for example what types of conferences - * are allowed. - */ - export interface ConferenceProperties { - /** - * The types of conference solutions that are supported for this calendar. The - * possible values are: - * - * - "eventHangout" - * - "eventNamedHangout" - * - "hangoutsMeet" Optional. - */ - allowedConferenceSolutionTypes?: Array; - } + /** + * Conferencing properties for this calendar, for example what types of conferences + * are allowed. + */ + export interface ConferenceProperties { + /** + * The types of conference solutions that are supported for this calendar. The + * possible values are: + * + * - "eventHangout" + * - "eventNamedHangout" + * - "hangoutsMeet" Optional. + */ + allowedConferenceSolutionTypes?: Array; + } } export interface CalendarDeleteParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface CalendarClearParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } Calendars.ACL = ACL; export declare namespace Calendars { - export { - 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 { - ACL as ACL, - type ACLRule as ACLRule, - type ACLRetrieveResponse as ACLRetrieveResponse, - type ACLCreateParams as ACLCreateParams, - type ACLRetrieveParams as ACLRetrieveParams, - type ACLDeleteParams as ACLDeleteParams, - type ACLRetrieveRuleParams as ACLRetrieveRuleParams, - type ACLUpdateRuleParams as ACLUpdateRuleParams, - type ACLWatchParams as ACLWatchParams, - }; - - export { - type Events as Events, - type Event as Event, - type EventCreateParams as EventCreateParams, - type EventRetrieveParams as EventRetrieveParams, - type EventUpdateParams as EventUpdateParams, - type EventListParams as EventListParams, - type EventDeleteParams as EventDeleteParams, - type EventImportParams as EventImportParams, - type EventInstancesParams as EventInstancesParams, - type EventMoveParams as EventMoveParams, - type EventQuickAddParams as EventQuickAddParams, - type EventWatchParams as EventWatchParams, - }; + export { + Calendar, + type CalendarCreateParams, + type CalendarRetrieveParams, + CalendarUpdateParams, + type CalendarDeleteParams, + type CalendarClearParams, + }; + + export { + ACL, + ACLRule, + ACLRetrieveResponse, + ACLCreateParams, + ACLRetrieveParams, + ACLDeleteParams, + ACLRetrieveRuleParams, + ACLUpdateRuleParams, + ACLWatchParams, + }; + + export { + Events, + Event, + EventCreateParams, + EventRetrieveParams, + EventUpdateParams, + EventListParams, + EventDeleteParams, + EventImportParams, + EventInstancesParams, + EventMoveParams, + EventQuickAddParams, + EventWatchParams, + }; } diff --git a/packages/google-calendar/src/resources/calendars/events.ts b/packages/google-calendar/src/resources/calendars/events.ts index 3d6a0eb1..9900781a 100644 --- a/packages/google-calendar/src/resources/calendars/events.ts +++ b/packages/google-calendar/src/resources/calendars/events.ts @@ -1,5910 +1,5885 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { APIResource } from "../../core/resource"; -import * as Shared from "../shared"; -import { APIPromise } from "../../core/api-promise"; +import type * as Shared from "../shared"; +import type { APIPromise } from "../../core/api-promise"; import { buildHeaders } from "../../internal/headers"; -import { RequestOptions } from "../../internal/request-options"; +import type { RequestOptions } from "../../internal/request-options"; import { path } from "../../internal/utils/path"; export class Events extends APIResource { - /** - * Creates an event. - */ - create( - calendarID: string, - params: EventCreateParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - conferenceDataVersion, - fields, - key, - maxAttendees, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - sendUpdates, - supportsAttachments, - userIp, - ...body - } = params ?? {}; - return this._client.post(path`/calendars/${calendarID}/events`, { - query: { - alt, - conferenceDataVersion, - fields, - key, - maxAttendees, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - sendUpdates, - supportsAttachments, - userIp, - }, - body, - ...options, - }); - } - - /** - * Returns an event based on its Google Calendar ID. To retrieve an event using its - * iCalendar ID, call the events.list method using the iCalUID parameter. - */ - retrieve( - eventID: string, - params: EventRetrieveParams, - options?: RequestOptions, - ): APIPromise { - const { calendarId, ...query } = params; - return this._client.get(path`/calendars/${calendarId}/events/${eventID}`, { - query, - ...options, - }); - } - - /** - * Updates an event. - */ - update( - eventID: string, - params: EventUpdateParams, - options?: RequestOptions, - ): APIPromise { - const { - calendarId, - alt, - alwaysIncludeEmail, - conferenceDataVersion, - fields, - key, - maxAttendees, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - sendUpdates, - supportsAttachments, - userIp, - ...body - } = params; - return this._client.put(path`/calendars/${calendarId}/events/${eventID}`, { - query: { - alt, - alwaysIncludeEmail, - conferenceDataVersion, - fields, - key, - maxAttendees, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - sendUpdates, - supportsAttachments, - userIp, - }, - body, - ...options, - }); - } - - /** - * Returns events on the specified calendar. - */ - list( - calendarID: string, - query: EventListParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - return this._client.get(path`/calendars/${calendarID}/events`, { - query, - ...options, - }); - } - - /** - * Deletes an event. - */ - delete( - eventID: string, - params: EventDeleteParams, - options?: RequestOptions, - ): APIPromise { - const { - calendarId, - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - sendUpdates, - userIp, - } = params; - return this._client.delete( - path`/calendars/${calendarId}/events/${eventID}`, - { - query: { - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - sendUpdates, - userIp, - }, - ...options, - headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), - }, - ); - } - - /** - * Imports an event. This operation is used to add a private copy of an existing - * event to a calendar. - */ - import( - calendarID: string, - params: EventImportParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - conferenceDataVersion, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - supportsAttachments, - userIp, - ...body - } = params ?? {}; - return this._client.post(path`/calendars/${calendarID}/events/import`, { - query: { - alt, - conferenceDataVersion, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - supportsAttachments, - userIp, - }, - body, - ...options, - }); - } - - /** - * Returns instances of the specified recurring event. - */ - instances( - eventID: string, - params: EventInstancesParams, - options?: RequestOptions, - ): APIPromise { - const { calendarId, ...query } = params; - return this._client.get( - path`/calendars/${calendarId}/events/${eventID}/instances`, - { - query, - ...options, - }, - ); - } - - /** - * Moves an event to another calendar, i.e. changes an event's organizer. Note that - * only default events can be moved; outOfOffice, focusTime and workingLocation - * events cannot be moved. - */ - move( - eventID: string, - params: EventMoveParams, - options?: RequestOptions, - ): APIPromise { - const { - calendarId, - destination, - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - sendUpdates, - userIp, - } = params; - return this._client.post( - path`/calendars/${calendarId}/events/${eventID}/move`, - { - query: { - destination, - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - sendUpdates, - userIp, - }, - ...options, - }, - ); - } - - /** - * Creates an event based on a simple text string. - */ - quickAdd( - calendarID: string, - params: EventQuickAddParams, - options?: RequestOptions, - ): APIPromise { - const { - text, - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - sendUpdates, - userIp, - } = params; - return this._client.post(path`/calendars/${calendarID}/events/quickAdd`, { - query: { - text, - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - sendNotifications, - sendUpdates, - userIp, - }, - ...options, - }); - } - - /** - * Watch for changes to Events resources. - */ - watch( - calendarID: string, - params: EventWatchParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - alwaysIncludeEmail, - eventTypes, - fields, - iCalUID, - key, - maxAttendees, - maxResults, - oauth_token, - orderBy, - pageToken, - prettyPrint, - privateExtendedProperty, - q, - quotaUser, - sharedExtendedProperty, - showDeleted, - showHiddenInvitations, - singleEvents, - syncToken, - timeMax, - timeMin, - timeZone, - updatedMin, - userIp, - ...body - } = params ?? {}; - return this._client.post(path`/calendars/${calendarID}/events/watch`, { - query: { - alt, - alwaysIncludeEmail, - eventTypes, - fields, - iCalUID, - key, - maxAttendees, - maxResults, - oauth_token, - orderBy, - pageToken, - prettyPrint, - privateExtendedProperty, - q, - quotaUser, - sharedExtendedProperty, - showDeleted, - showHiddenInvitations, - singleEvents, - syncToken, - timeMax, - timeMin, - timeZone, - updatedMin, - userIp, - }, - body, - ...options, - }); - } + /** + * Creates an event. + */ + create( + calendarID: string, + params: EventCreateParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { + alt, + conferenceDataVersion, + fields, + key, + maxAttendees, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + sendUpdates, + supportsAttachments, + userIp, + ...body + } = params ?? {}; + return this._client.post(path`/calendars/${calendarID}/events`, { + query: { + alt, + conferenceDataVersion, + fields, + key, + maxAttendees, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + sendUpdates, + supportsAttachments, + userIp, + }, + body, + ...options, + }); + } + + /** + * Returns an event based on its Google Calendar ID. To retrieve an event using its + * iCalendar ID, call the events.list method using the iCalUID parameter. + */ + retrieve( + eventID: string, + params: EventRetrieveParams, + options?: RequestOptions, + ): APIPromise { + const { calendarId, ...query } = params; + return this._client.get(path`/calendars/${calendarId}/events/${eventID}`, { + query, + ...options, + }); + } + + /** + * Updates an event. + */ + update(eventID: string, params: EventUpdateParams, options?: RequestOptions): APIPromise { + const { + calendarId, + alt, + alwaysIncludeEmail, + conferenceDataVersion, + fields, + key, + maxAttendees, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + sendUpdates, + supportsAttachments, + userIp, + ...body + } = params; + return this._client.put(path`/calendars/${calendarId}/events/${eventID}`, { + query: { + alt, + alwaysIncludeEmail, + conferenceDataVersion, + fields, + key, + maxAttendees, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + sendUpdates, + supportsAttachments, + userIp, + }, + body, + ...options, + }); + } + + /** + * Returns events on the specified calendar. + */ + list( + calendarID: string, + query: EventListParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + return this._client.get(path`/calendars/${calendarID}/events`, { + query, + ...options, + }); + } + + /** + * Deletes an event. + */ + delete(eventID: string, params: EventDeleteParams, options?: RequestOptions): APIPromise { + const { + calendarId, + alt, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + sendUpdates, + userIp, + } = params; + return this._client.delete(path`/calendars/${calendarId}/events/${eventID}`, { + query: { + alt, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + sendUpdates, + userIp, + }, + ...options, + headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), + }); + } + + /** + * Imports an event. This operation is used to add a private copy of an existing + * event to a calendar. + */ + import( + calendarID: string, + params: EventImportParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { + alt, + conferenceDataVersion, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + supportsAttachments, + userIp, + ...body + } = params ?? {}; + return this._client.post(path`/calendars/${calendarID}/events/import`, { + query: { + alt, + conferenceDataVersion, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + supportsAttachments, + userIp, + }, + body, + ...options, + }); + } + + /** + * Returns instances of the specified recurring event. + */ + instances( + eventID: string, + params: EventInstancesParams, + options?: RequestOptions, + ): APIPromise { + const { calendarId, ...query } = params; + return this._client.get(path`/calendars/${calendarId}/events/${eventID}/instances`, { + query, + ...options, + }); + } + + /** + * Moves an event to another calendar, i.e. changes an event's organizer. Note that + * only default events can be moved; outOfOffice, focusTime and workingLocation + * events cannot be moved. + */ + move(eventID: string, params: EventMoveParams, options?: RequestOptions): APIPromise { + const { + calendarId, + destination, + alt, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + sendUpdates, + userIp, + } = params; + return this._client.post(path`/calendars/${calendarId}/events/${eventID}/move`, { + query: { + destination, + alt, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + sendUpdates, + userIp, + }, + ...options, + }); + } + + /** + * Creates an event based on a simple text string. + */ + quickAdd( + calendarID: string, + params: EventQuickAddParams, + options?: RequestOptions, + ): APIPromise { + const { + text, + alt, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + sendUpdates, + userIp, + } = params; + return this._client.post(path`/calendars/${calendarID}/events/quickAdd`, { + query: { + text, + alt, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + sendNotifications, + sendUpdates, + userIp, + }, + ...options, + }); + } + + /** + * Watch for changes to Events resources. + */ + watch( + calendarID: string, + params: EventWatchParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { + alt, + alwaysIncludeEmail, + eventTypes, + fields, + iCalUID, + key, + maxAttendees, + maxResults, + oauth_token, + orderBy, + pageToken, + prettyPrint, + privateExtendedProperty, + q, + quotaUser, + sharedExtendedProperty, + showDeleted, + showHiddenInvitations, + singleEvents, + syncToken, + timeMax, + timeMin, + timeZone, + updatedMin, + userIp, + ...body + } = params ?? {}; + return this._client.post(path`/calendars/${calendarID}/events/watch`, { + query: { + alt, + alwaysIncludeEmail, + eventTypes, + fields, + iCalUID, + key, + maxAttendees, + maxResults, + oauth_token, + orderBy, + pageToken, + prettyPrint, + privateExtendedProperty, + q, + quotaUser, + sharedExtendedProperty, + showDeleted, + showHiddenInvitations, + singleEvents, + syncToken, + timeMax, + timeMin, + timeZone, + updatedMin, + userIp, + }, + body, + ...options, + }); + } } export interface Event { - /** - * Opaque identifier of the event. When creating new single or recurring events, - * you can specify their IDs. Provided IDs must follow these rules: - * - * - characters allowed in the ID are those used in base32hex encoding, i.e. - * lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938 - * - the length of the ID must be between 5 and 1024 characters - * - the ID must be unique per calendar Due to the globally distributed nature of - * the system, we cannot guarantee that ID collisions will be detected at event - * creation time. To minimize the risk of collisions we recommend using an - * established UUID algorithm such as one described in RFC4122. If you do not - * specify an ID, it will be automatically generated by the server. Note that the - * icalUID and the id are not identical and only one of them should be supplied - * at event creation time. One difference in their semantics is that in recurring - * events, all occurrences of one event have different ids while they all share - * the same icalUIDs. - */ - id?: string; - - /** - * Whether anyone can invite themselves to the event (deprecated). Optional. The - * default is False. - */ - anyoneCanAddSelf?: boolean; - - /** - * File attachments for the event. In order to modify attachments the - * supportsAttachments request parameter should be set to true. There can be at - * most 25 attachments per event, - */ - attachments?: Array; - - /** - * The attendees of the event. See the Events with attendees guide for more - * information on scheduling events with other calendar users. Service accounts - * need to use domain-wide delegation of authority to populate the attendee list. - */ - attendees?: Array; - - /** - * Whether attendees may have been omitted from the event's representation. When - * retrieving an event, this may be due to a restriction specified by the - * maxAttendee query parameter. When updating an event, this can be used to only - * update the participant's response. Optional. The default is False. - */ - attendeesOmitted?: boolean; - - /** - * The color of the event. This is an ID referring to an entry in the event section - * of the colors definition (see the colors endpoint). Optional. - */ - colorId?: string; - - /** - * The conference-related information, such as details of a Google Meet conference. - * To create new conference details use the createRequest field. To persist your - * changes, remember to set the conferenceDataVersion request parameter to 1 for - * all event modification requests. - */ - conferenceData?: Event.ConferenceData; - - /** - * Creation time of the event (as a RFC3339 timestamp). Read-only. - */ - created?: string; - - /** - * The creator of the event. Read-only. - */ - creator?: Event.Creator; - - /** - * Description of the event. Can contain HTML. Optional. - */ - description?: string; - - /** - * The (exclusive) end time of the event. For a recurring event, this is the end - * time of the first instance. - */ - end?: Event.End; - - /** - * Whether the end time is actually unspecified. An end time is still provided for - * compatibility reasons, even if this attribute is set to True. The default is - * False. - */ - endTimeUnspecified?: boolean; - - /** - * ETag of the resource. - */ - etag?: string; - - /** - * Specific type of the event. This cannot be modified after the event is created. - * Possible values are: - * - * - "default" - A regular event or not further specified. - * - "outOfOffice" - An out-of-office event. - * - "focusTime" - A focus-time event. - * - "workingLocation" - A working location event. Currently, only "default " and - * "workingLocation" events can be created using the API. Extended support for - * other event types will be made available in later releases. - */ - eventType?: string; - - /** - * Extended properties of the event. - */ - extendedProperties?: Event.ExtendedProperties; - - /** - * Focus Time event data. Used if eventType is focusTime. - */ - focusTimeProperties?: Event.FocusTimeProperties; - - /** - * A gadget that extends this event. Gadgets are deprecated; this structure is - * instead only used for returning birthday calendar metadata. - */ - gadget?: Event.Gadget; - - /** - * Whether attendees other than the organizer can invite others to the event. - * Optional. The default is True. - */ - guestsCanInviteOthers?: boolean; - - /** - * Whether attendees other than the organizer can modify the event. Optional. The - * default is False. - */ - guestsCanModify?: boolean; - - /** - * Whether attendees other than the organizer can see who the event's attendees - * are. Optional. The default is True. - */ - guestsCanSeeOtherGuests?: boolean; - - /** - * An absolute link to the Google Hangout associated with this event. Read-only. - */ - hangoutLink?: string; - - /** - * An absolute link to this event in the Google Calendar Web UI. Read-only. - */ - htmlLink?: string; - - /** - * Event unique identifier as defined in RFC5545. It is used to uniquely identify - * events accross calendaring systems and must be supplied when importing events - * via the import method. Note that the iCalUID and the id are not identical and - * only one of them should be supplied at event creation time. One difference in - * their semantics is that in recurring events, all occurrences of one event have - * different ids while they all share the same iCalUIDs. To retrieve an event using - * its iCalUID, call the events.list method using the iCalUID parameter. To - * retrieve an event using its id, call the events.get method. - */ - iCalUID?: string; - - /** - * Type of the resource ("calendar#event"). - */ - kind?: string; - - /** - * Geographic location of the event as free-form text. Optional. - */ - location?: string; - - /** - * Whether this is a locked event copy where no changes can be made to the main - * event fields "summary", "description", "location", "start", "end" or - * "recurrence". The default is False. Read-Only. - */ - locked?: boolean; - - /** - * The organizer of the event. If the organizer is also an attendee, this is - * indicated with a separate entry in attendees with the organizer field set to - * True. To change the organizer, use the move operation. Read-only, except when - * importing an event. - */ - organizer?: Event.Organizer; - - /** - * For an instance of a recurring event, this is the time at which this event would - * start according to the recurrence data in the recurring event identified by - * recurringEventId. It uniquely identifies the instance within the recurring event - * series even if the instance was moved to a different time. Immutable. - */ - originalStartTime?: Event.OriginalStartTime; - - /** - * Out of office event data. Used if eventType is outOfOffice. - */ - outOfOfficeProperties?: Event.OutOfOfficeProperties; - - /** - * If set to True, Event propagation is disabled. Note that it is not the same - * thing as Private event properties. Optional. Immutable. The default is False. - */ - privateCopy?: boolean; - - /** - * List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, as - * specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in this - * field; event start and end times are specified in the start and end fields. This - * field is omitted for single events or instances of recurring events. - */ - recurrence?: Array; - - /** - * For an instance of a recurring event, this is the id of the recurring event to - * which this instance belongs. Immutable. - */ - recurringEventId?: string; - - /** - * Information about the event's reminders for the authenticated user. - */ - reminders?: Event.Reminders; - - /** - * Sequence number as per iCalendar. - */ - sequence?: number; - - /** - * Source from which the event was created. For example, a web page, an email - * message or any document identifiable by an URL with HTTP or HTTPS scheme. Can - * only be seen or modified by the creator of the event. - */ - source?: Event.Source; - - /** - * The (inclusive) start time of the event. For a recurring event, this is the - * start time of the first instance. - */ - start?: Event.Start; - - /** - * Status of the event. Optional. Possible values are: - * - * - "confirmed" - The event is confirmed. This is the default status. - * - "tentative" - The event is tentatively confirmed. - * - "cancelled" - The event is cancelled (deleted). The list method returns - * cancelled events only on incremental sync (when syncToken or updatedMin are - * specified) or if the showDeleted flag is set to true. The get method always - * returns them. A cancelled status represents two different states depending on - * the event type: - * - Cancelled exceptions of an uncancelled recurring event indicate that this - * instance should no longer be presented to the user. Clients should store these - * events for the lifetime of the parent recurring event. Cancelled exceptions - * are only guaranteed to have values for the id, recurringEventId and - * originalStartTime fields populated. The other fields might be empty. - * - All other cancelled events represent deleted events. Clients should remove - * their locally synced copies. Such cancelled events will eventually disappear, - * so do not rely on them being available indefinitely. Deleted events are only - * guaranteed to have the id field populated. On the organizer's calendar, - * cancelled events continue to expose event details (summary, location, etc.) so - * that they can be restored (undeleted). Similarly, the events to which the user - * was invited and that they manually removed continue to provide details. - * However, incremental sync requests with showDeleted set to false will not - * return these details. If an event changes its organizer (for example via the - * move operation) and the original organizer is not on the attendee list, it - * will leave behind a cancelled event where only the id field is guaranteed to - * be populated. - */ - status?: string; - - /** - * Title of the event. - */ - summary?: string; - - /** - * Whether the event blocks time on the calendar. Optional. Possible values are: - * - * - "opaque" - Default value. The event does block time on the calendar. This is - * equivalent to setting Show me as to Busy in the Calendar UI. - * - "transparent" - The event does not block time on the calendar. This is - * equivalent to setting Show me as to Available in the Calendar UI. - */ - transparency?: string; - - /** - * Last modification time of the event (as a RFC3339 timestamp). Read-only. - */ - updated?: string; - - /** - * Visibility of the event. Optional. Possible values are: - * - * - "default" - Uses the default visibility for events on the calendar. This is - * the default value. - * - "public" - The event is public and event details are visible to all readers of - * the calendar. - * - "private" - The event is private and only event attendees may view event - * details. - * - "confidential" - The event is private. This value is provided for - * compatibility reasons. - */ - visibility?: string; - - /** - * Working location event data. - */ - workingLocationProperties?: Event.WorkingLocationProperties; + /** + * Opaque identifier of the event. When creating new single or recurring events, + * you can specify their IDs. Provided IDs must follow these rules: + * + * - characters allowed in the ID are those used in base32hex encoding, i.e. + * lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938 + * - the length of the ID must be between 5 and 1024 characters + * - the ID must be unique per calendar Due to the globally distributed nature of + * the system, we cannot guarantee that ID collisions will be detected at event + * creation time. To minimize the risk of collisions we recommend using an + * established UUID algorithm such as one described in RFC4122. If you do not + * specify an ID, it will be automatically generated by the server. Note that the + * icalUID and the id are not identical and only one of them should be supplied + * at event creation time. One difference in their semantics is that in recurring + * events, all occurrences of one event have different ids while they all share + * the same icalUIDs. + */ + id?: string; + + /** + * Whether anyone can invite themselves to the event (deprecated). Optional. The + * default is False. + */ + anyoneCanAddSelf?: boolean; + + /** + * File attachments for the event. In order to modify attachments the + * supportsAttachments request parameter should be set to true. There can be at + * most 25 attachments per event, + */ + attachments?: Array; + + /** + * The attendees of the event. See the Events with attendees guide for more + * information on scheduling events with other calendar users. Service accounts + * need to use domain-wide delegation of authority to populate the attendee list. + */ + attendees?: Array; + + /** + * Whether attendees may have been omitted from the event's representation. When + * retrieving an event, this may be due to a restriction specified by the + * maxAttendee query parameter. When updating an event, this can be used to only + * update the participant's response. Optional. The default is False. + */ + attendeesOmitted?: boolean; + + /** + * The color of the event. This is an ID referring to an entry in the event section + * of the colors definition (see the colors endpoint). Optional. + */ + colorId?: string; + + /** + * The conference-related information, such as details of a Google Meet conference. + * To create new conference details use the createRequest field. To persist your + * changes, remember to set the conferenceDataVersion request parameter to 1 for + * all event modification requests. + */ + conferenceData?: Event.ConferenceData; + + /** + * Creation time of the event (as a RFC3339 timestamp). Read-only. + */ + created?: string; + + /** + * The creator of the event. Read-only. + */ + creator?: Event.Creator; + + /** + * Description of the event. Can contain HTML. Optional. + */ + description?: string; + + /** + * The (exclusive) end time of the event. For a recurring event, this is the end + * time of the first instance. + */ + end?: Event.End; + + /** + * Whether the end time is actually unspecified. An end time is still provided for + * compatibility reasons, even if this attribute is set to True. The default is + * False. + */ + endTimeUnspecified?: boolean; + + /** + * ETag of the resource. + */ + etag?: string; + + /** + * Specific type of the event. This cannot be modified after the event is created. + * Possible values are: + * + * - "default" - A regular event or not further specified. + * - "outOfOffice" - An out-of-office event. + * - "focusTime" - A focus-time event. + * - "workingLocation" - A working location event. Currently, only "default " and + * "workingLocation" events can be created using the API. Extended support for + * other event types will be made available in later releases. + */ + eventType?: string; + + /** + * Extended properties of the event. + */ + extendedProperties?: Event.ExtendedProperties; + + /** + * Focus Time event data. Used if eventType is focusTime. + */ + focusTimeProperties?: Event.FocusTimeProperties; + + /** + * A gadget that extends this event. Gadgets are deprecated; this structure is + * instead only used for returning birthday calendar metadata. + */ + gadget?: Event.Gadget; + + /** + * Whether attendees other than the organizer can invite others to the event. + * Optional. The default is True. + */ + guestsCanInviteOthers?: boolean; + + /** + * Whether attendees other than the organizer can modify the event. Optional. The + * default is False. + */ + guestsCanModify?: boolean; + + /** + * Whether attendees other than the organizer can see who the event's attendees + * are. Optional. The default is True. + */ + guestsCanSeeOtherGuests?: boolean; + + /** + * An absolute link to the Google Hangout associated with this event. Read-only. + */ + hangoutLink?: string; + + /** + * An absolute link to this event in the Google Calendar Web UI. Read-only. + */ + htmlLink?: string; + + /** + * Event unique identifier as defined in RFC5545. It is used to uniquely identify + * events accross calendaring systems and must be supplied when importing events + * via the import method. Note that the iCalUID and the id are not identical and + * only one of them should be supplied at event creation time. One difference in + * their semantics is that in recurring events, all occurrences of one event have + * different ids while they all share the same iCalUIDs. To retrieve an event using + * its iCalUID, call the events.list method using the iCalUID parameter. To + * retrieve an event using its id, call the events.get method. + */ + iCalUID?: string; + + /** + * Type of the resource ("calendar#event"). + */ + kind?: string; + + /** + * Geographic location of the event as free-form text. Optional. + */ + location?: string; + + /** + * Whether this is a locked event copy where no changes can be made to the main + * event fields "summary", "description", "location", "start", "end" or + * "recurrence". The default is False. Read-Only. + */ + locked?: boolean; + + /** + * The organizer of the event. If the organizer is also an attendee, this is + * indicated with a separate entry in attendees with the organizer field set to + * True. To change the organizer, use the move operation. Read-only, except when + * importing an event. + */ + organizer?: Event.Organizer; + + /** + * For an instance of a recurring event, this is the time at which this event would + * start according to the recurrence data in the recurring event identified by + * recurringEventId. It uniquely identifies the instance within the recurring event + * series even if the instance was moved to a different time. Immutable. + */ + originalStartTime?: Event.OriginalStartTime; + + /** + * Out of office event data. Used if eventType is outOfOffice. + */ + outOfOfficeProperties?: Event.OutOfOfficeProperties; + + /** + * If set to True, Event propagation is disabled. Note that it is not the same + * thing as Private event properties. Optional. Immutable. The default is False. + */ + privateCopy?: boolean; + + /** + * List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, as + * specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in this + * field; event start and end times are specified in the start and end fields. This + * field is omitted for single events or instances of recurring events. + */ + recurrence?: Array; + + /** + * For an instance of a recurring event, this is the id of the recurring event to + * which this instance belongs. Immutable. + */ + recurringEventId?: string; + + /** + * Information about the event's reminders for the authenticated user. + */ + reminders?: Event.Reminders; + + /** + * Sequence number as per iCalendar. + */ + sequence?: number; + + /** + * Source from which the event was created. For example, a web page, an email + * message or any document identifiable by an URL with HTTP or HTTPS scheme. Can + * only be seen or modified by the creator of the event. + */ + source?: Event.Source; + + /** + * The (inclusive) start time of the event. For a recurring event, this is the + * start time of the first instance. + */ + start?: Event.Start; + + /** + * Status of the event. Optional. Possible values are: + * + * - "confirmed" - The event is confirmed. This is the default status. + * - "tentative" - The event is tentatively confirmed. + * - "cancelled" - The event is cancelled (deleted). The list method returns + * cancelled events only on incremental sync (when syncToken or updatedMin are + * specified) or if the showDeleted flag is set to true. The get method always + * returns them. A cancelled status represents two different states depending on + * the event type: + * - Cancelled exceptions of an uncancelled recurring event indicate that this + * instance should no longer be presented to the user. Clients should store these + * events for the lifetime of the parent recurring event. Cancelled exceptions + * are only guaranteed to have values for the id, recurringEventId and + * originalStartTime fields populated. The other fields might be empty. + * - All other cancelled events represent deleted events. Clients should remove + * their locally synced copies. Such cancelled events will eventually disappear, + * so do not rely on them being available indefinitely. Deleted events are only + * guaranteed to have the id field populated. On the organizer's calendar, + * cancelled events continue to expose event details (summary, location, etc.) so + * that they can be restored (undeleted). Similarly, the events to which the user + * was invited and that they manually removed continue to provide details. + * However, incremental sync requests with showDeleted set to false will not + * return these details. If an event changes its organizer (for example via the + * move operation) and the original organizer is not on the attendee list, it + * will leave behind a cancelled event where only the id field is guaranteed to + * be populated. + */ + status?: string; + + /** + * Title of the event. + */ + summary?: string; + + /** + * Whether the event blocks time on the calendar. Optional. Possible values are: + * + * - "opaque" - Default value. The event does block time on the calendar. This is + * equivalent to setting Show me as to Busy in the Calendar UI. + * - "transparent" - The event does not block time on the calendar. This is + * equivalent to setting Show me as to Available in the Calendar UI. + */ + transparency?: string; + + /** + * Last modification time of the event (as a RFC3339 timestamp). Read-only. + */ + updated?: string; + + /** + * Visibility of the event. Optional. Possible values are: + * + * - "default" - Uses the default visibility for events on the calendar. This is + * the default value. + * - "public" - The event is public and event details are visible to all readers of + * the calendar. + * - "private" - The event is private and only event attendees may view event + * details. + * - "confidential" - The event is private. This value is provided for + * compatibility reasons. + */ + visibility?: string; + + /** + * Working location event data. + */ + workingLocationProperties?: Event.WorkingLocationProperties; } export namespace Event { - export interface Attachment { - /** - * ID of the attached file. Read-only. For Google Drive files, this is the ID of - * the corresponding Files resource entry in the Drive API. - */ - fileId?: string; - - /** - * URL link to the attachment. For adding Google Drive file attachments use the - * same format as in alternateLink property of the Files resource in the Drive API. - * Required when adding an attachment. - */ - fileUrl?: string; - - /** - * URL link to the attachment's icon. This field can only be modified for custom - * third-party attachments. - */ - iconLink?: string; - - /** - * Internet media type (MIME type) of the attachment. - */ - mimeType?: string; - - /** - * Attachment title. - */ - title?: string; - } - - export interface Attendee { - /** - * The attendee's Profile ID, if available. - */ - id?: string; - - /** - * Number of additional guests. Optional. The default is 0. - */ - additionalGuests?: number; - - /** - * The attendee's response comment. Optional. - */ - comment?: string; - - /** - * The attendee's name, if available. Optional. - */ - displayName?: string; - - /** - * The attendee's email address, if available. This field must be present when - * adding an attendee. It must be a valid email address as per RFC5322. Required - * when adding an attendee. - */ - email?: string; - - /** - * Whether this is an optional attendee. Optional. The default is False. - */ - optional?: boolean; - - /** - * Whether the attendee is the organizer of the event. Read-only. The default is - * False. - */ - organizer?: boolean; - - /** - * Whether the attendee is a resource. Can only be set when the attendee is added - * to the event for the first time. Subsequent modifications are ignored. Optional. - * The default is False. - */ - resource?: boolean; - - /** - * The attendee's response status. Possible values are: - * - * - "needsAction" - The attendee has not responded to the invitation (recommended - * for new events). - * - "declined" - The attendee has declined the invitation. - * - "tentative" - The attendee has tentatively accepted the invitation. - * - "accepted" - The attendee has accepted the invitation. Warning: If you add an - * event using the values declined, tentative, or accepted, attendees with the - * "Add invitations to my calendar" setting set to "When I respond to invitation - * in email" won't see an event on their calendar unless they choose to change - * their invitation response in the event invitation email. - */ - responseStatus?: string; - - /** - * Whether this entry represents the calendar on which this copy of the event - * appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * The conference-related information, such as details of a Google Meet conference. - * To create new conference details use the createRequest field. To persist your - * changes, remember to set the conferenceDataVersion request parameter to 1 for - * all event modification requests. - */ - export interface ConferenceData { - /** - * The ID of the conference. Can be used by developers to keep track of - * conferences, should not be displayed to users. The ID value is formed - * differently for each conference solution type: - * - * - eventHangout: ID is not set. (This conference type is deprecated.) - * - eventNamedHangout: ID is the name of the Hangout. (This conference type is - * deprecated.) - * - hangoutsMeet: ID is the 10-letter meeting code, for example aaa-bbbb-ccc. - * - addOn: ID is defined by the third-party provider. Optional. - */ - conferenceId?: string; - - /** - * The conference solution, such as Google Meet. Unset for a conference with a - * failed create request. Either conferenceSolution and at least one entryPoint, or - * createRequest is required. - */ - conferenceSolution?: ConferenceData.ConferenceSolution; - - /** - * A request to generate a new conference and attach it to the event. The data is - * generated asynchronously. To see whether the data is present check the status - * field. Either conferenceSolution and at least one entryPoint, or createRequest - * is required. - */ - createRequest?: ConferenceData.CreateRequest; - - /** - * Information about individual conference entry points, such as URLs or phone - * numbers. All of them must belong to the same conference. Either - * conferenceSolution and at least one entryPoint, or createRequest is required. - */ - entryPoints?: Array; - - /** - * Additional notes (such as instructions from the domain administrator, legal - * notices) to display to the user. Can contain HTML. The maximum length is 2048 - * characters. Optional. - */ - notes?: string; - - /** - * Additional properties related to a conference. An example would be a - * solution-specific setting for enabling video streaming. - */ - parameters?: ConferenceData.Parameters; - - /** - * The signature of the conference data. Generated on server side. Unset for a - * conference with a failed create request. Optional for a conference with a - * pending create request. - */ - signature?: string; - } - - export namespace ConferenceData { - /** - * The conference solution, such as Google Meet. Unset for a conference with a - * failed create request. Either conferenceSolution and at least one entryPoint, or - * createRequest is required. - */ - export interface ConferenceSolution { - /** - * The user-visible icon for this solution. - */ - iconUri?: string; - - /** - * The key which can uniquely identify the conference solution for this event. - */ - key?: ConferenceSolution.Key; - - /** - * The user-visible name of this solution. Not localized. - */ - name?: string; - } - - export namespace ConferenceSolution { - /** - * The key which can uniquely identify the conference solution for this event. - */ - export interface Key { - /** - * The conference solution type. If a client encounters an unfamiliar or empty - * type, it should still be able to display the entry points. However, it should - * disallow modifications. The possible values are: - * - * - "eventHangout" for Hangouts for consumers (deprecated; existing events may - * show this conference solution type but new conferences cannot be created) - * - "eventNamedHangout" for classic Hangouts for Google Workspace users - * (deprecated; existing events may show this conference solution type but new - * conferences cannot be created) - * - "hangoutsMeet" for Google Meet (http://meet.google.com) - * - "addOn" for 3P conference providers - */ - type?: string; - } - } - - /** - * A request to generate a new conference and attach it to the event. The data is - * generated asynchronously. To see whether the data is present check the status - * field. Either conferenceSolution and at least one entryPoint, or createRequest - * is required. - */ - export interface CreateRequest { - /** - * The conference solution, such as Hangouts or Google Meet. - */ - conferenceSolutionKey?: CreateRequest.ConferenceSolutionKey; - - /** - * The client-generated unique ID for this request. Clients should regenerate this - * ID for every new request. If an ID provided is the same as for the previous - * request, the request is ignored. - */ - requestId?: string; - - /** - * The status of the conference create request. - */ - status?: CreateRequest.Status; - } - - export namespace CreateRequest { - /** - * The conference solution, such as Hangouts or Google Meet. - */ - export interface ConferenceSolutionKey { - /** - * The conference solution type. If a client encounters an unfamiliar or empty - * type, it should still be able to display the entry points. However, it should - * disallow modifications. The possible values are: - * - * - "eventHangout" for Hangouts for consumers (deprecated; existing events may - * show this conference solution type but new conferences cannot be created) - * - "eventNamedHangout" for classic Hangouts for Google Workspace users - * (deprecated; existing events may show this conference solution type but new - * conferences cannot be created) - * - "hangoutsMeet" for Google Meet (http://meet.google.com) - * - "addOn" for 3P conference providers - */ - type?: string; - } - - /** - * The status of the conference create request. - */ - export interface Status { - /** - * The current status of the conference create request. Read-only. The possible - * values are: - * - * - "pending": the conference create request is still being processed. - * - "success": the conference create request succeeded, the entry points are - * populated. - * - "failure": the conference create request failed, there are no entry points. - */ - statusCode?: string; - } - } - - export interface EntryPoint { - /** - * The access code to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - accessCode?: string; - - /** - * Features of the entry point, such as being toll or toll-free. One entry point - * can have multiple features. However, toll and toll-free cannot be both set on - * the same entry point. - */ - entryPointFeatures?: Array; - - /** - * The type of the conference entry point. Possible values are: - * - * - "video" - joining a conference over HTTP. A conference can have zero or one - * video entry point. - * - "phone" - joining a conference by dialing a phone number. A conference can - * have zero or more phone entry points. - * - "sip" - joining a conference over SIP. A conference can have zero or one sip - * entry point. - * - "more" - further conference joining instructions, for example additional phone - * numbers. A conference can have zero or one more entry point. A conference with - * only a more entry point is not a valid conference. - */ - entryPointType?: string; - - /** - * The label for the URI. Visible to end users. Not localized. The maximum length - * is 512 characters. Examples: - * - * - for video: meet.google.com/aaa-bbbb-ccc - * - for phone: +1 123 268 2601 - * - for sip: 12345678@altostrat.com - * - for more: should not be filled - * Optional. - */ - label?: string; - - /** - * The meeting code to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - meetingCode?: string; - - /** - * The passcode to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - */ - passcode?: string; - - /** - * The password to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - password?: string; - - /** - * The PIN to access the conference. The maximum length is 128 characters. When - * creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - pin?: string; - - /** - * The CLDR/ISO 3166 region code for the country associated with this phone access. - * Example: "SE" for Sweden. Calendar backend will populate this field only for - * EntryPointType.PHONE. - */ - regionCode?: string; - - /** - * The URI of the entry point. The maximum length is 1300 characters. Format: - * - * - for video, http: or https: schema is required. - * - for phone, tel: schema is required. The URI should include the entire dial - * sequence (e.g., tel:+12345678900,,,123456789;1234). - * - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com. - * - for more, http: or https: schema is required. - */ - uri?: string; - } - - /** - * Additional properties related to a conference. An example would be a - * solution-specific setting for enabling video streaming. - */ - export interface Parameters { - /** - * Additional add-on specific data. - */ - addOnParameters?: Parameters.AddOnParameters; - } - - export namespace Parameters { - /** - * Additional add-on specific data. - */ - export interface AddOnParameters { - parameters?: Record; - } - } - } - - /** - * The creator of the event. Read-only. - */ - export interface Creator { - /** - * The creator's Profile ID, if available. - */ - id?: string; - - /** - * The creator's name, if available. - */ - displayName?: string; - - /** - * The creator's email address, if available. - */ - email?: string; - - /** - * Whether the creator corresponds to the calendar on which this copy of the event - * appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * The (exclusive) end time of the event. For a recurring event, this is the end - * time of the first instance. - */ - export interface End { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Extended properties of the event. - */ - export interface ExtendedProperties { - /** - * Properties that are private to the copy of the event that appears on this - * calendar. - */ - private?: Record; - - /** - * Properties that are shared between copies of the event on other attendees' - * calendars. - */ - shared?: Record; - } - - /** - * Focus Time event data. Used if eventType is focusTime. - */ - export interface FocusTimeProperties { - /** - * Whether to decline meeting invitations which overlap Focus Time events. Valid - * values are declineNone, meaning that no meeting invitations are declined; - * declineAllConflictingInvitations, meaning that all conflicting meeting - * invitations that conflict with the event are declined; and - * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting - * invitations which arrive while the Focus Time event is present are to be - * declined. - */ - autoDeclineMode?: string; - - /** - * The status to mark the user in Chat and related products. This can be available - * or doNotDisturb. - */ - chatStatus?: string; - - /** - * Response message to set if an existing event or new invitation is automatically - * declined by Calendar. - */ - declineMessage?: string; - } - - /** - * A gadget that extends this event. Gadgets are deprecated; this structure is - * instead only used for returning birthday calendar metadata. - */ - export interface Gadget { - /** - * The gadget's display mode. Deprecated. Possible values are: - * - * - "icon" - The gadget displays next to the event's title in the calendar view. - * - "chip" - The gadget displays when the event is clicked. - */ - display?: string; - - /** - * The gadget's height in pixels. The height must be an integer greater than 0. - * Optional. Deprecated. - */ - height?: number; - - /** - * The gadget's icon URL. The URL scheme must be HTTPS. Deprecated. - */ - iconLink?: string; - - /** - * The gadget's URL. The URL scheme must be HTTPS. Deprecated. - */ - link?: string; - - /** - * Preferences. - */ - preferences?: Record; - - /** - * The gadget's title. Deprecated. - */ - title?: string; - - /** - * The gadget's type. Deprecated. - */ - type?: string; - - /** - * The gadget's width in pixels. The width must be an integer greater than 0. - * Optional. Deprecated. - */ - width?: number; - } - - /** - * The organizer of the event. If the organizer is also an attendee, this is - * indicated with a separate entry in attendees with the organizer field set to - * True. To change the organizer, use the move operation. Read-only, except when - * importing an event. - */ - export interface Organizer { - /** - * The organizer's Profile ID, if available. - */ - id?: string; - - /** - * The organizer's name, if available. - */ - displayName?: string; - - /** - * The organizer's email address, if available. It must be a valid email address as - * per RFC5322. - */ - email?: string; - - /** - * Whether the organizer corresponds to the calendar on which this copy of the - * event appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * For an instance of a recurring event, this is the time at which this event would - * start according to the recurrence data in the recurring event identified by - * recurringEventId. It uniquely identifies the instance within the recurring event - * series even if the instance was moved to a different time. Immutable. - */ - export interface OriginalStartTime { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Out of office event data. Used if eventType is outOfOffice. - */ - export interface OutOfOfficeProperties { - /** - * Whether to decline meeting invitations which overlap Out of office events. Valid - * values are declineNone, meaning that no meeting invitations are declined; - * declineAllConflictingInvitations, meaning that all conflicting meeting - * invitations that conflict with the event are declined; and - * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting - * invitations which arrive while the Out of office event is present are to be - * declined. - */ - autoDeclineMode?: string; - - /** - * Response message to set if an existing event or new invitation is automatically - * declined by Calendar. - */ - declineMessage?: string; - } - - /** - * Information about the event's reminders for the authenticated user. - */ - export interface Reminders { - /** - * If the event doesn't use the default reminders, this lists the reminders - * specific to the event, or, if not set, indicates that no reminders are set for - * this event. The maximum number of override reminders is 5. - */ - overrides?: Array; - - /** - * Whether the default reminders of the calendar apply to the event. - */ - useDefault?: boolean; - } - - export namespace Reminders { - export interface Override { - /** - * The method used by this reminder. Possible values are: - * - * - "email" - Reminders are sent via email. - * - "popup" - Reminders are sent via a UI popup. - * Required when adding a reminder. - */ - method?: string; - - /** - * Number of minutes before the start of the event when the reminder should - * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required - * when adding a reminder. - */ - minutes?: number; - } - } - - /** - * Source from which the event was created. For example, a web page, an email - * message or any document identifiable by an URL with HTTP or HTTPS scheme. Can - * only be seen or modified by the creator of the event. - */ - export interface Source { - /** - * Title of the source; for example a title of a web page or an email subject. - */ - title?: string; - - /** - * URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS. - */ - url?: string; - } - - /** - * The (inclusive) start time of the event. For a recurring event, this is the - * start time of the first instance. - */ - export interface Start { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Working location event data. - */ - export interface WorkingLocationProperties { - /** - * If present, specifies that the user is working from a custom location. - */ - customLocation?: WorkingLocationProperties.CustomLocation; - - /** - * If present, specifies that the user is working at home. - */ - homeOffice?: unknown; - - /** - * If present, specifies that the user is working from an office. - */ - officeLocation?: WorkingLocationProperties.OfficeLocation; - - /** - * Type of the working location. Possible values are: - * - * - "homeOffice" - The user is working at home. - * - "officeLocation" - The user is working from an office. - * - "customLocation" - The user is working from a custom location. Any details are - * specified in a sub-field of the specified name, but this field may be missing - * if empty. Any other fields are ignored. Required when adding working location - * properties. - */ - type?: string; - } - - export namespace WorkingLocationProperties { - /** - * If present, specifies that the user is working from a custom location. - */ - export interface CustomLocation { - /** - * An optional extra label for additional information. - */ - label?: string; - } - - /** - * If present, specifies that the user is working from an office. - */ - export interface OfficeLocation { - /** - * An optional building identifier. This should reference a building ID in the - * organization's Resources database. - */ - buildingId?: string; - - /** - * An optional desk identifier. - */ - deskId?: string; - - /** - * An optional floor identifier. - */ - floorId?: string; - - /** - * An optional floor section identifier. - */ - floorSectionId?: string; - - /** - * The office name that's displayed in Calendar Web and Mobile clients. We - * recommend you reference a building name in the organization's Resources - * database. - */ - label?: string; - } - } + export interface Attachment { + /** + * ID of the attached file. Read-only. For Google Drive files, this is the ID of + * the corresponding Files resource entry in the Drive API. + */ + fileId?: string; + + /** + * URL link to the attachment. For adding Google Drive file attachments use the + * same format as in alternateLink property of the Files resource in the Drive API. + * Required when adding an attachment. + */ + fileUrl?: string; + + /** + * URL link to the attachment's icon. This field can only be modified for custom + * third-party attachments. + */ + iconLink?: string; + + /** + * Internet media type (MIME type) of the attachment. + */ + mimeType?: string; + + /** + * Attachment title. + */ + title?: string; + } + + export interface Attendee { + /** + * The attendee's Profile ID, if available. + */ + id?: string; + + /** + * Number of additional guests. Optional. The default is 0. + */ + additionalGuests?: number; + + /** + * The attendee's response comment. Optional. + */ + comment?: string; + + /** + * The attendee's name, if available. Optional. + */ + displayName?: string; + + /** + * The attendee's email address, if available. This field must be present when + * adding an attendee. It must be a valid email address as per RFC5322. Required + * when adding an attendee. + */ + email?: string; + + /** + * Whether this is an optional attendee. Optional. The default is False. + */ + optional?: boolean; + + /** + * Whether the attendee is the organizer of the event. Read-only. The default is + * False. + */ + organizer?: boolean; + + /** + * Whether the attendee is a resource. Can only be set when the attendee is added + * to the event for the first time. Subsequent modifications are ignored. Optional. + * The default is False. + */ + resource?: boolean; + + /** + * The attendee's response status. Possible values are: + * + * - "needsAction" - The attendee has not responded to the invitation (recommended + * for new events). + * - "declined" - The attendee has declined the invitation. + * - "tentative" - The attendee has tentatively accepted the invitation. + * - "accepted" - The attendee has accepted the invitation. Warning: If you add an + * event using the values declined, tentative, or accepted, attendees with the + * "Add invitations to my calendar" setting set to "When I respond to invitation + * in email" won't see an event on their calendar unless they choose to change + * their invitation response in the event invitation email. + */ + responseStatus?: string; + + /** + * Whether this entry represents the calendar on which this copy of the event + * appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * The conference-related information, such as details of a Google Meet conference. + * To create new conference details use the createRequest field. To persist your + * changes, remember to set the conferenceDataVersion request parameter to 1 for + * all event modification requests. + */ + export interface ConferenceData { + /** + * The ID of the conference. Can be used by developers to keep track of + * conferences, should not be displayed to users. The ID value is formed + * differently for each conference solution type: + * + * - eventHangout: ID is not set. (This conference type is deprecated.) + * - eventNamedHangout: ID is the name of the Hangout. (This conference type is + * deprecated.) + * - hangoutsMeet: ID is the 10-letter meeting code, for example aaa-bbbb-ccc. + * - addOn: ID is defined by the third-party provider. Optional. + */ + conferenceId?: string; + + /** + * The conference solution, such as Google Meet. Unset for a conference with a + * failed create request. Either conferenceSolution and at least one entryPoint, or + * createRequest is required. + */ + conferenceSolution?: ConferenceData.ConferenceSolution; + + /** + * A request to generate a new conference and attach it to the event. The data is + * generated asynchronously. To see whether the data is present check the status + * field. Either conferenceSolution and at least one entryPoint, or createRequest + * is required. + */ + createRequest?: ConferenceData.CreateRequest; + + /** + * Information about individual conference entry points, such as URLs or phone + * numbers. All of them must belong to the same conference. Either + * conferenceSolution and at least one entryPoint, or createRequest is required. + */ + entryPoints?: Array; + + /** + * Additional notes (such as instructions from the domain administrator, legal + * notices) to display to the user. Can contain HTML. The maximum length is 2048 + * characters. Optional. + */ + notes?: string; + + /** + * Additional properties related to a conference. An example would be a + * solution-specific setting for enabling video streaming. + */ + parameters?: ConferenceData.Parameters; + + /** + * The signature of the conference data. Generated on server side. Unset for a + * conference with a failed create request. Optional for a conference with a + * pending create request. + */ + signature?: string; + } + + export namespace ConferenceData { + /** + * The conference solution, such as Google Meet. Unset for a conference with a + * failed create request. Either conferenceSolution and at least one entryPoint, or + * createRequest is required. + */ + export interface ConferenceSolution { + /** + * The user-visible icon for this solution. + */ + iconUri?: string; + + /** + * The key which can uniquely identify the conference solution for this event. + */ + key?: ConferenceSolution.Key; + + /** + * The user-visible name of this solution. Not localized. + */ + name?: string; + } + + export namespace ConferenceSolution { + /** + * The key which can uniquely identify the conference solution for this event. + */ + export interface Key { + /** + * The conference solution type. If a client encounters an unfamiliar or empty + * type, it should still be able to display the entry points. However, it should + * disallow modifications. The possible values are: + * + * - "eventHangout" for Hangouts for consumers (deprecated; existing events may + * show this conference solution type but new conferences cannot be created) + * - "eventNamedHangout" for classic Hangouts for Google Workspace users + * (deprecated; existing events may show this conference solution type but new + * conferences cannot be created) + * - "hangoutsMeet" for Google Meet (http://meet.google.com) + * - "addOn" for 3P conference providers + */ + type?: string; + } + } + + /** + * A request to generate a new conference and attach it to the event. The data is + * generated asynchronously. To see whether the data is present check the status + * field. Either conferenceSolution and at least one entryPoint, or createRequest + * is required. + */ + export interface CreateRequest { + /** + * The conference solution, such as Hangouts or Google Meet. + */ + conferenceSolutionKey?: CreateRequest.ConferenceSolutionKey; + + /** + * The client-generated unique ID for this request. Clients should regenerate this + * ID for every new request. If an ID provided is the same as for the previous + * request, the request is ignored. + */ + requestId?: string; + + /** + * The status of the conference create request. + */ + status?: CreateRequest.Status; + } + + export namespace CreateRequest { + /** + * The conference solution, such as Hangouts or Google Meet. + */ + export interface ConferenceSolutionKey { + /** + * The conference solution type. If a client encounters an unfamiliar or empty + * type, it should still be able to display the entry points. However, it should + * disallow modifications. The possible values are: + * + * - "eventHangout" for Hangouts for consumers (deprecated; existing events may + * show this conference solution type but new conferences cannot be created) + * - "eventNamedHangout" for classic Hangouts for Google Workspace users + * (deprecated; existing events may show this conference solution type but new + * conferences cannot be created) + * - "hangoutsMeet" for Google Meet (http://meet.google.com) + * - "addOn" for 3P conference providers + */ + type?: string; + } + + /** + * The status of the conference create request. + */ + export interface Status { + /** + * The current status of the conference create request. Read-only. The possible + * values are: + * + * - "pending": the conference create request is still being processed. + * - "success": the conference create request succeeded, the entry points are + * populated. + * - "failure": the conference create request failed, there are no entry points. + */ + statusCode?: string; + } + } + + export interface EntryPoint { + /** + * The access code to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + accessCode?: string; + + /** + * Features of the entry point, such as being toll or toll-free. One entry point + * can have multiple features. However, toll and toll-free cannot be both set on + * the same entry point. + */ + entryPointFeatures?: Array; + + /** + * The type of the conference entry point. Possible values are: + * + * - "video" - joining a conference over HTTP. A conference can have zero or one + * video entry point. + * - "phone" - joining a conference by dialing a phone number. A conference can + * have zero or more phone entry points. + * - "sip" - joining a conference over SIP. A conference can have zero or one sip + * entry point. + * - "more" - further conference joining instructions, for example additional phone + * numbers. A conference can have zero or one more entry point. A conference with + * only a more entry point is not a valid conference. + */ + entryPointType?: string; + + /** + * The label for the URI. Visible to end users. Not localized. The maximum length + * is 512 characters. Examples: + * + * - for video: meet.google.com/aaa-bbbb-ccc + * - for phone: +1 123 268 2601 + * - for sip: 12345678@altostrat.com + * - for more: should not be filled + * Optional. + */ + label?: string; + + /** + * The meeting code to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + meetingCode?: string; + + /** + * The passcode to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + */ + passcode?: string; + + /** + * The password to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + password?: string; + + /** + * The PIN to access the conference. The maximum length is 128 characters. When + * creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + pin?: string; + + /** + * The CLDR/ISO 3166 region code for the country associated with this phone access. + * Example: "SE" for Sweden. Calendar backend will populate this field only for + * EntryPointType.PHONE. + */ + regionCode?: string; + + /** + * The URI of the entry point. The maximum length is 1300 characters. Format: + * + * - for video, http: or https: schema is required. + * - for phone, tel: schema is required. The URI should include the entire dial + * sequence (e.g., tel:+12345678900,,,123456789;1234). + * - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com. + * - for more, http: or https: schema is required. + */ + uri?: string; + } + + /** + * Additional properties related to a conference. An example would be a + * solution-specific setting for enabling video streaming. + */ + export interface Parameters { + /** + * Additional add-on specific data. + */ + addOnParameters?: Parameters.AddOnParameters; + } + + export namespace Parameters { + /** + * Additional add-on specific data. + */ + export interface AddOnParameters { + parameters?: Record; + } + } + } + + /** + * The creator of the event. Read-only. + */ + export interface Creator { + /** + * The creator's Profile ID, if available. + */ + id?: string; + + /** + * The creator's name, if available. + */ + displayName?: string; + + /** + * The creator's email address, if available. + */ + email?: string; + + /** + * Whether the creator corresponds to the calendar on which this copy of the event + * appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * The (exclusive) end time of the event. For a recurring event, this is the end + * time of the first instance. + */ + export interface End { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Extended properties of the event. + */ + export interface ExtendedProperties { + /** + * Properties that are private to the copy of the event that appears on this + * calendar. + */ + private?: Record; + + /** + * Properties that are shared between copies of the event on other attendees' + * calendars. + */ + shared?: Record; + } + + /** + * Focus Time event data. Used if eventType is focusTime. + */ + export interface FocusTimeProperties { + /** + * Whether to decline meeting invitations which overlap Focus Time events. Valid + * values are declineNone, meaning that no meeting invitations are declined; + * declineAllConflictingInvitations, meaning that all conflicting meeting + * invitations that conflict with the event are declined; and + * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting + * invitations which arrive while the Focus Time event is present are to be + * declined. + */ + autoDeclineMode?: string; + + /** + * The status to mark the user in Chat and related products. This can be available + * or doNotDisturb. + */ + chatStatus?: string; + + /** + * Response message to set if an existing event or new invitation is automatically + * declined by Calendar. + */ + declineMessage?: string; + } + + /** + * A gadget that extends this event. Gadgets are deprecated; this structure is + * instead only used for returning birthday calendar metadata. + */ + export interface Gadget { + /** + * The gadget's display mode. Deprecated. Possible values are: + * + * - "icon" - The gadget displays next to the event's title in the calendar view. + * - "chip" - The gadget displays when the event is clicked. + */ + display?: string; + + /** + * The gadget's height in pixels. The height must be an integer greater than 0. + * Optional. Deprecated. + */ + height?: number; + + /** + * The gadget's icon URL. The URL scheme must be HTTPS. Deprecated. + */ + iconLink?: string; + + /** + * The gadget's URL. The URL scheme must be HTTPS. Deprecated. + */ + link?: string; + + /** + * Preferences. + */ + preferences?: Record; + + /** + * The gadget's title. Deprecated. + */ + title?: string; + + /** + * The gadget's type. Deprecated. + */ + type?: string; + + /** + * The gadget's width in pixels. The width must be an integer greater than 0. + * Optional. Deprecated. + */ + width?: number; + } + + /** + * The organizer of the event. If the organizer is also an attendee, this is + * indicated with a separate entry in attendees with the organizer field set to + * True. To change the organizer, use the move operation. Read-only, except when + * importing an event. + */ + export interface Organizer { + /** + * The organizer's Profile ID, if available. + */ + id?: string; + + /** + * The organizer's name, if available. + */ + displayName?: string; + + /** + * The organizer's email address, if available. It must be a valid email address as + * per RFC5322. + */ + email?: string; + + /** + * Whether the organizer corresponds to the calendar on which this copy of the + * event appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * For an instance of a recurring event, this is the time at which this event would + * start according to the recurrence data in the recurring event identified by + * recurringEventId. It uniquely identifies the instance within the recurring event + * series even if the instance was moved to a different time. Immutable. + */ + export interface OriginalStartTime { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Out of office event data. Used if eventType is outOfOffice. + */ + export interface OutOfOfficeProperties { + /** + * Whether to decline meeting invitations which overlap Out of office events. Valid + * values are declineNone, meaning that no meeting invitations are declined; + * declineAllConflictingInvitations, meaning that all conflicting meeting + * invitations that conflict with the event are declined; and + * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting + * invitations which arrive while the Out of office event is present are to be + * declined. + */ + autoDeclineMode?: string; + + /** + * Response message to set if an existing event or new invitation is automatically + * declined by Calendar. + */ + declineMessage?: string; + } + + /** + * Information about the event's reminders for the authenticated user. + */ + export interface Reminders { + /** + * If the event doesn't use the default reminders, this lists the reminders + * specific to the event, or, if not set, indicates that no reminders are set for + * this event. The maximum number of override reminders is 5. + */ + overrides?: Array; + + /** + * Whether the default reminders of the calendar apply to the event. + */ + useDefault?: boolean; + } + + export namespace Reminders { + export interface Override { + /** + * The method used by this reminder. Possible values are: + * + * - "email" - Reminders are sent via email. + * - "popup" - Reminders are sent via a UI popup. + * Required when adding a reminder. + */ + method?: string; + + /** + * Number of minutes before the start of the event when the reminder should + * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required + * when adding a reminder. + */ + minutes?: number; + } + } + + /** + * Source from which the event was created. For example, a web page, an email + * message or any document identifiable by an URL with HTTP or HTTPS scheme. Can + * only be seen or modified by the creator of the event. + */ + export interface Source { + /** + * Title of the source; for example a title of a web page or an email subject. + */ + title?: string; + + /** + * URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS. + */ + url?: string; + } + + /** + * The (inclusive) start time of the event. For a recurring event, this is the + * start time of the first instance. + */ + export interface Start { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Working location event data. + */ + export interface WorkingLocationProperties { + /** + * If present, specifies that the user is working from a custom location. + */ + customLocation?: WorkingLocationProperties.CustomLocation; + + /** + * If present, specifies that the user is working at home. + */ + homeOffice?: unknown; + + /** + * If present, specifies that the user is working from an office. + */ + officeLocation?: WorkingLocationProperties.OfficeLocation; + + /** + * Type of the working location. Possible values are: + * + * - "homeOffice" - The user is working at home. + * - "officeLocation" - The user is working from an office. + * - "customLocation" - The user is working from a custom location. Any details are + * specified in a sub-field of the specified name, but this field may be missing + * if empty. Any other fields are ignored. Required when adding working location + * properties. + */ + type?: string; + } + + export namespace WorkingLocationProperties { + /** + * If present, specifies that the user is working from a custom location. + */ + export interface CustomLocation { + /** + * An optional extra label for additional information. + */ + label?: string; + } + + /** + * If present, specifies that the user is working from an office. + */ + export interface OfficeLocation { + /** + * An optional building identifier. This should reference a building ID in the + * organization's Resources database. + */ + buildingId?: string; + + /** + * An optional desk identifier. + */ + deskId?: string; + + /** + * An optional floor identifier. + */ + floorId?: string; + + /** + * An optional floor section identifier. + */ + floorSectionId?: string; + + /** + * The office name that's displayed in Calendar Web and Mobile clients. We + * recommend you reference a building name in the organization's Resources + * database. + */ + label?: string; + } + } } export interface Events { - /** - * The user's access role for this calendar. Read-only. Possible values are: - * - * - "none" - The user has no access. - * - "freeBusyReader" - The user has read access to free/busy information. - * - "reader" - The user has read access to the calendar. Private events will - * appear to users with reader access, but event details will be hidden. - * - "writer" - The user has read and write access to the calendar. Private events - * will appear to users with writer access, and event details will be visible. - * - "owner" - The user has ownership of the calendar. This role has all of the - * permissions of the writer role with the additional ability to see and - * manipulate ACLs. - */ - accessRole?: string; - - /** - * The default reminders on the calendar for the authenticated user. These - * reminders apply to all events on this calendar that do not explicitly override - * them (i.e. do not have reminders.useDefault set to True). - */ - defaultReminders?: Array; - - /** - * Description of the calendar. Read-only. - */ - description?: string; - - /** - * ETag of the collection. - */ - etag?: string; - - /** - * List of events on the calendar. - */ - items?: Array; - - /** - * Type of the collection ("calendar#events"). - */ - kind?: string; - - /** - * Token used to access the next page of this result. Omitted if no further results - * are available, in which case nextSyncToken is provided. - */ - nextPageToken?: string; - - /** - * Token used at a later point in time to retrieve only the entries that have - * changed since this result was returned. Omitted if further results are - * available, in which case nextPageToken is provided. - */ - nextSyncToken?: string; - - /** - * Title of the calendar. Read-only. - */ - summary?: string; - - /** - * The time zone of the calendar. Read-only. - */ - timeZone?: string; - - /** - * Last modification time of the calendar (as a RFC3339 timestamp). Read-only. - */ - updated?: string; + /** + * The user's access role for this calendar. Read-only. Possible values are: + * + * - "none" - The user has no access. + * - "freeBusyReader" - The user has read access to free/busy information. + * - "reader" - The user has read access to the calendar. Private events will + * appear to users with reader access, but event details will be hidden. + * - "writer" - The user has read and write access to the calendar. Private events + * will appear to users with writer access, and event details will be visible. + * - "owner" - The user has ownership of the calendar. This role has all of the + * permissions of the writer role with the additional ability to see and + * manipulate ACLs. + */ + accessRole?: string; + + /** + * The default reminders on the calendar for the authenticated user. These + * reminders apply to all events on this calendar that do not explicitly override + * them (i.e. do not have reminders.useDefault set to True). + */ + defaultReminders?: Array; + + /** + * Description of the calendar. Read-only. + */ + description?: string; + + /** + * ETag of the collection. + */ + etag?: string; + + /** + * List of events on the calendar. + */ + items?: Array; + + /** + * Type of the collection ("calendar#events"). + */ + kind?: string; + + /** + * Token used to access the next page of this result. Omitted if no further results + * are available, in which case nextSyncToken is provided. + */ + nextPageToken?: string; + + /** + * Token used at a later point in time to retrieve only the entries that have + * changed since this result was returned. Omitted if further results are + * available, in which case nextPageToken is provided. + */ + nextSyncToken?: string; + + /** + * Title of the calendar. Read-only. + */ + summary?: string; + + /** + * The time zone of the calendar. Read-only. + */ + timeZone?: string; + + /** + * Last modification time of the calendar (as a RFC3339 timestamp). Read-only. + */ + updated?: string; } export namespace Events { - export interface DefaultReminder { - /** - * The method used by this reminder. Possible values are: - * - * - "email" - Reminders are sent via email. - * - "popup" - Reminders are sent via a UI popup. - * Required when adding a reminder. - */ - method?: string; - - /** - * Number of minutes before the start of the event when the reminder should - * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required - * when adding a reminder. - */ - minutes?: number; - } + export interface DefaultReminder { + /** + * The method used by this reminder. Possible values are: + * + * - "email" - Reminders are sent via email. + * - "popup" - Reminders are sent via a UI popup. + * Required when adding a reminder. + */ + method?: string; + + /** + * Number of minutes before the start of the event when the reminder should + * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required + * when adding a reminder. + */ + minutes?: number; + } } export interface EventCreateParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Version number of conference data supported by the API client. - * Version 0 assumes no conference data support and ignores conference data in the - * event's body. Version 1 enables support for copying of ConferenceData as well as - * for creating new conferences using the createRequest field of conferenceData. - * The default is 0. - */ - conferenceDataVersion?: number; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: The maximum number of attendees to include in the response. If - * there are more than the specified number of attendees, only the participant is - * returned. Optional. - */ - maxAttendees?: number; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use sendUpdates instead. - * - * Whether to send notifications about the creation of the new event. Note that - * some emails might still be sent even if you set the value to false. The default - * is false. - */ - sendNotifications?: boolean; - - /** - * Query param: Whether to send notifications about the creation of the new event. - * Note that some emails might still be sent. The default is false. - */ - sendUpdates?: "all" | "externalOnly" | "none"; - - /** - * Query param: Whether API client performing operation supports event attachments. - * Optional. The default is False. - */ - supportsAttachments?: boolean; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: Opaque identifier of the event. When creating new single or - * recurring events, you can specify their IDs. Provided IDs must follow these - * rules: - * - * - characters allowed in the ID are those used in base32hex encoding, i.e. - * lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938 - * - the length of the ID must be between 5 and 1024 characters - * - the ID must be unique per calendar Due to the globally distributed nature of - * the system, we cannot guarantee that ID collisions will be detected at event - * creation time. To minimize the risk of collisions we recommend using an - * established UUID algorithm such as one described in RFC4122. If you do not - * specify an ID, it will be automatically generated by the server. Note that the - * icalUID and the id are not identical and only one of them should be supplied - * at event creation time. One difference in their semantics is that in recurring - * events, all occurrences of one event have different ids while they all share - * the same icalUIDs. - */ - id?: string; - - /** - * Body param: Whether anyone can invite themselves to the event (deprecated). - * Optional. The default is False. - */ - anyoneCanAddSelf?: boolean; - - /** - * Body param: File attachments for the event. In order to modify attachments the - * supportsAttachments request parameter should be set to true. There can be at - * most 25 attachments per event, - */ - attachments?: Array; - - /** - * Body param: The attendees of the event. See the Events with attendees guide for - * more information on scheduling events with other calendar users. Service - * accounts need to use domain-wide delegation of authority to populate the - * attendee list. - */ - attendees?: Array; - - /** - * Body param: Whether attendees may have been omitted from the event's - * representation. When retrieving an event, this may be due to a restriction - * specified by the maxAttendee query parameter. When updating an event, this can - * be used to only update the participant's response. Optional. The default is - * False. - */ - attendeesOmitted?: boolean; - - /** - * Body param: The color of the event. This is an ID referring to an entry in the - * event section of the colors definition (see the colors endpoint). Optional. - */ - colorId?: string; - - /** - * Body param: The conference-related information, such as details of a Google Meet - * conference. To create new conference details use the createRequest field. To - * persist your changes, remember to set the conferenceDataVersion request - * parameter to 1 for all event modification requests. - */ - conferenceData?: EventCreateParams.ConferenceData; - - /** - * Body param: Creation time of the event (as a RFC3339 timestamp). Read-only. - */ - created?: string; - - /** - * Body param: The creator of the event. Read-only. - */ - creator?: EventCreateParams.Creator; - - /** - * Body param: Description of the event. Can contain HTML. Optional. - */ - description?: string; - - /** - * Body param: The (exclusive) end time of the event. For a recurring event, this - * is the end time of the first instance. - */ - end?: EventCreateParams.End; - - /** - * Body param: Whether the end time is actually unspecified. An end time is still - * provided for compatibility reasons, even if this attribute is set to True. The - * default is False. - */ - endTimeUnspecified?: boolean; - - /** - * Body param: ETag of the resource. - */ - etag?: string; - - /** - * Body param: Specific type of the event. This cannot be modified after the event - * is created. Possible values are: - * - * - "default" - A regular event or not further specified. - * - "outOfOffice" - An out-of-office event. - * - "focusTime" - A focus-time event. - * - "workingLocation" - A working location event. Currently, only "default " and - * "workingLocation" events can be created using the API. Extended support for - * other event types will be made available in later releases. - */ - eventType?: string; - - /** - * Body param: Extended properties of the event. - */ - extendedProperties?: EventCreateParams.ExtendedProperties; - - /** - * Body param: Focus Time event data. Used if eventType is focusTime. - */ - focusTimeProperties?: EventCreateParams.FocusTimeProperties; - - /** - * Body param: A gadget that extends this event. Gadgets are deprecated; this - * structure is instead only used for returning birthday calendar metadata. - */ - gadget?: EventCreateParams.Gadget; - - /** - * Body param: Whether attendees other than the organizer can invite others to the - * event. Optional. The default is True. - */ - guestsCanInviteOthers?: boolean; - - /** - * Body param: Whether attendees other than the organizer can modify the event. - * Optional. The default is False. - */ - guestsCanModify?: boolean; - - /** - * Body param: Whether attendees other than the organizer can see who the event's - * attendees are. Optional. The default is True. - */ - guestsCanSeeOtherGuests?: boolean; - - /** - * Body param: An absolute link to the Google Hangout associated with this event. - * Read-only. - */ - hangoutLink?: string; - - /** - * Body param: An absolute link to this event in the Google Calendar Web UI. - * Read-only. - */ - htmlLink?: string; - - /** - * Body param: Event unique identifier as defined in RFC5545. It is used to - * uniquely identify events accross calendaring systems and must be supplied when - * importing events via the import method. Note that the iCalUID and the id are not - * identical and only one of them should be supplied at event creation time. One - * difference in their semantics is that in recurring events, all occurrences of - * one event have different ids while they all share the same iCalUIDs. To retrieve - * an event using its iCalUID, call the events.list method using the iCalUID - * parameter. To retrieve an event using its id, call the events.get method. - */ - iCalUID?: string; - - /** - * Body param: Type of the resource ("calendar#event"). - */ - kind?: string; - - /** - * Body param: Geographic location of the event as free-form text. Optional. - */ - location?: string; - - /** - * Body param: Whether this is a locked event copy where no changes can be made to - * the main event fields "summary", "description", "location", "start", "end" or - * "recurrence". The default is False. Read-Only. - */ - locked?: boolean; - - /** - * Body param: The organizer of the event. If the organizer is also an attendee, - * this is indicated with a separate entry in attendees with the organizer field - * set to True. To change the organizer, use the move operation. Read-only, except - * when importing an event. - */ - organizer?: EventCreateParams.Organizer; - - /** - * Body param: For an instance of a recurring event, this is the time at which this - * event would start according to the recurrence data in the recurring event - * identified by recurringEventId. It uniquely identifies the instance within the - * recurring event series even if the instance was moved to a different time. - * Immutable. - */ - originalStartTime?: EventCreateParams.OriginalStartTime; - - /** - * Body param: Out of office event data. Used if eventType is outOfOffice. - */ - outOfOfficeProperties?: EventCreateParams.OutOfOfficeProperties; - - /** - * Body param: If set to True, Event propagation is disabled. Note that it is not - * the same thing as Private event properties. Optional. Immutable. The default is - * False. - */ - privateCopy?: boolean; - - /** - * Body param: List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, - * as specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in - * this field; event start and end times are specified in the start and end fields. - * This field is omitted for single events or instances of recurring events. - */ - recurrence?: Array; - - /** - * Body param: For an instance of a recurring event, this is the id of the - * recurring event to which this instance belongs. Immutable. - */ - recurringEventId?: string; - - /** - * Body param: Information about the event's reminders for the authenticated user. - */ - reminders?: EventCreateParams.Reminders; - - /** - * Body param: Sequence number as per iCalendar. - */ - sequence?: number; - - /** - * Body param: Source from which the event was created. For example, a web page, an - * email message or any document identifiable by an URL with HTTP or HTTPS scheme. - * Can only be seen or modified by the creator of the event. - */ - source?: EventCreateParams.Source; - - /** - * Body param: The (inclusive) start time of the event. For a recurring event, this - * is the start time of the first instance. - */ - start?: EventCreateParams.Start; - - /** - * Body param: Status of the event. Optional. Possible values are: - * - * - "confirmed" - The event is confirmed. This is the default status. - * - "tentative" - The event is tentatively confirmed. - * - "cancelled" - The event is cancelled (deleted). The list method returns - * cancelled events only on incremental sync (when syncToken or updatedMin are - * specified) or if the showDeleted flag is set to true. The get method always - * returns them. A cancelled status represents two different states depending on - * the event type: - * - Cancelled exceptions of an uncancelled recurring event indicate that this - * instance should no longer be presented to the user. Clients should store these - * events for the lifetime of the parent recurring event. Cancelled exceptions - * are only guaranteed to have values for the id, recurringEventId and - * originalStartTime fields populated. The other fields might be empty. - * - All other cancelled events represent deleted events. Clients should remove - * their locally synced copies. Such cancelled events will eventually disappear, - * so do not rely on them being available indefinitely. Deleted events are only - * guaranteed to have the id field populated. On the organizer's calendar, - * cancelled events continue to expose event details (summary, location, etc.) so - * that they can be restored (undeleted). Similarly, the events to which the user - * was invited and that they manually removed continue to provide details. - * However, incremental sync requests with showDeleted set to false will not - * return these details. If an event changes its organizer (for example via the - * move operation) and the original organizer is not on the attendee list, it - * will leave behind a cancelled event where only the id field is guaranteed to - * be populated. - */ - status?: string; - - /** - * Body param: Title of the event. - */ - summary?: string; - - /** - * Body param: Whether the event blocks time on the calendar. Optional. Possible - * values are: - * - * - "opaque" - Default value. The event does block time on the calendar. This is - * equivalent to setting Show me as to Busy in the Calendar UI. - * - "transparent" - The event does not block time on the calendar. This is - * equivalent to setting Show me as to Available in the Calendar UI. - */ - transparency?: string; - - /** - * Body param: Last modification time of the event (as a RFC3339 timestamp). - * Read-only. - */ - updated?: string; - - /** - * Body param: Visibility of the event. Optional. Possible values are: - * - * - "default" - Uses the default visibility for events on the calendar. This is - * the default value. - * - "public" - The event is public and event details are visible to all readers of - * the calendar. - * - "private" - The event is private and only event attendees may view event - * details. - * - "confidential" - The event is private. This value is provided for - * compatibility reasons. - */ - visibility?: string; - - /** - * Body param: Working location event data. - */ - workingLocationProperties?: EventCreateParams.WorkingLocationProperties; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Version number of conference data supported by the API client. + * Version 0 assumes no conference data support and ignores conference data in the + * event's body. Version 1 enables support for copying of ConferenceData as well as + * for creating new conferences using the createRequest field of conferenceData. + * The default is 0. + */ + conferenceDataVersion?: number; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: The maximum number of attendees to include in the response. If + * there are more than the specified number of attendees, only the participant is + * returned. Optional. + */ + maxAttendees?: number; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use sendUpdates instead. + * + * Whether to send notifications about the creation of the new event. Note that + * some emails might still be sent even if you set the value to false. The default + * is false. + */ + sendNotifications?: boolean; + + /** + * Query param: Whether to send notifications about the creation of the new event. + * Note that some emails might still be sent. The default is false. + */ + sendUpdates?: "all" | "externalOnly" | "none"; + + /** + * Query param: Whether API client performing operation supports event attachments. + * Optional. The default is False. + */ + supportsAttachments?: boolean; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: Opaque identifier of the event. When creating new single or + * recurring events, you can specify their IDs. Provided IDs must follow these + * rules: + * + * - characters allowed in the ID are those used in base32hex encoding, i.e. + * lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938 + * - the length of the ID must be between 5 and 1024 characters + * - the ID must be unique per calendar Due to the globally distributed nature of + * the system, we cannot guarantee that ID collisions will be detected at event + * creation time. To minimize the risk of collisions we recommend using an + * established UUID algorithm such as one described in RFC4122. If you do not + * specify an ID, it will be automatically generated by the server. Note that the + * icalUID and the id are not identical and only one of them should be supplied + * at event creation time. One difference in their semantics is that in recurring + * events, all occurrences of one event have different ids while they all share + * the same icalUIDs. + */ + id?: string; + + /** + * Body param: Whether anyone can invite themselves to the event (deprecated). + * Optional. The default is False. + */ + anyoneCanAddSelf?: boolean; + + /** + * Body param: File attachments for the event. In order to modify attachments the + * supportsAttachments request parameter should be set to true. There can be at + * most 25 attachments per event, + */ + attachments?: Array; + + /** + * Body param: The attendees of the event. See the Events with attendees guide for + * more information on scheduling events with other calendar users. Service + * accounts need to use domain-wide delegation of authority to populate the + * attendee list. + */ + attendees?: Array; + + /** + * Body param: Whether attendees may have been omitted from the event's + * representation. When retrieving an event, this may be due to a restriction + * specified by the maxAttendee query parameter. When updating an event, this can + * be used to only update the participant's response. Optional. The default is + * False. + */ + attendeesOmitted?: boolean; + + /** + * Body param: The color of the event. This is an ID referring to an entry in the + * event section of the colors definition (see the colors endpoint). Optional. + */ + colorId?: string; + + /** + * Body param: The conference-related information, such as details of a Google Meet + * conference. To create new conference details use the createRequest field. To + * persist your changes, remember to set the conferenceDataVersion request + * parameter to 1 for all event modification requests. + */ + conferenceData?: EventCreateParams.ConferenceData; + + /** + * Body param: Creation time of the event (as a RFC3339 timestamp). Read-only. + */ + created?: string; + + /** + * Body param: The creator of the event. Read-only. + */ + creator?: EventCreateParams.Creator; + + /** + * Body param: Description of the event. Can contain HTML. Optional. + */ + description?: string; + + /** + * Body param: The (exclusive) end time of the event. For a recurring event, this + * is the end time of the first instance. + */ + end?: EventCreateParams.End; + + /** + * Body param: Whether the end time is actually unspecified. An end time is still + * provided for compatibility reasons, even if this attribute is set to True. The + * default is False. + */ + endTimeUnspecified?: boolean; + + /** + * Body param: ETag of the resource. + */ + etag?: string; + + /** + * Body param: Specific type of the event. This cannot be modified after the event + * is created. Possible values are: + * + * - "default" - A regular event or not further specified. + * - "outOfOffice" - An out-of-office event. + * - "focusTime" - A focus-time event. + * - "workingLocation" - A working location event. Currently, only "default " and + * "workingLocation" events can be created using the API. Extended support for + * other event types will be made available in later releases. + */ + eventType?: string; + + /** + * Body param: Extended properties of the event. + */ + extendedProperties?: EventCreateParams.ExtendedProperties; + + /** + * Body param: Focus Time event data. Used if eventType is focusTime. + */ + focusTimeProperties?: EventCreateParams.FocusTimeProperties; + + /** + * Body param: A gadget that extends this event. Gadgets are deprecated; this + * structure is instead only used for returning birthday calendar metadata. + */ + gadget?: EventCreateParams.Gadget; + + /** + * Body param: Whether attendees other than the organizer can invite others to the + * event. Optional. The default is True. + */ + guestsCanInviteOthers?: boolean; + + /** + * Body param: Whether attendees other than the organizer can modify the event. + * Optional. The default is False. + */ + guestsCanModify?: boolean; + + /** + * Body param: Whether attendees other than the organizer can see who the event's + * attendees are. Optional. The default is True. + */ + guestsCanSeeOtherGuests?: boolean; + + /** + * Body param: An absolute link to the Google Hangout associated with this event. + * Read-only. + */ + hangoutLink?: string; + + /** + * Body param: An absolute link to this event in the Google Calendar Web UI. + * Read-only. + */ + htmlLink?: string; + + /** + * Body param: Event unique identifier as defined in RFC5545. It is used to + * uniquely identify events accross calendaring systems and must be supplied when + * importing events via the import method. Note that the iCalUID and the id are not + * identical and only one of them should be supplied at event creation time. One + * difference in their semantics is that in recurring events, all occurrences of + * one event have different ids while they all share the same iCalUIDs. To retrieve + * an event using its iCalUID, call the events.list method using the iCalUID + * parameter. To retrieve an event using its id, call the events.get method. + */ + iCalUID?: string; + + /** + * Body param: Type of the resource ("calendar#event"). + */ + kind?: string; + + /** + * Body param: Geographic location of the event as free-form text. Optional. + */ + location?: string; + + /** + * Body param: Whether this is a locked event copy where no changes can be made to + * the main event fields "summary", "description", "location", "start", "end" or + * "recurrence". The default is False. Read-Only. + */ + locked?: boolean; + + /** + * Body param: The organizer of the event. If the organizer is also an attendee, + * this is indicated with a separate entry in attendees with the organizer field + * set to True. To change the organizer, use the move operation. Read-only, except + * when importing an event. + */ + organizer?: EventCreateParams.Organizer; + + /** + * Body param: For an instance of a recurring event, this is the time at which this + * event would start according to the recurrence data in the recurring event + * identified by recurringEventId. It uniquely identifies the instance within the + * recurring event series even if the instance was moved to a different time. + * Immutable. + */ + originalStartTime?: EventCreateParams.OriginalStartTime; + + /** + * Body param: Out of office event data. Used if eventType is outOfOffice. + */ + outOfOfficeProperties?: EventCreateParams.OutOfOfficeProperties; + + /** + * Body param: If set to True, Event propagation is disabled. Note that it is not + * the same thing as Private event properties. Optional. Immutable. The default is + * False. + */ + privateCopy?: boolean; + + /** + * Body param: List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, + * as specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in + * this field; event start and end times are specified in the start and end fields. + * This field is omitted for single events or instances of recurring events. + */ + recurrence?: Array; + + /** + * Body param: For an instance of a recurring event, this is the id of the + * recurring event to which this instance belongs. Immutable. + */ + recurringEventId?: string; + + /** + * Body param: Information about the event's reminders for the authenticated user. + */ + reminders?: EventCreateParams.Reminders; + + /** + * Body param: Sequence number as per iCalendar. + */ + sequence?: number; + + /** + * Body param: Source from which the event was created. For example, a web page, an + * email message or any document identifiable by an URL with HTTP or HTTPS scheme. + * Can only be seen or modified by the creator of the event. + */ + source?: EventCreateParams.Source; + + /** + * Body param: The (inclusive) start time of the event. For a recurring event, this + * is the start time of the first instance. + */ + start?: EventCreateParams.Start; + + /** + * Body param: Status of the event. Optional. Possible values are: + * + * - "confirmed" - The event is confirmed. This is the default status. + * - "tentative" - The event is tentatively confirmed. + * - "cancelled" - The event is cancelled (deleted). The list method returns + * cancelled events only on incremental sync (when syncToken or updatedMin are + * specified) or if the showDeleted flag is set to true. The get method always + * returns them. A cancelled status represents two different states depending on + * the event type: + * - Cancelled exceptions of an uncancelled recurring event indicate that this + * instance should no longer be presented to the user. Clients should store these + * events for the lifetime of the parent recurring event. Cancelled exceptions + * are only guaranteed to have values for the id, recurringEventId and + * originalStartTime fields populated. The other fields might be empty. + * - All other cancelled events represent deleted events. Clients should remove + * their locally synced copies. Such cancelled events will eventually disappear, + * so do not rely on them being available indefinitely. Deleted events are only + * guaranteed to have the id field populated. On the organizer's calendar, + * cancelled events continue to expose event details (summary, location, etc.) so + * that they can be restored (undeleted). Similarly, the events to which the user + * was invited and that they manually removed continue to provide details. + * However, incremental sync requests with showDeleted set to false will not + * return these details. If an event changes its organizer (for example via the + * move operation) and the original organizer is not on the attendee list, it + * will leave behind a cancelled event where only the id field is guaranteed to + * be populated. + */ + status?: string; + + /** + * Body param: Title of the event. + */ + summary?: string; + + /** + * Body param: Whether the event blocks time on the calendar. Optional. Possible + * values are: + * + * - "opaque" - Default value. The event does block time on the calendar. This is + * equivalent to setting Show me as to Busy in the Calendar UI. + * - "transparent" - The event does not block time on the calendar. This is + * equivalent to setting Show me as to Available in the Calendar UI. + */ + transparency?: string; + + /** + * Body param: Last modification time of the event (as a RFC3339 timestamp). + * Read-only. + */ + updated?: string; + + /** + * Body param: Visibility of the event. Optional. Possible values are: + * + * - "default" - Uses the default visibility for events on the calendar. This is + * the default value. + * - "public" - The event is public and event details are visible to all readers of + * the calendar. + * - "private" - The event is private and only event attendees may view event + * details. + * - "confidential" - The event is private. This value is provided for + * compatibility reasons. + */ + visibility?: string; + + /** + * Body param: Working location event data. + */ + workingLocationProperties?: EventCreateParams.WorkingLocationProperties; } export namespace EventCreateParams { - export interface Attachment { - /** - * ID of the attached file. Read-only. For Google Drive files, this is the ID of - * the corresponding Files resource entry in the Drive API. - */ - fileId?: string; - - /** - * URL link to the attachment. For adding Google Drive file attachments use the - * same format as in alternateLink property of the Files resource in the Drive API. - * Required when adding an attachment. - */ - fileUrl?: string; - - /** - * URL link to the attachment's icon. This field can only be modified for custom - * third-party attachments. - */ - iconLink?: string; - - /** - * Internet media type (MIME type) of the attachment. - */ - mimeType?: string; - - /** - * Attachment title. - */ - title?: string; - } - - export interface Attendee { - /** - * The attendee's Profile ID, if available. - */ - id?: string; - - /** - * Number of additional guests. Optional. The default is 0. - */ - additionalGuests?: number; - - /** - * The attendee's response comment. Optional. - */ - comment?: string; - - /** - * The attendee's name, if available. Optional. - */ - displayName?: string; - - /** - * The attendee's email address, if available. This field must be present when - * adding an attendee. It must be a valid email address as per RFC5322. Required - * when adding an attendee. - */ - email?: string; - - /** - * Whether this is an optional attendee. Optional. The default is False. - */ - optional?: boolean; - - /** - * Whether the attendee is the organizer of the event. Read-only. The default is - * False. - */ - organizer?: boolean; - - /** - * Whether the attendee is a resource. Can only be set when the attendee is added - * to the event for the first time. Subsequent modifications are ignored. Optional. - * The default is False. - */ - resource?: boolean; - - /** - * The attendee's response status. Possible values are: - * - * - "needsAction" - The attendee has not responded to the invitation (recommended - * for new events). - * - "declined" - The attendee has declined the invitation. - * - "tentative" - The attendee has tentatively accepted the invitation. - * - "accepted" - The attendee has accepted the invitation. Warning: If you add an - * event using the values declined, tentative, or accepted, attendees with the - * "Add invitations to my calendar" setting set to "When I respond to invitation - * in email" won't see an event on their calendar unless they choose to change - * their invitation response in the event invitation email. - */ - responseStatus?: string; - - /** - * Whether this entry represents the calendar on which this copy of the event - * appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * The conference-related information, such as details of a Google Meet conference. - * To create new conference details use the createRequest field. To persist your - * changes, remember to set the conferenceDataVersion request parameter to 1 for - * all event modification requests. - */ - export interface ConferenceData { - /** - * The ID of the conference. Can be used by developers to keep track of - * conferences, should not be displayed to users. The ID value is formed - * differently for each conference solution type: - * - * - eventHangout: ID is not set. (This conference type is deprecated.) - * - eventNamedHangout: ID is the name of the Hangout. (This conference type is - * deprecated.) - * - hangoutsMeet: ID is the 10-letter meeting code, for example aaa-bbbb-ccc. - * - addOn: ID is defined by the third-party provider. Optional. - */ - conferenceId?: string; - - /** - * The conference solution, such as Google Meet. Unset for a conference with a - * failed create request. Either conferenceSolution and at least one entryPoint, or - * createRequest is required. - */ - conferenceSolution?: ConferenceData.ConferenceSolution; - - /** - * A request to generate a new conference and attach it to the event. The data is - * generated asynchronously. To see whether the data is present check the status - * field. Either conferenceSolution and at least one entryPoint, or createRequest - * is required. - */ - createRequest?: ConferenceData.CreateRequest; - - /** - * Information about individual conference entry points, such as URLs or phone - * numbers. All of them must belong to the same conference. Either - * conferenceSolution and at least one entryPoint, or createRequest is required. - */ - entryPoints?: Array; - - /** - * Additional notes (such as instructions from the domain administrator, legal - * notices) to display to the user. Can contain HTML. The maximum length is 2048 - * characters. Optional. - */ - notes?: string; - - /** - * Additional properties related to a conference. An example would be a - * solution-specific setting for enabling video streaming. - */ - parameters?: ConferenceData.Parameters; - - /** - * The signature of the conference data. Generated on server side. Unset for a - * conference with a failed create request. Optional for a conference with a - * pending create request. - */ - signature?: string; - } - - export namespace ConferenceData { - /** - * The conference solution, such as Google Meet. Unset for a conference with a - * failed create request. Either conferenceSolution and at least one entryPoint, or - * createRequest is required. - */ - export interface ConferenceSolution { - /** - * The user-visible icon for this solution. - */ - iconUri?: string; - - /** - * The key which can uniquely identify the conference solution for this event. - */ - key?: ConferenceSolution.Key; - - /** - * The user-visible name of this solution. Not localized. - */ - name?: string; - } - - export namespace ConferenceSolution { - /** - * The key which can uniquely identify the conference solution for this event. - */ - export interface Key { - /** - * The conference solution type. If a client encounters an unfamiliar or empty - * type, it should still be able to display the entry points. However, it should - * disallow modifications. The possible values are: - * - * - "eventHangout" for Hangouts for consumers (deprecated; existing events may - * show this conference solution type but new conferences cannot be created) - * - "eventNamedHangout" for classic Hangouts for Google Workspace users - * (deprecated; existing events may show this conference solution type but new - * conferences cannot be created) - * - "hangoutsMeet" for Google Meet (http://meet.google.com) - * - "addOn" for 3P conference providers - */ - type?: string; - } - } - - /** - * A request to generate a new conference and attach it to the event. The data is - * generated asynchronously. To see whether the data is present check the status - * field. Either conferenceSolution and at least one entryPoint, or createRequest - * is required. - */ - export interface CreateRequest { - /** - * The conference solution, such as Hangouts or Google Meet. - */ - conferenceSolutionKey?: CreateRequest.ConferenceSolutionKey; - - /** - * The client-generated unique ID for this request. Clients should regenerate this - * ID for every new request. If an ID provided is the same as for the previous - * request, the request is ignored. - */ - requestId?: string; - - /** - * The status of the conference create request. - */ - status?: CreateRequest.Status; - } - - export namespace CreateRequest { - /** - * The conference solution, such as Hangouts or Google Meet. - */ - export interface ConferenceSolutionKey { - /** - * The conference solution type. If a client encounters an unfamiliar or empty - * type, it should still be able to display the entry points. However, it should - * disallow modifications. The possible values are: - * - * - "eventHangout" for Hangouts for consumers (deprecated; existing events may - * show this conference solution type but new conferences cannot be created) - * - "eventNamedHangout" for classic Hangouts for Google Workspace users - * (deprecated; existing events may show this conference solution type but new - * conferences cannot be created) - * - "hangoutsMeet" for Google Meet (http://meet.google.com) - * - "addOn" for 3P conference providers - */ - type?: string; - } - - /** - * The status of the conference create request. - */ - export interface Status { - /** - * The current status of the conference create request. Read-only. The possible - * values are: - * - * - "pending": the conference create request is still being processed. - * - "success": the conference create request succeeded, the entry points are - * populated. - * - "failure": the conference create request failed, there are no entry points. - */ - statusCode?: string; - } - } - - export interface EntryPoint { - /** - * The access code to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - accessCode?: string; - - /** - * Features of the entry point, such as being toll or toll-free. One entry point - * can have multiple features. However, toll and toll-free cannot be both set on - * the same entry point. - */ - entryPointFeatures?: Array; - - /** - * The type of the conference entry point. Possible values are: - * - * - "video" - joining a conference over HTTP. A conference can have zero or one - * video entry point. - * - "phone" - joining a conference by dialing a phone number. A conference can - * have zero or more phone entry points. - * - "sip" - joining a conference over SIP. A conference can have zero or one sip - * entry point. - * - "more" - further conference joining instructions, for example additional phone - * numbers. A conference can have zero or one more entry point. A conference with - * only a more entry point is not a valid conference. - */ - entryPointType?: string; - - /** - * The label for the URI. Visible to end users. Not localized. The maximum length - * is 512 characters. Examples: - * - * - for video: meet.google.com/aaa-bbbb-ccc - * - for phone: +1 123 268 2601 - * - for sip: 12345678@altostrat.com - * - for more: should not be filled - * Optional. - */ - label?: string; - - /** - * The meeting code to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - meetingCode?: string; - - /** - * The passcode to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - */ - passcode?: string; - - /** - * The password to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - password?: string; - - /** - * The PIN to access the conference. The maximum length is 128 characters. When - * creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - pin?: string; - - /** - * The CLDR/ISO 3166 region code for the country associated with this phone access. - * Example: "SE" for Sweden. Calendar backend will populate this field only for - * EntryPointType.PHONE. - */ - regionCode?: string; - - /** - * The URI of the entry point. The maximum length is 1300 characters. Format: - * - * - for video, http: or https: schema is required. - * - for phone, tel: schema is required. The URI should include the entire dial - * sequence (e.g., tel:+12345678900,,,123456789;1234). - * - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com. - * - for more, http: or https: schema is required. - */ - uri?: string; - } - - /** - * Additional properties related to a conference. An example would be a - * solution-specific setting for enabling video streaming. - */ - export interface Parameters { - /** - * Additional add-on specific data. - */ - addOnParameters?: Parameters.AddOnParameters; - } - - export namespace Parameters { - /** - * Additional add-on specific data. - */ - export interface AddOnParameters { - parameters?: Record; - } - } - } - - /** - * The creator of the event. Read-only. - */ - export interface Creator { - /** - * The creator's Profile ID, if available. - */ - id?: string; - - /** - * The creator's name, if available. - */ - displayName?: string; - - /** - * The creator's email address, if available. - */ - email?: string; - - /** - * Whether the creator corresponds to the calendar on which this copy of the event - * appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * The (exclusive) end time of the event. For a recurring event, this is the end - * time of the first instance. - */ - export interface End { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Extended properties of the event. - */ - export interface ExtendedProperties { - /** - * Properties that are private to the copy of the event that appears on this - * calendar. - */ - private?: Record; - - /** - * Properties that are shared between copies of the event on other attendees' - * calendars. - */ - shared?: Record; - } - - /** - * Focus Time event data. Used if eventType is focusTime. - */ - export interface FocusTimeProperties { - /** - * Whether to decline meeting invitations which overlap Focus Time events. Valid - * values are declineNone, meaning that no meeting invitations are declined; - * declineAllConflictingInvitations, meaning that all conflicting meeting - * invitations that conflict with the event are declined; and - * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting - * invitations which arrive while the Focus Time event is present are to be - * declined. - */ - autoDeclineMode?: string; - - /** - * The status to mark the user in Chat and related products. This can be available - * or doNotDisturb. - */ - chatStatus?: string; - - /** - * Response message to set if an existing event or new invitation is automatically - * declined by Calendar. - */ - declineMessage?: string; - } - - /** - * A gadget that extends this event. Gadgets are deprecated; this structure is - * instead only used for returning birthday calendar metadata. - */ - export interface Gadget { - /** - * The gadget's display mode. Deprecated. Possible values are: - * - * - "icon" - The gadget displays next to the event's title in the calendar view. - * - "chip" - The gadget displays when the event is clicked. - */ - display?: string; - - /** - * The gadget's height in pixels. The height must be an integer greater than 0. - * Optional. Deprecated. - */ - height?: number; - - /** - * The gadget's icon URL. The URL scheme must be HTTPS. Deprecated. - */ - iconLink?: string; - - /** - * The gadget's URL. The URL scheme must be HTTPS. Deprecated. - */ - link?: string; - - /** - * Preferences. - */ - preferences?: Record; - - /** - * The gadget's title. Deprecated. - */ - title?: string; - - /** - * The gadget's type. Deprecated. - */ - type?: string; - - /** - * The gadget's width in pixels. The width must be an integer greater than 0. - * Optional. Deprecated. - */ - width?: number; - } - - /** - * The organizer of the event. If the organizer is also an attendee, this is - * indicated with a separate entry in attendees with the organizer field set to - * True. To change the organizer, use the move operation. Read-only, except when - * importing an event. - */ - export interface Organizer { - /** - * The organizer's Profile ID, if available. - */ - id?: string; - - /** - * The organizer's name, if available. - */ - displayName?: string; - - /** - * The organizer's email address, if available. It must be a valid email address as - * per RFC5322. - */ - email?: string; - - /** - * Whether the organizer corresponds to the calendar on which this copy of the - * event appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * For an instance of a recurring event, this is the time at which this event would - * start according to the recurrence data in the recurring event identified by - * recurringEventId. It uniquely identifies the instance within the recurring event - * series even if the instance was moved to a different time. Immutable. - */ - export interface OriginalStartTime { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Out of office event data. Used if eventType is outOfOffice. - */ - export interface OutOfOfficeProperties { - /** - * Whether to decline meeting invitations which overlap Out of office events. Valid - * values are declineNone, meaning that no meeting invitations are declined; - * declineAllConflictingInvitations, meaning that all conflicting meeting - * invitations that conflict with the event are declined; and - * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting - * invitations which arrive while the Out of office event is present are to be - * declined. - */ - autoDeclineMode?: string; - - /** - * Response message to set if an existing event or new invitation is automatically - * declined by Calendar. - */ - declineMessage?: string; - } - - /** - * Information about the event's reminders for the authenticated user. - */ - export interface Reminders { - /** - * If the event doesn't use the default reminders, this lists the reminders - * specific to the event, or, if not set, indicates that no reminders are set for - * this event. The maximum number of override reminders is 5. - */ - overrides?: Array; - - /** - * Whether the default reminders of the calendar apply to the event. - */ - useDefault?: boolean; - } - - export namespace Reminders { - export interface Override { - /** - * The method used by this reminder. Possible values are: - * - * - "email" - Reminders are sent via email. - * - "popup" - Reminders are sent via a UI popup. - * Required when adding a reminder. - */ - method?: string; - - /** - * Number of minutes before the start of the event when the reminder should - * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required - * when adding a reminder. - */ - minutes?: number; - } - } - - /** - * Source from which the event was created. For example, a web page, an email - * message or any document identifiable by an URL with HTTP or HTTPS scheme. Can - * only be seen or modified by the creator of the event. - */ - export interface Source { - /** - * Title of the source; for example a title of a web page or an email subject. - */ - title?: string; - - /** - * URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS. - */ - url?: string; - } - - /** - * The (inclusive) start time of the event. For a recurring event, this is the - * start time of the first instance. - */ - export interface Start { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Working location event data. - */ - export interface WorkingLocationProperties { - /** - * If present, specifies that the user is working from a custom location. - */ - customLocation?: WorkingLocationProperties.CustomLocation; - - /** - * If present, specifies that the user is working at home. - */ - homeOffice?: unknown; - - /** - * If present, specifies that the user is working from an office. - */ - officeLocation?: WorkingLocationProperties.OfficeLocation; - - /** - * Type of the working location. Possible values are: - * - * - "homeOffice" - The user is working at home. - * - "officeLocation" - The user is working from an office. - * - "customLocation" - The user is working from a custom location. Any details are - * specified in a sub-field of the specified name, but this field may be missing - * if empty. Any other fields are ignored. Required when adding working location - * properties. - */ - type?: string; - } - - export namespace WorkingLocationProperties { - /** - * If present, specifies that the user is working from a custom location. - */ - export interface CustomLocation { - /** - * An optional extra label for additional information. - */ - label?: string; - } - - /** - * If present, specifies that the user is working from an office. - */ - export interface OfficeLocation { - /** - * An optional building identifier. This should reference a building ID in the - * organization's Resources database. - */ - buildingId?: string; - - /** - * An optional desk identifier. - */ - deskId?: string; - - /** - * An optional floor identifier. - */ - floorId?: string; - - /** - * An optional floor section identifier. - */ - floorSectionId?: string; - - /** - * The office name that's displayed in Calendar Web and Mobile clients. We - * recommend you reference a building name in the organization's Resources - * database. - */ - label?: string; - } - } + export interface Attachment { + /** + * ID of the attached file. Read-only. For Google Drive files, this is the ID of + * the corresponding Files resource entry in the Drive API. + */ + fileId?: string; + + /** + * URL link to the attachment. For adding Google Drive file attachments use the + * same format as in alternateLink property of the Files resource in the Drive API. + * Required when adding an attachment. + */ + fileUrl?: string; + + /** + * URL link to the attachment's icon. This field can only be modified for custom + * third-party attachments. + */ + iconLink?: string; + + /** + * Internet media type (MIME type) of the attachment. + */ + mimeType?: string; + + /** + * Attachment title. + */ + title?: string; + } + + export interface Attendee { + /** + * The attendee's Profile ID, if available. + */ + id?: string; + + /** + * Number of additional guests. Optional. The default is 0. + */ + additionalGuests?: number; + + /** + * The attendee's response comment. Optional. + */ + comment?: string; + + /** + * The attendee's name, if available. Optional. + */ + displayName?: string; + + /** + * The attendee's email address, if available. This field must be present when + * adding an attendee. It must be a valid email address as per RFC5322. Required + * when adding an attendee. + */ + email?: string; + + /** + * Whether this is an optional attendee. Optional. The default is False. + */ + optional?: boolean; + + /** + * Whether the attendee is the organizer of the event. Read-only. The default is + * False. + */ + organizer?: boolean; + + /** + * Whether the attendee is a resource. Can only be set when the attendee is added + * to the event for the first time. Subsequent modifications are ignored. Optional. + * The default is False. + */ + resource?: boolean; + + /** + * The attendee's response status. Possible values are: + * + * - "needsAction" - The attendee has not responded to the invitation (recommended + * for new events). + * - "declined" - The attendee has declined the invitation. + * - "tentative" - The attendee has tentatively accepted the invitation. + * - "accepted" - The attendee has accepted the invitation. Warning: If you add an + * event using the values declined, tentative, or accepted, attendees with the + * "Add invitations to my calendar" setting set to "When I respond to invitation + * in email" won't see an event on their calendar unless they choose to change + * their invitation response in the event invitation email. + */ + responseStatus?: string; + + /** + * Whether this entry represents the calendar on which this copy of the event + * appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * The conference-related information, such as details of a Google Meet conference. + * To create new conference details use the createRequest field. To persist your + * changes, remember to set the conferenceDataVersion request parameter to 1 for + * all event modification requests. + */ + export interface ConferenceData { + /** + * The ID of the conference. Can be used by developers to keep track of + * conferences, should not be displayed to users. The ID value is formed + * differently for each conference solution type: + * + * - eventHangout: ID is not set. (This conference type is deprecated.) + * - eventNamedHangout: ID is the name of the Hangout. (This conference type is + * deprecated.) + * - hangoutsMeet: ID is the 10-letter meeting code, for example aaa-bbbb-ccc. + * - addOn: ID is defined by the third-party provider. Optional. + */ + conferenceId?: string; + + /** + * The conference solution, such as Google Meet. Unset for a conference with a + * failed create request. Either conferenceSolution and at least one entryPoint, or + * createRequest is required. + */ + conferenceSolution?: ConferenceData.ConferenceSolution; + + /** + * A request to generate a new conference and attach it to the event. The data is + * generated asynchronously. To see whether the data is present check the status + * field. Either conferenceSolution and at least one entryPoint, or createRequest + * is required. + */ + createRequest?: ConferenceData.CreateRequest; + + /** + * Information about individual conference entry points, such as URLs or phone + * numbers. All of them must belong to the same conference. Either + * conferenceSolution and at least one entryPoint, or createRequest is required. + */ + entryPoints?: Array; + + /** + * Additional notes (such as instructions from the domain administrator, legal + * notices) to display to the user. Can contain HTML. The maximum length is 2048 + * characters. Optional. + */ + notes?: string; + + /** + * Additional properties related to a conference. An example would be a + * solution-specific setting for enabling video streaming. + */ + parameters?: ConferenceData.Parameters; + + /** + * The signature of the conference data. Generated on server side. Unset for a + * conference with a failed create request. Optional for a conference with a + * pending create request. + */ + signature?: string; + } + + export namespace ConferenceData { + /** + * The conference solution, such as Google Meet. Unset for a conference with a + * failed create request. Either conferenceSolution and at least one entryPoint, or + * createRequest is required. + */ + export interface ConferenceSolution { + /** + * The user-visible icon for this solution. + */ + iconUri?: string; + + /** + * The key which can uniquely identify the conference solution for this event. + */ + key?: ConferenceSolution.Key; + + /** + * The user-visible name of this solution. Not localized. + */ + name?: string; + } + + export namespace ConferenceSolution { + /** + * The key which can uniquely identify the conference solution for this event. + */ + export interface Key { + /** + * The conference solution type. If a client encounters an unfamiliar or empty + * type, it should still be able to display the entry points. However, it should + * disallow modifications. The possible values are: + * + * - "eventHangout" for Hangouts for consumers (deprecated; existing events may + * show this conference solution type but new conferences cannot be created) + * - "eventNamedHangout" for classic Hangouts for Google Workspace users + * (deprecated; existing events may show this conference solution type but new + * conferences cannot be created) + * - "hangoutsMeet" for Google Meet (http://meet.google.com) + * - "addOn" for 3P conference providers + */ + type?: string; + } + } + + /** + * A request to generate a new conference and attach it to the event. The data is + * generated asynchronously. To see whether the data is present check the status + * field. Either conferenceSolution and at least one entryPoint, or createRequest + * is required. + */ + export interface CreateRequest { + /** + * The conference solution, such as Hangouts or Google Meet. + */ + conferenceSolutionKey?: CreateRequest.ConferenceSolutionKey; + + /** + * The client-generated unique ID for this request. Clients should regenerate this + * ID for every new request. If an ID provided is the same as for the previous + * request, the request is ignored. + */ + requestId?: string; + + /** + * The status of the conference create request. + */ + status?: CreateRequest.Status; + } + + export namespace CreateRequest { + /** + * The conference solution, such as Hangouts or Google Meet. + */ + export interface ConferenceSolutionKey { + /** + * The conference solution type. If a client encounters an unfamiliar or empty + * type, it should still be able to display the entry points. However, it should + * disallow modifications. The possible values are: + * + * - "eventHangout" for Hangouts for consumers (deprecated; existing events may + * show this conference solution type but new conferences cannot be created) + * - "eventNamedHangout" for classic Hangouts for Google Workspace users + * (deprecated; existing events may show this conference solution type but new + * conferences cannot be created) + * - "hangoutsMeet" for Google Meet (http://meet.google.com) + * - "addOn" for 3P conference providers + */ + type?: string; + } + + /** + * The status of the conference create request. + */ + export interface Status { + /** + * The current status of the conference create request. Read-only. The possible + * values are: + * + * - "pending": the conference create request is still being processed. + * - "success": the conference create request succeeded, the entry points are + * populated. + * - "failure": the conference create request failed, there are no entry points. + */ + statusCode?: string; + } + } + + export interface EntryPoint { + /** + * The access code to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + accessCode?: string; + + /** + * Features of the entry point, such as being toll or toll-free. One entry point + * can have multiple features. However, toll and toll-free cannot be both set on + * the same entry point. + */ + entryPointFeatures?: Array; + + /** + * The type of the conference entry point. Possible values are: + * + * - "video" - joining a conference over HTTP. A conference can have zero or one + * video entry point. + * - "phone" - joining a conference by dialing a phone number. A conference can + * have zero or more phone entry points. + * - "sip" - joining a conference over SIP. A conference can have zero or one sip + * entry point. + * - "more" - further conference joining instructions, for example additional phone + * numbers. A conference can have zero or one more entry point. A conference with + * only a more entry point is not a valid conference. + */ + entryPointType?: string; + + /** + * The label for the URI. Visible to end users. Not localized. The maximum length + * is 512 characters. Examples: + * + * - for video: meet.google.com/aaa-bbbb-ccc + * - for phone: +1 123 268 2601 + * - for sip: 12345678@altostrat.com + * - for more: should not be filled + * Optional. + */ + label?: string; + + /** + * The meeting code to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + meetingCode?: string; + + /** + * The passcode to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + */ + passcode?: string; + + /** + * The password to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + password?: string; + + /** + * The PIN to access the conference. The maximum length is 128 characters. When + * creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + pin?: string; + + /** + * The CLDR/ISO 3166 region code for the country associated with this phone access. + * Example: "SE" for Sweden. Calendar backend will populate this field only for + * EntryPointType.PHONE. + */ + regionCode?: string; + + /** + * The URI of the entry point. The maximum length is 1300 characters. Format: + * + * - for video, http: or https: schema is required. + * - for phone, tel: schema is required. The URI should include the entire dial + * sequence (e.g., tel:+12345678900,,,123456789;1234). + * - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com. + * - for more, http: or https: schema is required. + */ + uri?: string; + } + + /** + * Additional properties related to a conference. An example would be a + * solution-specific setting for enabling video streaming. + */ + export interface Parameters { + /** + * Additional add-on specific data. + */ + addOnParameters?: Parameters.AddOnParameters; + } + + export namespace Parameters { + /** + * Additional add-on specific data. + */ + export interface AddOnParameters { + parameters?: Record; + } + } + } + + /** + * The creator of the event. Read-only. + */ + export interface Creator { + /** + * The creator's Profile ID, if available. + */ + id?: string; + + /** + * The creator's name, if available. + */ + displayName?: string; + + /** + * The creator's email address, if available. + */ + email?: string; + + /** + * Whether the creator corresponds to the calendar on which this copy of the event + * appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * The (exclusive) end time of the event. For a recurring event, this is the end + * time of the first instance. + */ + export interface End { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Extended properties of the event. + */ + export interface ExtendedProperties { + /** + * Properties that are private to the copy of the event that appears on this + * calendar. + */ + private?: Record; + + /** + * Properties that are shared between copies of the event on other attendees' + * calendars. + */ + shared?: Record; + } + + /** + * Focus Time event data. Used if eventType is focusTime. + */ + export interface FocusTimeProperties { + /** + * Whether to decline meeting invitations which overlap Focus Time events. Valid + * values are declineNone, meaning that no meeting invitations are declined; + * declineAllConflictingInvitations, meaning that all conflicting meeting + * invitations that conflict with the event are declined; and + * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting + * invitations which arrive while the Focus Time event is present are to be + * declined. + */ + autoDeclineMode?: string; + + /** + * The status to mark the user in Chat and related products. This can be available + * or doNotDisturb. + */ + chatStatus?: string; + + /** + * Response message to set if an existing event or new invitation is automatically + * declined by Calendar. + */ + declineMessage?: string; + } + + /** + * A gadget that extends this event. Gadgets are deprecated; this structure is + * instead only used for returning birthday calendar metadata. + */ + export interface Gadget { + /** + * The gadget's display mode. Deprecated. Possible values are: + * + * - "icon" - The gadget displays next to the event's title in the calendar view. + * - "chip" - The gadget displays when the event is clicked. + */ + display?: string; + + /** + * The gadget's height in pixels. The height must be an integer greater than 0. + * Optional. Deprecated. + */ + height?: number; + + /** + * The gadget's icon URL. The URL scheme must be HTTPS. Deprecated. + */ + iconLink?: string; + + /** + * The gadget's URL. The URL scheme must be HTTPS. Deprecated. + */ + link?: string; + + /** + * Preferences. + */ + preferences?: Record; + + /** + * The gadget's title. Deprecated. + */ + title?: string; + + /** + * The gadget's type. Deprecated. + */ + type?: string; + + /** + * The gadget's width in pixels. The width must be an integer greater than 0. + * Optional. Deprecated. + */ + width?: number; + } + + /** + * The organizer of the event. If the organizer is also an attendee, this is + * indicated with a separate entry in attendees with the organizer field set to + * True. To change the organizer, use the move operation. Read-only, except when + * importing an event. + */ + export interface Organizer { + /** + * The organizer's Profile ID, if available. + */ + id?: string; + + /** + * The organizer's name, if available. + */ + displayName?: string; + + /** + * The organizer's email address, if available. It must be a valid email address as + * per RFC5322. + */ + email?: string; + + /** + * Whether the organizer corresponds to the calendar on which this copy of the + * event appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * For an instance of a recurring event, this is the time at which this event would + * start according to the recurrence data in the recurring event identified by + * recurringEventId. It uniquely identifies the instance within the recurring event + * series even if the instance was moved to a different time. Immutable. + */ + export interface OriginalStartTime { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Out of office event data. Used if eventType is outOfOffice. + */ + export interface OutOfOfficeProperties { + /** + * Whether to decline meeting invitations which overlap Out of office events. Valid + * values are declineNone, meaning that no meeting invitations are declined; + * declineAllConflictingInvitations, meaning that all conflicting meeting + * invitations that conflict with the event are declined; and + * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting + * invitations which arrive while the Out of office event is present are to be + * declined. + */ + autoDeclineMode?: string; + + /** + * Response message to set if an existing event or new invitation is automatically + * declined by Calendar. + */ + declineMessage?: string; + } + + /** + * Information about the event's reminders for the authenticated user. + */ + export interface Reminders { + /** + * If the event doesn't use the default reminders, this lists the reminders + * specific to the event, or, if not set, indicates that no reminders are set for + * this event. The maximum number of override reminders is 5. + */ + overrides?: Array; + + /** + * Whether the default reminders of the calendar apply to the event. + */ + useDefault?: boolean; + } + + export namespace Reminders { + export interface Override { + /** + * The method used by this reminder. Possible values are: + * + * - "email" - Reminders are sent via email. + * - "popup" - Reminders are sent via a UI popup. + * Required when adding a reminder. + */ + method?: string; + + /** + * Number of minutes before the start of the event when the reminder should + * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required + * when adding a reminder. + */ + minutes?: number; + } + } + + /** + * Source from which the event was created. For example, a web page, an email + * message or any document identifiable by an URL with HTTP or HTTPS scheme. Can + * only be seen or modified by the creator of the event. + */ + export interface Source { + /** + * Title of the source; for example a title of a web page or an email subject. + */ + title?: string; + + /** + * URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS. + */ + url?: string; + } + + /** + * The (inclusive) start time of the event. For a recurring event, this is the + * start time of the first instance. + */ + export interface Start { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Working location event data. + */ + export interface WorkingLocationProperties { + /** + * If present, specifies that the user is working from a custom location. + */ + customLocation?: WorkingLocationProperties.CustomLocation; + + /** + * If present, specifies that the user is working at home. + */ + homeOffice?: unknown; + + /** + * If present, specifies that the user is working from an office. + */ + officeLocation?: WorkingLocationProperties.OfficeLocation; + + /** + * Type of the working location. Possible values are: + * + * - "homeOffice" - The user is working at home. + * - "officeLocation" - The user is working from an office. + * - "customLocation" - The user is working from a custom location. Any details are + * specified in a sub-field of the specified name, but this field may be missing + * if empty. Any other fields are ignored. Required when adding working location + * properties. + */ + type?: string; + } + + export namespace WorkingLocationProperties { + /** + * If present, specifies that the user is working from a custom location. + */ + export interface CustomLocation { + /** + * An optional extra label for additional information. + */ + label?: string; + } + + /** + * If present, specifies that the user is working from an office. + */ + export interface OfficeLocation { + /** + * An optional building identifier. This should reference a building ID in the + * organization's Resources database. + */ + buildingId?: string; + + /** + * An optional desk identifier. + */ + deskId?: string; + + /** + * An optional floor identifier. + */ + floorId?: string; + + /** + * An optional floor section identifier. + */ + floorSectionId?: string; + + /** + * The office name that's displayed in Calendar Web and Mobile clients. We + * recommend you reference a building name in the organization's Resources + * database. + */ + label?: string; + } + } } export interface EventRetrieveParams { - /** - * Path param: Calendar identifier. To retrieve calendar IDs call the - * calendarList.list method. If you want to access the primary calendar of the - * currently logged in user, use the "primary" keyword. - */ - calendarId: string; - - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Deprecated and ignored. A value will always be returned in the - * email field for the organizer, creator and attendees, even if no real email - * address is available (i.e. a generated, non-working value will be provided). - */ - alwaysIncludeEmail?: boolean; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: The maximum number of attendees to include in the response. If - * there are more than the specified number of attendees, only the participant is - * returned. Optional. - */ - maxAttendees?: number; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Time zone used in the response. Optional. The default is the time - * zone of the calendar. - */ - timeZone?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Path param: Calendar identifier. To retrieve calendar IDs call the + * calendarList.list method. If you want to access the primary calendar of the + * currently logged in user, use the "primary" keyword. + */ + calendarId: string; + + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Deprecated and ignored. A value will always be returned in the + * email field for the organizer, creator and attendees, even if no real email + * address is available (i.e. a generated, non-working value will be provided). + */ + alwaysIncludeEmail?: boolean; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: The maximum number of attendees to include in the response. If + * there are more than the specified number of attendees, only the participant is + * returned. Optional. + */ + maxAttendees?: number; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Time zone used in the response. Optional. The default is the time + * zone of the calendar. + */ + timeZone?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface EventUpdateParams { - /** - * Path param: Calendar identifier. To retrieve calendar IDs call the - * calendarList.list method. If you want to access the primary calendar of the - * currently logged in user, use the "primary" keyword. - */ - calendarId: string; - - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Deprecated and ignored. A value will always be returned in the - * email field for the organizer, creator and attendees, even if no real email - * address is available (i.e. a generated, non-working value will be provided). - */ - alwaysIncludeEmail?: boolean; - - /** - * Query param: Version number of conference data supported by the API client. - * Version 0 assumes no conference data support and ignores conference data in the - * event's body. Version 1 enables support for copying of ConferenceData as well as - * for creating new conferences using the createRequest field of conferenceData. - * The default is 0. - */ - conferenceDataVersion?: number; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: The maximum number of attendees to include in the response. If - * there are more than the specified number of attendees, only the participant is - * returned. Optional. - */ - maxAttendees?: number; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use sendUpdates instead. - * - * Whether to send notifications about the event update (for example, description - * changes, etc.). Note that some emails might still be sent even if you set the - * value to false. The default is false. - */ - sendNotifications?: boolean; - - /** - * Query param: Guests who should receive notifications about the event update (for - * example, title changes, etc.). - */ - sendUpdates?: "all" | "externalOnly" | "none"; - - /** - * Query param: Whether API client performing operation supports event attachments. - * Optional. The default is False. - */ - supportsAttachments?: boolean; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: Opaque identifier of the event. When creating new single or - * recurring events, you can specify their IDs. Provided IDs must follow these - * rules: - * - * - characters allowed in the ID are those used in base32hex encoding, i.e. - * lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938 - * - the length of the ID must be between 5 and 1024 characters - * - the ID must be unique per calendar Due to the globally distributed nature of - * the system, we cannot guarantee that ID collisions will be detected at event - * creation time. To minimize the risk of collisions we recommend using an - * established UUID algorithm such as one described in RFC4122. If you do not - * specify an ID, it will be automatically generated by the server. Note that the - * icalUID and the id are not identical and only one of them should be supplied - * at event creation time. One difference in their semantics is that in recurring - * events, all occurrences of one event have different ids while they all share - * the same icalUIDs. - */ - id?: string; - - /** - * Body param: Whether anyone can invite themselves to the event (deprecated). - * Optional. The default is False. - */ - anyoneCanAddSelf?: boolean; - - /** - * Body param: File attachments for the event. In order to modify attachments the - * supportsAttachments request parameter should be set to true. There can be at - * most 25 attachments per event, - */ - attachments?: Array; - - /** - * Body param: The attendees of the event. See the Events with attendees guide for - * more information on scheduling events with other calendar users. Service - * accounts need to use domain-wide delegation of authority to populate the - * attendee list. - */ - attendees?: Array; - - /** - * Body param: Whether attendees may have been omitted from the event's - * representation. When retrieving an event, this may be due to a restriction - * specified by the maxAttendee query parameter. When updating an event, this can - * be used to only update the participant's response. Optional. The default is - * False. - */ - attendeesOmitted?: boolean; - - /** - * Body param: The color of the event. This is an ID referring to an entry in the - * event section of the colors definition (see the colors endpoint). Optional. - */ - colorId?: string; - - /** - * Body param: The conference-related information, such as details of a Google Meet - * conference. To create new conference details use the createRequest field. To - * persist your changes, remember to set the conferenceDataVersion request - * parameter to 1 for all event modification requests. - */ - conferenceData?: EventUpdateParams.ConferenceData; - - /** - * Body param: Creation time of the event (as a RFC3339 timestamp). Read-only. - */ - created?: string; - - /** - * Body param: The creator of the event. Read-only. - */ - creator?: EventUpdateParams.Creator; - - /** - * Body param: Description of the event. Can contain HTML. Optional. - */ - description?: string; - - /** - * Body param: The (exclusive) end time of the event. For a recurring event, this - * is the end time of the first instance. - */ - end?: EventUpdateParams.End; - - /** - * Body param: Whether the end time is actually unspecified. An end time is still - * provided for compatibility reasons, even if this attribute is set to True. The - * default is False. - */ - endTimeUnspecified?: boolean; - - /** - * Body param: ETag of the resource. - */ - etag?: string; - - /** - * Body param: Specific type of the event. This cannot be modified after the event - * is created. Possible values are: - * - * - "default" - A regular event or not further specified. - * - "outOfOffice" - An out-of-office event. - * - "focusTime" - A focus-time event. - * - "workingLocation" - A working location event. Currently, only "default " and - * "workingLocation" events can be created using the API. Extended support for - * other event types will be made available in later releases. - */ - eventType?: string; - - /** - * Body param: Extended properties of the event. - */ - extendedProperties?: EventUpdateParams.ExtendedProperties; - - /** - * Body param: Focus Time event data. Used if eventType is focusTime. - */ - focusTimeProperties?: EventUpdateParams.FocusTimeProperties; - - /** - * Body param: A gadget that extends this event. Gadgets are deprecated; this - * structure is instead only used for returning birthday calendar metadata. - */ - gadget?: EventUpdateParams.Gadget; - - /** - * Body param: Whether attendees other than the organizer can invite others to the - * event. Optional. The default is True. - */ - guestsCanInviteOthers?: boolean; - - /** - * Body param: Whether attendees other than the organizer can modify the event. - * Optional. The default is False. - */ - guestsCanModify?: boolean; - - /** - * Body param: Whether attendees other than the organizer can see who the event's - * attendees are. Optional. The default is True. - */ - guestsCanSeeOtherGuests?: boolean; - - /** - * Body param: An absolute link to the Google Hangout associated with this event. - * Read-only. - */ - hangoutLink?: string; - - /** - * Body param: An absolute link to this event in the Google Calendar Web UI. - * Read-only. - */ - htmlLink?: string; - - /** - * Body param: Event unique identifier as defined in RFC5545. It is used to - * uniquely identify events accross calendaring systems and must be supplied when - * importing events via the import method. Note that the iCalUID and the id are not - * identical and only one of them should be supplied at event creation time. One - * difference in their semantics is that in recurring events, all occurrences of - * one event have different ids while they all share the same iCalUIDs. To retrieve - * an event using its iCalUID, call the events.list method using the iCalUID - * parameter. To retrieve an event using its id, call the events.get method. - */ - iCalUID?: string; - - /** - * Body param: Type of the resource ("calendar#event"). - */ - kind?: string; - - /** - * Body param: Geographic location of the event as free-form text. Optional. - */ - location?: string; - - /** - * Body param: Whether this is a locked event copy where no changes can be made to - * the main event fields "summary", "description", "location", "start", "end" or - * "recurrence". The default is False. Read-Only. - */ - locked?: boolean; - - /** - * Body param: The organizer of the event. If the organizer is also an attendee, - * this is indicated with a separate entry in attendees with the organizer field - * set to True. To change the organizer, use the move operation. Read-only, except - * when importing an event. - */ - organizer?: EventUpdateParams.Organizer; - - /** - * Body param: For an instance of a recurring event, this is the time at which this - * event would start according to the recurrence data in the recurring event - * identified by recurringEventId. It uniquely identifies the instance within the - * recurring event series even if the instance was moved to a different time. - * Immutable. - */ - originalStartTime?: EventUpdateParams.OriginalStartTime; - - /** - * Body param: Out of office event data. Used if eventType is outOfOffice. - */ - outOfOfficeProperties?: EventUpdateParams.OutOfOfficeProperties; - - /** - * Body param: If set to True, Event propagation is disabled. Note that it is not - * the same thing as Private event properties. Optional. Immutable. The default is - * False. - */ - privateCopy?: boolean; - - /** - * Body param: List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, - * as specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in - * this field; event start and end times are specified in the start and end fields. - * This field is omitted for single events or instances of recurring events. - */ - recurrence?: Array; - - /** - * Body param: For an instance of a recurring event, this is the id of the - * recurring event to which this instance belongs. Immutable. - */ - recurringEventId?: string; - - /** - * Body param: Information about the event's reminders for the authenticated user. - */ - reminders?: EventUpdateParams.Reminders; - - /** - * Body param: Sequence number as per iCalendar. - */ - sequence?: number; - - /** - * Body param: Source from which the event was created. For example, a web page, an - * email message or any document identifiable by an URL with HTTP or HTTPS scheme. - * Can only be seen or modified by the creator of the event. - */ - source?: EventUpdateParams.Source; - - /** - * Body param: The (inclusive) start time of the event. For a recurring event, this - * is the start time of the first instance. - */ - start?: EventUpdateParams.Start; - - /** - * Body param: Status of the event. Optional. Possible values are: - * - * - "confirmed" - The event is confirmed. This is the default status. - * - "tentative" - The event is tentatively confirmed. - * - "cancelled" - The event is cancelled (deleted). The list method returns - * cancelled events only on incremental sync (when syncToken or updatedMin are - * specified) or if the showDeleted flag is set to true. The get method always - * returns them. A cancelled status represents two different states depending on - * the event type: - * - Cancelled exceptions of an uncancelled recurring event indicate that this - * instance should no longer be presented to the user. Clients should store these - * events for the lifetime of the parent recurring event. Cancelled exceptions - * are only guaranteed to have values for the id, recurringEventId and - * originalStartTime fields populated. The other fields might be empty. - * - All other cancelled events represent deleted events. Clients should remove - * their locally synced copies. Such cancelled events will eventually disappear, - * so do not rely on them being available indefinitely. Deleted events are only - * guaranteed to have the id field populated. On the organizer's calendar, - * cancelled events continue to expose event details (summary, location, etc.) so - * that they can be restored (undeleted). Similarly, the events to which the user - * was invited and that they manually removed continue to provide details. - * However, incremental sync requests with showDeleted set to false will not - * return these details. If an event changes its organizer (for example via the - * move operation) and the original organizer is not on the attendee list, it - * will leave behind a cancelled event where only the id field is guaranteed to - * be populated. - */ - status?: string; - - /** - * Body param: Title of the event. - */ - summary?: string; - - /** - * Body param: Whether the event blocks time on the calendar. Optional. Possible - * values are: - * - * - "opaque" - Default value. The event does block time on the calendar. This is - * equivalent to setting Show me as to Busy in the Calendar UI. - * - "transparent" - The event does not block time on the calendar. This is - * equivalent to setting Show me as to Available in the Calendar UI. - */ - transparency?: string; - - /** - * Body param: Last modification time of the event (as a RFC3339 timestamp). - * Read-only. - */ - updated?: string; - - /** - * Body param: Visibility of the event. Optional. Possible values are: - * - * - "default" - Uses the default visibility for events on the calendar. This is - * the default value. - * - "public" - The event is public and event details are visible to all readers of - * the calendar. - * - "private" - The event is private and only event attendees may view event - * details. - * - "confidential" - The event is private. This value is provided for - * compatibility reasons. - */ - visibility?: string; - - /** - * Body param: Working location event data. - */ - workingLocationProperties?: EventUpdateParams.WorkingLocationProperties; + /** + * Path param: Calendar identifier. To retrieve calendar IDs call the + * calendarList.list method. If you want to access the primary calendar of the + * currently logged in user, use the "primary" keyword. + */ + calendarId: string; + + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Deprecated and ignored. A value will always be returned in the + * email field for the organizer, creator and attendees, even if no real email + * address is available (i.e. a generated, non-working value will be provided). + */ + alwaysIncludeEmail?: boolean; + + /** + * Query param: Version number of conference data supported by the API client. + * Version 0 assumes no conference data support and ignores conference data in the + * event's body. Version 1 enables support for copying of ConferenceData as well as + * for creating new conferences using the createRequest field of conferenceData. + * The default is 0. + */ + conferenceDataVersion?: number; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: The maximum number of attendees to include in the response. If + * there are more than the specified number of attendees, only the participant is + * returned. Optional. + */ + maxAttendees?: number; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use sendUpdates instead. + * + * Whether to send notifications about the event update (for example, description + * changes, etc.). Note that some emails might still be sent even if you set the + * value to false. The default is false. + */ + sendNotifications?: boolean; + + /** + * Query param: Guests who should receive notifications about the event update (for + * example, title changes, etc.). + */ + sendUpdates?: "all" | "externalOnly" | "none"; + + /** + * Query param: Whether API client performing operation supports event attachments. + * Optional. The default is False. + */ + supportsAttachments?: boolean; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: Opaque identifier of the event. When creating new single or + * recurring events, you can specify their IDs. Provided IDs must follow these + * rules: + * + * - characters allowed in the ID are those used in base32hex encoding, i.e. + * lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938 + * - the length of the ID must be between 5 and 1024 characters + * - the ID must be unique per calendar Due to the globally distributed nature of + * the system, we cannot guarantee that ID collisions will be detected at event + * creation time. To minimize the risk of collisions we recommend using an + * established UUID algorithm such as one described in RFC4122. If you do not + * specify an ID, it will be automatically generated by the server. Note that the + * icalUID and the id are not identical and only one of them should be supplied + * at event creation time. One difference in their semantics is that in recurring + * events, all occurrences of one event have different ids while they all share + * the same icalUIDs. + */ + id?: string; + + /** + * Body param: Whether anyone can invite themselves to the event (deprecated). + * Optional. The default is False. + */ + anyoneCanAddSelf?: boolean; + + /** + * Body param: File attachments for the event. In order to modify attachments the + * supportsAttachments request parameter should be set to true. There can be at + * most 25 attachments per event, + */ + attachments?: Array; + + /** + * Body param: The attendees of the event. See the Events with attendees guide for + * more information on scheduling events with other calendar users. Service + * accounts need to use domain-wide delegation of authority to populate the + * attendee list. + */ + attendees?: Array; + + /** + * Body param: Whether attendees may have been omitted from the event's + * representation. When retrieving an event, this may be due to a restriction + * specified by the maxAttendee query parameter. When updating an event, this can + * be used to only update the participant's response. Optional. The default is + * False. + */ + attendeesOmitted?: boolean; + + /** + * Body param: The color of the event. This is an ID referring to an entry in the + * event section of the colors definition (see the colors endpoint). Optional. + */ + colorId?: string; + + /** + * Body param: The conference-related information, such as details of a Google Meet + * conference. To create new conference details use the createRequest field. To + * persist your changes, remember to set the conferenceDataVersion request + * parameter to 1 for all event modification requests. + */ + conferenceData?: EventUpdateParams.ConferenceData; + + /** + * Body param: Creation time of the event (as a RFC3339 timestamp). Read-only. + */ + created?: string; + + /** + * Body param: The creator of the event. Read-only. + */ + creator?: EventUpdateParams.Creator; + + /** + * Body param: Description of the event. Can contain HTML. Optional. + */ + description?: string; + + /** + * Body param: The (exclusive) end time of the event. For a recurring event, this + * is the end time of the first instance. + */ + end?: EventUpdateParams.End; + + /** + * Body param: Whether the end time is actually unspecified. An end time is still + * provided for compatibility reasons, even if this attribute is set to True. The + * default is False. + */ + endTimeUnspecified?: boolean; + + /** + * Body param: ETag of the resource. + */ + etag?: string; + + /** + * Body param: Specific type of the event. This cannot be modified after the event + * is created. Possible values are: + * + * - "default" - A regular event or not further specified. + * - "outOfOffice" - An out-of-office event. + * - "focusTime" - A focus-time event. + * - "workingLocation" - A working location event. Currently, only "default " and + * "workingLocation" events can be created using the API. Extended support for + * other event types will be made available in later releases. + */ + eventType?: string; + + /** + * Body param: Extended properties of the event. + */ + extendedProperties?: EventUpdateParams.ExtendedProperties; + + /** + * Body param: Focus Time event data. Used if eventType is focusTime. + */ + focusTimeProperties?: EventUpdateParams.FocusTimeProperties; + + /** + * Body param: A gadget that extends this event. Gadgets are deprecated; this + * structure is instead only used for returning birthday calendar metadata. + */ + gadget?: EventUpdateParams.Gadget; + + /** + * Body param: Whether attendees other than the organizer can invite others to the + * event. Optional. The default is True. + */ + guestsCanInviteOthers?: boolean; + + /** + * Body param: Whether attendees other than the organizer can modify the event. + * Optional. The default is False. + */ + guestsCanModify?: boolean; + + /** + * Body param: Whether attendees other than the organizer can see who the event's + * attendees are. Optional. The default is True. + */ + guestsCanSeeOtherGuests?: boolean; + + /** + * Body param: An absolute link to the Google Hangout associated with this event. + * Read-only. + */ + hangoutLink?: string; + + /** + * Body param: An absolute link to this event in the Google Calendar Web UI. + * Read-only. + */ + htmlLink?: string; + + /** + * Body param: Event unique identifier as defined in RFC5545. It is used to + * uniquely identify events accross calendaring systems and must be supplied when + * importing events via the import method. Note that the iCalUID and the id are not + * identical and only one of them should be supplied at event creation time. One + * difference in their semantics is that in recurring events, all occurrences of + * one event have different ids while they all share the same iCalUIDs. To retrieve + * an event using its iCalUID, call the events.list method using the iCalUID + * parameter. To retrieve an event using its id, call the events.get method. + */ + iCalUID?: string; + + /** + * Body param: Type of the resource ("calendar#event"). + */ + kind?: string; + + /** + * Body param: Geographic location of the event as free-form text. Optional. + */ + location?: string; + + /** + * Body param: Whether this is a locked event copy where no changes can be made to + * the main event fields "summary", "description", "location", "start", "end" or + * "recurrence". The default is False. Read-Only. + */ + locked?: boolean; + + /** + * Body param: The organizer of the event. If the organizer is also an attendee, + * this is indicated with a separate entry in attendees with the organizer field + * set to True. To change the organizer, use the move operation. Read-only, except + * when importing an event. + */ + organizer?: EventUpdateParams.Organizer; + + /** + * Body param: For an instance of a recurring event, this is the time at which this + * event would start according to the recurrence data in the recurring event + * identified by recurringEventId. It uniquely identifies the instance within the + * recurring event series even if the instance was moved to a different time. + * Immutable. + */ + originalStartTime?: EventUpdateParams.OriginalStartTime; + + /** + * Body param: Out of office event data. Used if eventType is outOfOffice. + */ + outOfOfficeProperties?: EventUpdateParams.OutOfOfficeProperties; + + /** + * Body param: If set to True, Event propagation is disabled. Note that it is not + * the same thing as Private event properties. Optional. Immutable. The default is + * False. + */ + privateCopy?: boolean; + + /** + * Body param: List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, + * as specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in + * this field; event start and end times are specified in the start and end fields. + * This field is omitted for single events or instances of recurring events. + */ + recurrence?: Array; + + /** + * Body param: For an instance of a recurring event, this is the id of the + * recurring event to which this instance belongs. Immutable. + */ + recurringEventId?: string; + + /** + * Body param: Information about the event's reminders for the authenticated user. + */ + reminders?: EventUpdateParams.Reminders; + + /** + * Body param: Sequence number as per iCalendar. + */ + sequence?: number; + + /** + * Body param: Source from which the event was created. For example, a web page, an + * email message or any document identifiable by an URL with HTTP or HTTPS scheme. + * Can only be seen or modified by the creator of the event. + */ + source?: EventUpdateParams.Source; + + /** + * Body param: The (inclusive) start time of the event. For a recurring event, this + * is the start time of the first instance. + */ + start?: EventUpdateParams.Start; + + /** + * Body param: Status of the event. Optional. Possible values are: + * + * - "confirmed" - The event is confirmed. This is the default status. + * - "tentative" - The event is tentatively confirmed. + * - "cancelled" - The event is cancelled (deleted). The list method returns + * cancelled events only on incremental sync (when syncToken or updatedMin are + * specified) or if the showDeleted flag is set to true. The get method always + * returns them. A cancelled status represents two different states depending on + * the event type: + * - Cancelled exceptions of an uncancelled recurring event indicate that this + * instance should no longer be presented to the user. Clients should store these + * events for the lifetime of the parent recurring event. Cancelled exceptions + * are only guaranteed to have values for the id, recurringEventId and + * originalStartTime fields populated. The other fields might be empty. + * - All other cancelled events represent deleted events. Clients should remove + * their locally synced copies. Such cancelled events will eventually disappear, + * so do not rely on them being available indefinitely. Deleted events are only + * guaranteed to have the id field populated. On the organizer's calendar, + * cancelled events continue to expose event details (summary, location, etc.) so + * that they can be restored (undeleted). Similarly, the events to which the user + * was invited and that they manually removed continue to provide details. + * However, incremental sync requests with showDeleted set to false will not + * return these details. If an event changes its organizer (for example via the + * move operation) and the original organizer is not on the attendee list, it + * will leave behind a cancelled event where only the id field is guaranteed to + * be populated. + */ + status?: string; + + /** + * Body param: Title of the event. + */ + summary?: string; + + /** + * Body param: Whether the event blocks time on the calendar. Optional. Possible + * values are: + * + * - "opaque" - Default value. The event does block time on the calendar. This is + * equivalent to setting Show me as to Busy in the Calendar UI. + * - "transparent" - The event does not block time on the calendar. This is + * equivalent to setting Show me as to Available in the Calendar UI. + */ + transparency?: string; + + /** + * Body param: Last modification time of the event (as a RFC3339 timestamp). + * Read-only. + */ + updated?: string; + + /** + * Body param: Visibility of the event. Optional. Possible values are: + * + * - "default" - Uses the default visibility for events on the calendar. This is + * the default value. + * - "public" - The event is public and event details are visible to all readers of + * the calendar. + * - "private" - The event is private and only event attendees may view event + * details. + * - "confidential" - The event is private. This value is provided for + * compatibility reasons. + */ + visibility?: string; + + /** + * Body param: Working location event data. + */ + workingLocationProperties?: EventUpdateParams.WorkingLocationProperties; } export namespace EventUpdateParams { - export interface Attachment { - /** - * ID of the attached file. Read-only. For Google Drive files, this is the ID of - * the corresponding Files resource entry in the Drive API. - */ - fileId?: string; - - /** - * URL link to the attachment. For adding Google Drive file attachments use the - * same format as in alternateLink property of the Files resource in the Drive API. - * Required when adding an attachment. - */ - fileUrl?: string; - - /** - * URL link to the attachment's icon. This field can only be modified for custom - * third-party attachments. - */ - iconLink?: string; - - /** - * Internet media type (MIME type) of the attachment. - */ - mimeType?: string; - - /** - * Attachment title. - */ - title?: string; - } - - export interface Attendee { - /** - * The attendee's Profile ID, if available. - */ - id?: string; - - /** - * Number of additional guests. Optional. The default is 0. - */ - additionalGuests?: number; - - /** - * The attendee's response comment. Optional. - */ - comment?: string; - - /** - * The attendee's name, if available. Optional. - */ - displayName?: string; - - /** - * The attendee's email address, if available. This field must be present when - * adding an attendee. It must be a valid email address as per RFC5322. Required - * when adding an attendee. - */ - email?: string; - - /** - * Whether this is an optional attendee. Optional. The default is False. - */ - optional?: boolean; - - /** - * Whether the attendee is the organizer of the event. Read-only. The default is - * False. - */ - organizer?: boolean; - - /** - * Whether the attendee is a resource. Can only be set when the attendee is added - * to the event for the first time. Subsequent modifications are ignored. Optional. - * The default is False. - */ - resource?: boolean; - - /** - * The attendee's response status. Possible values are: - * - * - "needsAction" - The attendee has not responded to the invitation (recommended - * for new events). - * - "declined" - The attendee has declined the invitation. - * - "tentative" - The attendee has tentatively accepted the invitation. - * - "accepted" - The attendee has accepted the invitation. Warning: If you add an - * event using the values declined, tentative, or accepted, attendees with the - * "Add invitations to my calendar" setting set to "When I respond to invitation - * in email" won't see an event on their calendar unless they choose to change - * their invitation response in the event invitation email. - */ - responseStatus?: string; - - /** - * Whether this entry represents the calendar on which this copy of the event - * appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * The conference-related information, such as details of a Google Meet conference. - * To create new conference details use the createRequest field. To persist your - * changes, remember to set the conferenceDataVersion request parameter to 1 for - * all event modification requests. - */ - export interface ConferenceData { - /** - * The ID of the conference. Can be used by developers to keep track of - * conferences, should not be displayed to users. The ID value is formed - * differently for each conference solution type: - * - * - eventHangout: ID is not set. (This conference type is deprecated.) - * - eventNamedHangout: ID is the name of the Hangout. (This conference type is - * deprecated.) - * - hangoutsMeet: ID is the 10-letter meeting code, for example aaa-bbbb-ccc. - * - addOn: ID is defined by the third-party provider. Optional. - */ - conferenceId?: string; - - /** - * The conference solution, such as Google Meet. Unset for a conference with a - * failed create request. Either conferenceSolution and at least one entryPoint, or - * createRequest is required. - */ - conferenceSolution?: ConferenceData.ConferenceSolution; - - /** - * A request to generate a new conference and attach it to the event. The data is - * generated asynchronously. To see whether the data is present check the status - * field. Either conferenceSolution and at least one entryPoint, or createRequest - * is required. - */ - createRequest?: ConferenceData.CreateRequest; - - /** - * Information about individual conference entry points, such as URLs or phone - * numbers. All of them must belong to the same conference. Either - * conferenceSolution and at least one entryPoint, or createRequest is required. - */ - entryPoints?: Array; - - /** - * Additional notes (such as instructions from the domain administrator, legal - * notices) to display to the user. Can contain HTML. The maximum length is 2048 - * characters. Optional. - */ - notes?: string; - - /** - * Additional properties related to a conference. An example would be a - * solution-specific setting for enabling video streaming. - */ - parameters?: ConferenceData.Parameters; - - /** - * The signature of the conference data. Generated on server side. Unset for a - * conference with a failed create request. Optional for a conference with a - * pending create request. - */ - signature?: string; - } - - export namespace ConferenceData { - /** - * The conference solution, such as Google Meet. Unset for a conference with a - * failed create request. Either conferenceSolution and at least one entryPoint, or - * createRequest is required. - */ - export interface ConferenceSolution { - /** - * The user-visible icon for this solution. - */ - iconUri?: string; - - /** - * The key which can uniquely identify the conference solution for this event. - */ - key?: ConferenceSolution.Key; - - /** - * The user-visible name of this solution. Not localized. - */ - name?: string; - } - - export namespace ConferenceSolution { - /** - * The key which can uniquely identify the conference solution for this event. - */ - export interface Key { - /** - * The conference solution type. If a client encounters an unfamiliar or empty - * type, it should still be able to display the entry points. However, it should - * disallow modifications. The possible values are: - * - * - "eventHangout" for Hangouts for consumers (deprecated; existing events may - * show this conference solution type but new conferences cannot be created) - * - "eventNamedHangout" for classic Hangouts for Google Workspace users - * (deprecated; existing events may show this conference solution type but new - * conferences cannot be created) - * - "hangoutsMeet" for Google Meet (http://meet.google.com) - * - "addOn" for 3P conference providers - */ - type?: string; - } - } - - /** - * A request to generate a new conference and attach it to the event. The data is - * generated asynchronously. To see whether the data is present check the status - * field. Either conferenceSolution and at least one entryPoint, or createRequest - * is required. - */ - export interface CreateRequest { - /** - * The conference solution, such as Hangouts or Google Meet. - */ - conferenceSolutionKey?: CreateRequest.ConferenceSolutionKey; - - /** - * The client-generated unique ID for this request. Clients should regenerate this - * ID for every new request. If an ID provided is the same as for the previous - * request, the request is ignored. - */ - requestId?: string; - - /** - * The status of the conference create request. - */ - status?: CreateRequest.Status; - } - - export namespace CreateRequest { - /** - * The conference solution, such as Hangouts or Google Meet. - */ - export interface ConferenceSolutionKey { - /** - * The conference solution type. If a client encounters an unfamiliar or empty - * type, it should still be able to display the entry points. However, it should - * disallow modifications. The possible values are: - * - * - "eventHangout" for Hangouts for consumers (deprecated; existing events may - * show this conference solution type but new conferences cannot be created) - * - "eventNamedHangout" for classic Hangouts for Google Workspace users - * (deprecated; existing events may show this conference solution type but new - * conferences cannot be created) - * - "hangoutsMeet" for Google Meet (http://meet.google.com) - * - "addOn" for 3P conference providers - */ - type?: string; - } - - /** - * The status of the conference create request. - */ - export interface Status { - /** - * The current status of the conference create request. Read-only. The possible - * values are: - * - * - "pending": the conference create request is still being processed. - * - "success": the conference create request succeeded, the entry points are - * populated. - * - "failure": the conference create request failed, there are no entry points. - */ - statusCode?: string; - } - } - - export interface EntryPoint { - /** - * The access code to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - accessCode?: string; - - /** - * Features of the entry point, such as being toll or toll-free. One entry point - * can have multiple features. However, toll and toll-free cannot be both set on - * the same entry point. - */ - entryPointFeatures?: Array; - - /** - * The type of the conference entry point. Possible values are: - * - * - "video" - joining a conference over HTTP. A conference can have zero or one - * video entry point. - * - "phone" - joining a conference by dialing a phone number. A conference can - * have zero or more phone entry points. - * - "sip" - joining a conference over SIP. A conference can have zero or one sip - * entry point. - * - "more" - further conference joining instructions, for example additional phone - * numbers. A conference can have zero or one more entry point. A conference with - * only a more entry point is not a valid conference. - */ - entryPointType?: string; - - /** - * The label for the URI. Visible to end users. Not localized. The maximum length - * is 512 characters. Examples: - * - * - for video: meet.google.com/aaa-bbbb-ccc - * - for phone: +1 123 268 2601 - * - for sip: 12345678@altostrat.com - * - for more: should not be filled - * Optional. - */ - label?: string; - - /** - * The meeting code to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - meetingCode?: string; - - /** - * The passcode to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - */ - passcode?: string; - - /** - * The password to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - password?: string; - - /** - * The PIN to access the conference. The maximum length is 128 characters. When - * creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - pin?: string; - - /** - * The CLDR/ISO 3166 region code for the country associated with this phone access. - * Example: "SE" for Sweden. Calendar backend will populate this field only for - * EntryPointType.PHONE. - */ - regionCode?: string; - - /** - * The URI of the entry point. The maximum length is 1300 characters. Format: - * - * - for video, http: or https: schema is required. - * - for phone, tel: schema is required. The URI should include the entire dial - * sequence (e.g., tel:+12345678900,,,123456789;1234). - * - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com. - * - for more, http: or https: schema is required. - */ - uri?: string; - } - - /** - * Additional properties related to a conference. An example would be a - * solution-specific setting for enabling video streaming. - */ - export interface Parameters { - /** - * Additional add-on specific data. - */ - addOnParameters?: Parameters.AddOnParameters; - } - - export namespace Parameters { - /** - * Additional add-on specific data. - */ - export interface AddOnParameters { - parameters?: Record; - } - } - } - - /** - * The creator of the event. Read-only. - */ - export interface Creator { - /** - * The creator's Profile ID, if available. - */ - id?: string; - - /** - * The creator's name, if available. - */ - displayName?: string; - - /** - * The creator's email address, if available. - */ - email?: string; - - /** - * Whether the creator corresponds to the calendar on which this copy of the event - * appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * The (exclusive) end time of the event. For a recurring event, this is the end - * time of the first instance. - */ - export interface End { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Extended properties of the event. - */ - export interface ExtendedProperties { - /** - * Properties that are private to the copy of the event that appears on this - * calendar. - */ - private?: Record; - - /** - * Properties that are shared between copies of the event on other attendees' - * calendars. - */ - shared?: Record; - } - - /** - * Focus Time event data. Used if eventType is focusTime. - */ - export interface FocusTimeProperties { - /** - * Whether to decline meeting invitations which overlap Focus Time events. Valid - * values are declineNone, meaning that no meeting invitations are declined; - * declineAllConflictingInvitations, meaning that all conflicting meeting - * invitations that conflict with the event are declined; and - * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting - * invitations which arrive while the Focus Time event is present are to be - * declined. - */ - autoDeclineMode?: string; - - /** - * The status to mark the user in Chat and related products. This can be available - * or doNotDisturb. - */ - chatStatus?: string; - - /** - * Response message to set if an existing event or new invitation is automatically - * declined by Calendar. - */ - declineMessage?: string; - } - - /** - * A gadget that extends this event. Gadgets are deprecated; this structure is - * instead only used for returning birthday calendar metadata. - */ - export interface Gadget { - /** - * The gadget's display mode. Deprecated. Possible values are: - * - * - "icon" - The gadget displays next to the event's title in the calendar view. - * - "chip" - The gadget displays when the event is clicked. - */ - display?: string; - - /** - * The gadget's height in pixels. The height must be an integer greater than 0. - * Optional. Deprecated. - */ - height?: number; - - /** - * The gadget's icon URL. The URL scheme must be HTTPS. Deprecated. - */ - iconLink?: string; - - /** - * The gadget's URL. The URL scheme must be HTTPS. Deprecated. - */ - link?: string; - - /** - * Preferences. - */ - preferences?: Record; - - /** - * The gadget's title. Deprecated. - */ - title?: string; - - /** - * The gadget's type. Deprecated. - */ - type?: string; - - /** - * The gadget's width in pixels. The width must be an integer greater than 0. - * Optional. Deprecated. - */ - width?: number; - } - - /** - * The organizer of the event. If the organizer is also an attendee, this is - * indicated with a separate entry in attendees with the organizer field set to - * True. To change the organizer, use the move operation. Read-only, except when - * importing an event. - */ - export interface Organizer { - /** - * The organizer's Profile ID, if available. - */ - id?: string; - - /** - * The organizer's name, if available. - */ - displayName?: string; - - /** - * The organizer's email address, if available. It must be a valid email address as - * per RFC5322. - */ - email?: string; - - /** - * Whether the organizer corresponds to the calendar on which this copy of the - * event appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * For an instance of a recurring event, this is the time at which this event would - * start according to the recurrence data in the recurring event identified by - * recurringEventId. It uniquely identifies the instance within the recurring event - * series even if the instance was moved to a different time. Immutable. - */ - export interface OriginalStartTime { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Out of office event data. Used if eventType is outOfOffice. - */ - export interface OutOfOfficeProperties { - /** - * Whether to decline meeting invitations which overlap Out of office events. Valid - * values are declineNone, meaning that no meeting invitations are declined; - * declineAllConflictingInvitations, meaning that all conflicting meeting - * invitations that conflict with the event are declined; and - * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting - * invitations which arrive while the Out of office event is present are to be - * declined. - */ - autoDeclineMode?: string; - - /** - * Response message to set if an existing event or new invitation is automatically - * declined by Calendar. - */ - declineMessage?: string; - } - - /** - * Information about the event's reminders for the authenticated user. - */ - export interface Reminders { - /** - * If the event doesn't use the default reminders, this lists the reminders - * specific to the event, or, if not set, indicates that no reminders are set for - * this event. The maximum number of override reminders is 5. - */ - overrides?: Array; - - /** - * Whether the default reminders of the calendar apply to the event. - */ - useDefault?: boolean; - } - - export namespace Reminders { - export interface Override { - /** - * The method used by this reminder. Possible values are: - * - * - "email" - Reminders are sent via email. - * - "popup" - Reminders are sent via a UI popup. - * Required when adding a reminder. - */ - method?: string; - - /** - * Number of minutes before the start of the event when the reminder should - * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required - * when adding a reminder. - */ - minutes?: number; - } - } - - /** - * Source from which the event was created. For example, a web page, an email - * message or any document identifiable by an URL with HTTP or HTTPS scheme. Can - * only be seen or modified by the creator of the event. - */ - export interface Source { - /** - * Title of the source; for example a title of a web page or an email subject. - */ - title?: string; - - /** - * URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS. - */ - url?: string; - } - - /** - * The (inclusive) start time of the event. For a recurring event, this is the - * start time of the first instance. - */ - export interface Start { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Working location event data. - */ - export interface WorkingLocationProperties { - /** - * If present, specifies that the user is working from a custom location. - */ - customLocation?: WorkingLocationProperties.CustomLocation; - - /** - * If present, specifies that the user is working at home. - */ - homeOffice?: unknown; - - /** - * If present, specifies that the user is working from an office. - */ - officeLocation?: WorkingLocationProperties.OfficeLocation; - - /** - * Type of the working location. Possible values are: - * - * - "homeOffice" - The user is working at home. - * - "officeLocation" - The user is working from an office. - * - "customLocation" - The user is working from a custom location. Any details are - * specified in a sub-field of the specified name, but this field may be missing - * if empty. Any other fields are ignored. Required when adding working location - * properties. - */ - type?: string; - } - - export namespace WorkingLocationProperties { - /** - * If present, specifies that the user is working from a custom location. - */ - export interface CustomLocation { - /** - * An optional extra label for additional information. - */ - label?: string; - } - - /** - * If present, specifies that the user is working from an office. - */ - export interface OfficeLocation { - /** - * An optional building identifier. This should reference a building ID in the - * organization's Resources database. - */ - buildingId?: string; - - /** - * An optional desk identifier. - */ - deskId?: string; - - /** - * An optional floor identifier. - */ - floorId?: string; - - /** - * An optional floor section identifier. - */ - floorSectionId?: string; - - /** - * The office name that's displayed in Calendar Web and Mobile clients. We - * recommend you reference a building name in the organization's Resources - * database. - */ - label?: string; - } - } + export interface Attachment { + /** + * ID of the attached file. Read-only. For Google Drive files, this is the ID of + * the corresponding Files resource entry in the Drive API. + */ + fileId?: string; + + /** + * URL link to the attachment. For adding Google Drive file attachments use the + * same format as in alternateLink property of the Files resource in the Drive API. + * Required when adding an attachment. + */ + fileUrl?: string; + + /** + * URL link to the attachment's icon. This field can only be modified for custom + * third-party attachments. + */ + iconLink?: string; + + /** + * Internet media type (MIME type) of the attachment. + */ + mimeType?: string; + + /** + * Attachment title. + */ + title?: string; + } + + export interface Attendee { + /** + * The attendee's Profile ID, if available. + */ + id?: string; + + /** + * Number of additional guests. Optional. The default is 0. + */ + additionalGuests?: number; + + /** + * The attendee's response comment. Optional. + */ + comment?: string; + + /** + * The attendee's name, if available. Optional. + */ + displayName?: string; + + /** + * The attendee's email address, if available. This field must be present when + * adding an attendee. It must be a valid email address as per RFC5322. Required + * when adding an attendee. + */ + email?: string; + + /** + * Whether this is an optional attendee. Optional. The default is False. + */ + optional?: boolean; + + /** + * Whether the attendee is the organizer of the event. Read-only. The default is + * False. + */ + organizer?: boolean; + + /** + * Whether the attendee is a resource. Can only be set when the attendee is added + * to the event for the first time. Subsequent modifications are ignored. Optional. + * The default is False. + */ + resource?: boolean; + + /** + * The attendee's response status. Possible values are: + * + * - "needsAction" - The attendee has not responded to the invitation (recommended + * for new events). + * - "declined" - The attendee has declined the invitation. + * - "tentative" - The attendee has tentatively accepted the invitation. + * - "accepted" - The attendee has accepted the invitation. Warning: If you add an + * event using the values declined, tentative, or accepted, attendees with the + * "Add invitations to my calendar" setting set to "When I respond to invitation + * in email" won't see an event on their calendar unless they choose to change + * their invitation response in the event invitation email. + */ + responseStatus?: string; + + /** + * Whether this entry represents the calendar on which this copy of the event + * appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * The conference-related information, such as details of a Google Meet conference. + * To create new conference details use the createRequest field. To persist your + * changes, remember to set the conferenceDataVersion request parameter to 1 for + * all event modification requests. + */ + export interface ConferenceData { + /** + * The ID of the conference. Can be used by developers to keep track of + * conferences, should not be displayed to users. The ID value is formed + * differently for each conference solution type: + * + * - eventHangout: ID is not set. (This conference type is deprecated.) + * - eventNamedHangout: ID is the name of the Hangout. (This conference type is + * deprecated.) + * - hangoutsMeet: ID is the 10-letter meeting code, for example aaa-bbbb-ccc. + * - addOn: ID is defined by the third-party provider. Optional. + */ + conferenceId?: string; + + /** + * The conference solution, such as Google Meet. Unset for a conference with a + * failed create request. Either conferenceSolution and at least one entryPoint, or + * createRequest is required. + */ + conferenceSolution?: ConferenceData.ConferenceSolution; + + /** + * A request to generate a new conference and attach it to the event. The data is + * generated asynchronously. To see whether the data is present check the status + * field. Either conferenceSolution and at least one entryPoint, or createRequest + * is required. + */ + createRequest?: ConferenceData.CreateRequest; + + /** + * Information about individual conference entry points, such as URLs or phone + * numbers. All of them must belong to the same conference. Either + * conferenceSolution and at least one entryPoint, or createRequest is required. + */ + entryPoints?: Array; + + /** + * Additional notes (such as instructions from the domain administrator, legal + * notices) to display to the user. Can contain HTML. The maximum length is 2048 + * characters. Optional. + */ + notes?: string; + + /** + * Additional properties related to a conference. An example would be a + * solution-specific setting for enabling video streaming. + */ + parameters?: ConferenceData.Parameters; + + /** + * The signature of the conference data. Generated on server side. Unset for a + * conference with a failed create request. Optional for a conference with a + * pending create request. + */ + signature?: string; + } + + export namespace ConferenceData { + /** + * The conference solution, such as Google Meet. Unset for a conference with a + * failed create request. Either conferenceSolution and at least one entryPoint, or + * createRequest is required. + */ + export interface ConferenceSolution { + /** + * The user-visible icon for this solution. + */ + iconUri?: string; + + /** + * The key which can uniquely identify the conference solution for this event. + */ + key?: ConferenceSolution.Key; + + /** + * The user-visible name of this solution. Not localized. + */ + name?: string; + } + + export namespace ConferenceSolution { + /** + * The key which can uniquely identify the conference solution for this event. + */ + export interface Key { + /** + * The conference solution type. If a client encounters an unfamiliar or empty + * type, it should still be able to display the entry points. However, it should + * disallow modifications. The possible values are: + * + * - "eventHangout" for Hangouts for consumers (deprecated; existing events may + * show this conference solution type but new conferences cannot be created) + * - "eventNamedHangout" for classic Hangouts for Google Workspace users + * (deprecated; existing events may show this conference solution type but new + * conferences cannot be created) + * - "hangoutsMeet" for Google Meet (http://meet.google.com) + * - "addOn" for 3P conference providers + */ + type?: string; + } + } + + /** + * A request to generate a new conference and attach it to the event. The data is + * generated asynchronously. To see whether the data is present check the status + * field. Either conferenceSolution and at least one entryPoint, or createRequest + * is required. + */ + export interface CreateRequest { + /** + * The conference solution, such as Hangouts or Google Meet. + */ + conferenceSolutionKey?: CreateRequest.ConferenceSolutionKey; + + /** + * The client-generated unique ID for this request. Clients should regenerate this + * ID for every new request. If an ID provided is the same as for the previous + * request, the request is ignored. + */ + requestId?: string; + + /** + * The status of the conference create request. + */ + status?: CreateRequest.Status; + } + + export namespace CreateRequest { + /** + * The conference solution, such as Hangouts or Google Meet. + */ + export interface ConferenceSolutionKey { + /** + * The conference solution type. If a client encounters an unfamiliar or empty + * type, it should still be able to display the entry points. However, it should + * disallow modifications. The possible values are: + * + * - "eventHangout" for Hangouts for consumers (deprecated; existing events may + * show this conference solution type but new conferences cannot be created) + * - "eventNamedHangout" for classic Hangouts for Google Workspace users + * (deprecated; existing events may show this conference solution type but new + * conferences cannot be created) + * - "hangoutsMeet" for Google Meet (http://meet.google.com) + * - "addOn" for 3P conference providers + */ + type?: string; + } + + /** + * The status of the conference create request. + */ + export interface Status { + /** + * The current status of the conference create request. Read-only. The possible + * values are: + * + * - "pending": the conference create request is still being processed. + * - "success": the conference create request succeeded, the entry points are + * populated. + * - "failure": the conference create request failed, there are no entry points. + */ + statusCode?: string; + } + } + + export interface EntryPoint { + /** + * The access code to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + accessCode?: string; + + /** + * Features of the entry point, such as being toll or toll-free. One entry point + * can have multiple features. However, toll and toll-free cannot be both set on + * the same entry point. + */ + entryPointFeatures?: Array; + + /** + * The type of the conference entry point. Possible values are: + * + * - "video" - joining a conference over HTTP. A conference can have zero or one + * video entry point. + * - "phone" - joining a conference by dialing a phone number. A conference can + * have zero or more phone entry points. + * - "sip" - joining a conference over SIP. A conference can have zero or one sip + * entry point. + * - "more" - further conference joining instructions, for example additional phone + * numbers. A conference can have zero or one more entry point. A conference with + * only a more entry point is not a valid conference. + */ + entryPointType?: string; + + /** + * The label for the URI. Visible to end users. Not localized. The maximum length + * is 512 characters. Examples: + * + * - for video: meet.google.com/aaa-bbbb-ccc + * - for phone: +1 123 268 2601 + * - for sip: 12345678@altostrat.com + * - for more: should not be filled + * Optional. + */ + label?: string; + + /** + * The meeting code to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + meetingCode?: string; + + /** + * The passcode to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + */ + passcode?: string; + + /** + * The password to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + password?: string; + + /** + * The PIN to access the conference. The maximum length is 128 characters. When + * creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + pin?: string; + + /** + * The CLDR/ISO 3166 region code for the country associated with this phone access. + * Example: "SE" for Sweden. Calendar backend will populate this field only for + * EntryPointType.PHONE. + */ + regionCode?: string; + + /** + * The URI of the entry point. The maximum length is 1300 characters. Format: + * + * - for video, http: or https: schema is required. + * - for phone, tel: schema is required. The URI should include the entire dial + * sequence (e.g., tel:+12345678900,,,123456789;1234). + * - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com. + * - for more, http: or https: schema is required. + */ + uri?: string; + } + + /** + * Additional properties related to a conference. An example would be a + * solution-specific setting for enabling video streaming. + */ + export interface Parameters { + /** + * Additional add-on specific data. + */ + addOnParameters?: Parameters.AddOnParameters; + } + + export namespace Parameters { + /** + * Additional add-on specific data. + */ + export interface AddOnParameters { + parameters?: Record; + } + } + } + + /** + * The creator of the event. Read-only. + */ + export interface Creator { + /** + * The creator's Profile ID, if available. + */ + id?: string; + + /** + * The creator's name, if available. + */ + displayName?: string; + + /** + * The creator's email address, if available. + */ + email?: string; + + /** + * Whether the creator corresponds to the calendar on which this copy of the event + * appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * The (exclusive) end time of the event. For a recurring event, this is the end + * time of the first instance. + */ + export interface End { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Extended properties of the event. + */ + export interface ExtendedProperties { + /** + * Properties that are private to the copy of the event that appears on this + * calendar. + */ + private?: Record; + + /** + * Properties that are shared between copies of the event on other attendees' + * calendars. + */ + shared?: Record; + } + + /** + * Focus Time event data. Used if eventType is focusTime. + */ + export interface FocusTimeProperties { + /** + * Whether to decline meeting invitations which overlap Focus Time events. Valid + * values are declineNone, meaning that no meeting invitations are declined; + * declineAllConflictingInvitations, meaning that all conflicting meeting + * invitations that conflict with the event are declined; and + * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting + * invitations which arrive while the Focus Time event is present are to be + * declined. + */ + autoDeclineMode?: string; + + /** + * The status to mark the user in Chat and related products. This can be available + * or doNotDisturb. + */ + chatStatus?: string; + + /** + * Response message to set if an existing event or new invitation is automatically + * declined by Calendar. + */ + declineMessage?: string; + } + + /** + * A gadget that extends this event. Gadgets are deprecated; this structure is + * instead only used for returning birthday calendar metadata. + */ + export interface Gadget { + /** + * The gadget's display mode. Deprecated. Possible values are: + * + * - "icon" - The gadget displays next to the event's title in the calendar view. + * - "chip" - The gadget displays when the event is clicked. + */ + display?: string; + + /** + * The gadget's height in pixels. The height must be an integer greater than 0. + * Optional. Deprecated. + */ + height?: number; + + /** + * The gadget's icon URL. The URL scheme must be HTTPS. Deprecated. + */ + iconLink?: string; + + /** + * The gadget's URL. The URL scheme must be HTTPS. Deprecated. + */ + link?: string; + + /** + * Preferences. + */ + preferences?: Record; + + /** + * The gadget's title. Deprecated. + */ + title?: string; + + /** + * The gadget's type. Deprecated. + */ + type?: string; + + /** + * The gadget's width in pixels. The width must be an integer greater than 0. + * Optional. Deprecated. + */ + width?: number; + } + + /** + * The organizer of the event. If the organizer is also an attendee, this is + * indicated with a separate entry in attendees with the organizer field set to + * True. To change the organizer, use the move operation. Read-only, except when + * importing an event. + */ + export interface Organizer { + /** + * The organizer's Profile ID, if available. + */ + id?: string; + + /** + * The organizer's name, if available. + */ + displayName?: string; + + /** + * The organizer's email address, if available. It must be a valid email address as + * per RFC5322. + */ + email?: string; + + /** + * Whether the organizer corresponds to the calendar on which this copy of the + * event appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * For an instance of a recurring event, this is the time at which this event would + * start according to the recurrence data in the recurring event identified by + * recurringEventId. It uniquely identifies the instance within the recurring event + * series even if the instance was moved to a different time. Immutable. + */ + export interface OriginalStartTime { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Out of office event data. Used if eventType is outOfOffice. + */ + export interface OutOfOfficeProperties { + /** + * Whether to decline meeting invitations which overlap Out of office events. Valid + * values are declineNone, meaning that no meeting invitations are declined; + * declineAllConflictingInvitations, meaning that all conflicting meeting + * invitations that conflict with the event are declined; and + * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting + * invitations which arrive while the Out of office event is present are to be + * declined. + */ + autoDeclineMode?: string; + + /** + * Response message to set if an existing event or new invitation is automatically + * declined by Calendar. + */ + declineMessage?: string; + } + + /** + * Information about the event's reminders for the authenticated user. + */ + export interface Reminders { + /** + * If the event doesn't use the default reminders, this lists the reminders + * specific to the event, or, if not set, indicates that no reminders are set for + * this event. The maximum number of override reminders is 5. + */ + overrides?: Array; + + /** + * Whether the default reminders of the calendar apply to the event. + */ + useDefault?: boolean; + } + + export namespace Reminders { + export interface Override { + /** + * The method used by this reminder. Possible values are: + * + * - "email" - Reminders are sent via email. + * - "popup" - Reminders are sent via a UI popup. + * Required when adding a reminder. + */ + method?: string; + + /** + * Number of minutes before the start of the event when the reminder should + * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required + * when adding a reminder. + */ + minutes?: number; + } + } + + /** + * Source from which the event was created. For example, a web page, an email + * message or any document identifiable by an URL with HTTP or HTTPS scheme. Can + * only be seen or modified by the creator of the event. + */ + export interface Source { + /** + * Title of the source; for example a title of a web page or an email subject. + */ + title?: string; + + /** + * URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS. + */ + url?: string; + } + + /** + * The (inclusive) start time of the event. For a recurring event, this is the + * start time of the first instance. + */ + export interface Start { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Working location event data. + */ + export interface WorkingLocationProperties { + /** + * If present, specifies that the user is working from a custom location. + */ + customLocation?: WorkingLocationProperties.CustomLocation; + + /** + * If present, specifies that the user is working at home. + */ + homeOffice?: unknown; + + /** + * If present, specifies that the user is working from an office. + */ + officeLocation?: WorkingLocationProperties.OfficeLocation; + + /** + * Type of the working location. Possible values are: + * + * - "homeOffice" - The user is working at home. + * - "officeLocation" - The user is working from an office. + * - "customLocation" - The user is working from a custom location. Any details are + * specified in a sub-field of the specified name, but this field may be missing + * if empty. Any other fields are ignored. Required when adding working location + * properties. + */ + type?: string; + } + + export namespace WorkingLocationProperties { + /** + * If present, specifies that the user is working from a custom location. + */ + export interface CustomLocation { + /** + * An optional extra label for additional information. + */ + label?: string; + } + + /** + * If present, specifies that the user is working from an office. + */ + export interface OfficeLocation { + /** + * An optional building identifier. This should reference a building ID in the + * organization's Resources database. + */ + buildingId?: string; + + /** + * An optional desk identifier. + */ + deskId?: string; + + /** + * An optional floor identifier. + */ + floorId?: string; + + /** + * An optional floor section identifier. + */ + floorSectionId?: string; + + /** + * The office name that's displayed in Calendar Web and Mobile clients. We + * recommend you reference a building name in the organization's Resources + * database. + */ + label?: string; + } + } } export interface EventListParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Deprecated and ignored. - */ - alwaysIncludeEmail?: boolean; - - /** - * Event types to return. Optional. This parameter can be repeated multiple times - * to return events of different types. The default is ["default", "focusTime", - * "outOfOffice"]. - */ - eventTypes?: Array< - "default" | "focusTime" | "outOfOffice" | "workingLocation" - >; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Specifies an event ID in the iCalendar format to be provided in the response. - * Optional. Use this if you want to search for an event by its iCalendar ID. - */ - iCalUID?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * The maximum number of attendees to include in the response. If there are more - * than the specified number of attendees, only the participant is returned. - * Optional. - */ - maxAttendees?: number; - - /** - * Maximum number of events returned on one result page. The number of events in - * the resulting page may be less than this value, or none at all, even if there - * are more events matching the query. Incomplete pages can be detected by a - * non-empty nextPageToken field in the response. By default the value is 250 - * events. The page size can never be larger than 2500 events. Optional. - */ - maxResults?: number; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * The order of the events returned in the result. Optional. The default is an - * unspecified, stable order. - */ - orderBy?: "startTime" | "updated"; - - /** - * Token specifying which result page to return. Optional. - */ - pageToken?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Extended properties constraint specified as propertyName=value. Matches only - * private properties. This parameter might be repeated multiple times to return - * events that match all given constraints. - */ - privateExtendedProperty?: Array; - - /** - * Free text search terms to find events that match these terms in the following - * fields: - * - * - summary - * - description - * - location - * - attendee's displayName - * - attendee's email - * - organizer's displayName - * - organizer's email - * - workingLocationProperties.officeLocation.buildingId - * - workingLocationProperties.officeLocation.deskId - * - workingLocationProperties.officeLocation.label - * - workingLocationProperties.customLocation.label These search terms also match - * predefined keywords against all display title translations of working - * location, out-of-office, and focus-time events. For example, searching for - * "Office" or "Bureau" returns working location events of type officeLocation, - * whereas searching for "Out of office" or "Abwesend" returns out-of-office - * events. Optional. - */ - q?: string; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Extended properties constraint specified as propertyName=value. Matches only - * shared properties. This parameter might be repeated multiple times to return - * events that match all given constraints. - */ - sharedExtendedProperty?: Array; - - /** - * Whether to include deleted events (with status equals "cancelled") in the - * result. Cancelled instances of recurring events (but not the underlying - * recurring event) will still be included if showDeleted and singleEvents are both - * False. If showDeleted and singleEvents are both True, only single instances of - * deleted events (but not the underlying recurring events) are returned. Optional. - * The default is False. - */ - showDeleted?: boolean; - - /** - * Whether to include hidden invitations in the result. Optional. The default is - * False. - */ - showHiddenInvitations?: boolean; - - /** - * Whether to expand recurring events into instances and only return single one-off - * events and instances of recurring events, but not the underlying recurring - * events themselves. Optional. The default is False. - */ - singleEvents?: boolean; - - /** - * Token obtained from the nextSyncToken field returned on the last page of results - * from the previous list request. It makes the result of this list request contain - * only entries that have changed since then. All events deleted since the previous - * list request will always be in the result set and it is not allowed to set - * showDeleted to False. There are several query parameters that cannot be - * specified together with nextSyncToken to ensure consistency of the client state. - * - * These are: - * - * - iCalUID - * - orderBy - * - privateExtendedProperty - * - q - * - sharedExtendedProperty - * - timeMin - * - timeMax - * - updatedMin All other query parameters should be the same as for the initial - * synchronization to avoid undefined behavior. If the syncToken expires, the - * server will respond with a 410 GONE response code and the client should clear - * its storage and perform a full synchronization without any syncToken. Learn - * more about incremental synchronization. Optional. The default is to return all - * entries. - */ - syncToken?: string; - - /** - * Upper bound (exclusive) for an event's start time to filter by. Optional. The - * default is not to filter by start time. Must be an RFC3339 timestamp with - * mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, - * 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMin - * is set, timeMax must be greater than timeMin. - */ - timeMax?: string; - - /** - * Lower bound (exclusive) for an event's end time to filter by. Optional. The - * default is not to filter by end time. Must be an RFC3339 timestamp with - * mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, - * 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMax - * is set, timeMin must be smaller than timeMax. - */ - timeMin?: string; - - /** - * Time zone used in the response. Optional. The default is the time zone of the - * calendar. - */ - timeZone?: string; - - /** - * Lower bound for an event's last modification time (as a RFC3339 timestamp) to - * filter by. When specified, entries deleted since this time will always be - * included regardless of showDeleted. Optional. The default is not to filter by - * last modification time. - */ - updatedMin?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Deprecated and ignored. + */ + alwaysIncludeEmail?: boolean; + + /** + * Event types to return. Optional. This parameter can be repeated multiple times + * to return events of different types. The default is ["default", "focusTime", + * "outOfOffice"]. + */ + eventTypes?: Array<"default" | "focusTime" | "outOfOffice" | "workingLocation">; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Specifies an event ID in the iCalendar format to be provided in the response. + * Optional. Use this if you want to search for an event by its iCalendar ID. + */ + iCalUID?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * The maximum number of attendees to include in the response. If there are more + * than the specified number of attendees, only the participant is returned. + * Optional. + */ + maxAttendees?: number; + + /** + * Maximum number of events returned on one result page. The number of events in + * the resulting page may be less than this value, or none at all, even if there + * are more events matching the query. Incomplete pages can be detected by a + * non-empty nextPageToken field in the response. By default the value is 250 + * events. The page size can never be larger than 2500 events. Optional. + */ + maxResults?: number; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * The order of the events returned in the result. Optional. The default is an + * unspecified, stable order. + */ + orderBy?: "startTime" | "updated"; + + /** + * Token specifying which result page to return. Optional. + */ + pageToken?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Extended properties constraint specified as propertyName=value. Matches only + * private properties. This parameter might be repeated multiple times to return + * events that match all given constraints. + */ + privateExtendedProperty?: Array; + + /** + * Free text search terms to find events that match these terms in the following + * fields: + * + * - summary + * - description + * - location + * - attendee's displayName + * - attendee's email + * - organizer's displayName + * - organizer's email + * - workingLocationProperties.officeLocation.buildingId + * - workingLocationProperties.officeLocation.deskId + * - workingLocationProperties.officeLocation.label + * - workingLocationProperties.customLocation.label These search terms also match + * predefined keywords against all display title translations of working + * location, out-of-office, and focus-time events. For example, searching for + * "Office" or "Bureau" returns working location events of type officeLocation, + * whereas searching for "Out of office" or "Abwesend" returns out-of-office + * events. Optional. + */ + q?: string; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Extended properties constraint specified as propertyName=value. Matches only + * shared properties. This parameter might be repeated multiple times to return + * events that match all given constraints. + */ + sharedExtendedProperty?: Array; + + /** + * Whether to include deleted events (with status equals "cancelled") in the + * result. Cancelled instances of recurring events (but not the underlying + * recurring event) will still be included if showDeleted and singleEvents are both + * False. If showDeleted and singleEvents are both True, only single instances of + * deleted events (but not the underlying recurring events) are returned. Optional. + * The default is False. + */ + showDeleted?: boolean; + + /** + * Whether to include hidden invitations in the result. Optional. The default is + * False. + */ + showHiddenInvitations?: boolean; + + /** + * Whether to expand recurring events into instances and only return single one-off + * events and instances of recurring events, but not the underlying recurring + * events themselves. Optional. The default is False. + */ + singleEvents?: boolean; + + /** + * Token obtained from the nextSyncToken field returned on the last page of results + * from the previous list request. It makes the result of this list request contain + * only entries that have changed since then. All events deleted since the previous + * list request will always be in the result set and it is not allowed to set + * showDeleted to False. There are several query parameters that cannot be + * specified together with nextSyncToken to ensure consistency of the client state. + * + * These are: + * + * - iCalUID + * - orderBy + * - privateExtendedProperty + * - q + * - sharedExtendedProperty + * - timeMin + * - timeMax + * - updatedMin All other query parameters should be the same as for the initial + * synchronization to avoid undefined behavior. If the syncToken expires, the + * server will respond with a 410 GONE response code and the client should clear + * its storage and perform a full synchronization without any syncToken. Learn + * more about incremental synchronization. Optional. The default is to return all + * entries. + */ + syncToken?: string; + + /** + * Upper bound (exclusive) for an event's start time to filter by. Optional. The + * default is not to filter by start time. Must be an RFC3339 timestamp with + * mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, + * 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMin + * is set, timeMax must be greater than timeMin. + */ + timeMax?: string; + + /** + * Lower bound (exclusive) for an event's end time to filter by. Optional. The + * default is not to filter by end time. Must be an RFC3339 timestamp with + * mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, + * 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMax + * is set, timeMin must be smaller than timeMax. + */ + timeMin?: string; + + /** + * Time zone used in the response. Optional. The default is the time zone of the + * calendar. + */ + timeZone?: string; + + /** + * Lower bound for an event's last modification time (as a RFC3339 timestamp) to + * filter by. When specified, entries deleted since this time will always be + * included regardless of showDeleted. Optional. The default is not to filter by + * last modification time. + */ + updatedMin?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface EventDeleteParams { - /** - * Path param: Calendar identifier. To retrieve calendar IDs call the - * calendarList.list method. If you want to access the primary calendar of the - * currently logged in user, use the "primary" keyword. - */ - calendarId: string; - - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use sendUpdates instead. - * - * Whether to send notifications about the deletion of the event. Note that some - * emails might still be sent even if you set the value to false. The default is - * false. - */ - sendNotifications?: boolean; - - /** - * Query param: Guests who should receive notifications about the deletion of the - * event. - */ - sendUpdates?: "all" | "externalOnly" | "none"; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Path param: Calendar identifier. To retrieve calendar IDs call the + * calendarList.list method. If you want to access the primary calendar of the + * currently logged in user, use the "primary" keyword. + */ + calendarId: string; + + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use sendUpdates instead. + * + * Whether to send notifications about the deletion of the event. Note that some + * emails might still be sent even if you set the value to false. The default is + * false. + */ + sendNotifications?: boolean; + + /** + * Query param: Guests who should receive notifications about the deletion of the + * event. + */ + sendUpdates?: "all" | "externalOnly" | "none"; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface EventImportParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Version number of conference data supported by the API client. - * Version 0 assumes no conference data support and ignores conference data in the - * event's body. Version 1 enables support for copying of ConferenceData as well as - * for creating new conferences using the createRequest field of conferenceData. - * The default is 0. - */ - conferenceDataVersion?: number; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Whether API client performing operation supports event attachments. - * Optional. The default is False. - */ - supportsAttachments?: boolean; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: Opaque identifier of the event. When creating new single or - * recurring events, you can specify their IDs. Provided IDs must follow these - * rules: - * - * - characters allowed in the ID are those used in base32hex encoding, i.e. - * lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938 - * - the length of the ID must be between 5 and 1024 characters - * - the ID must be unique per calendar Due to the globally distributed nature of - * the system, we cannot guarantee that ID collisions will be detected at event - * creation time. To minimize the risk of collisions we recommend using an - * established UUID algorithm such as one described in RFC4122. If you do not - * specify an ID, it will be automatically generated by the server. Note that the - * icalUID and the id are not identical and only one of them should be supplied - * at event creation time. One difference in their semantics is that in recurring - * events, all occurrences of one event have different ids while they all share - * the same icalUIDs. - */ - id?: string; - - /** - * Body param: Whether anyone can invite themselves to the event (deprecated). - * Optional. The default is False. - */ - anyoneCanAddSelf?: boolean; - - /** - * Body param: File attachments for the event. In order to modify attachments the - * supportsAttachments request parameter should be set to true. There can be at - * most 25 attachments per event, - */ - attachments?: Array; - - /** - * Body param: The attendees of the event. See the Events with attendees guide for - * more information on scheduling events with other calendar users. Service - * accounts need to use domain-wide delegation of authority to populate the - * attendee list. - */ - attendees?: Array; - - /** - * Body param: Whether attendees may have been omitted from the event's - * representation. When retrieving an event, this may be due to a restriction - * specified by the maxAttendee query parameter. When updating an event, this can - * be used to only update the participant's response. Optional. The default is - * False. - */ - attendeesOmitted?: boolean; - - /** - * Body param: The color of the event. This is an ID referring to an entry in the - * event section of the colors definition (see the colors endpoint). Optional. - */ - colorId?: string; - - /** - * Body param: The conference-related information, such as details of a Google Meet - * conference. To create new conference details use the createRequest field. To - * persist your changes, remember to set the conferenceDataVersion request - * parameter to 1 for all event modification requests. - */ - conferenceData?: EventImportParams.ConferenceData; - - /** - * Body param: Creation time of the event (as a RFC3339 timestamp). Read-only. - */ - created?: string; - - /** - * Body param: The creator of the event. Read-only. - */ - creator?: EventImportParams.Creator; - - /** - * Body param: Description of the event. Can contain HTML. Optional. - */ - description?: string; - - /** - * Body param: The (exclusive) end time of the event. For a recurring event, this - * is the end time of the first instance. - */ - end?: EventImportParams.End; - - /** - * Body param: Whether the end time is actually unspecified. An end time is still - * provided for compatibility reasons, even if this attribute is set to True. The - * default is False. - */ - endTimeUnspecified?: boolean; - - /** - * Body param: ETag of the resource. - */ - etag?: string; - - /** - * Body param: Specific type of the event. This cannot be modified after the event - * is created. Possible values are: - * - * - "default" - A regular event or not further specified. - * - "outOfOffice" - An out-of-office event. - * - "focusTime" - A focus-time event. - * - "workingLocation" - A working location event. Currently, only "default " and - * "workingLocation" events can be created using the API. Extended support for - * other event types will be made available in later releases. - */ - eventType?: string; - - /** - * Body param: Extended properties of the event. - */ - extendedProperties?: EventImportParams.ExtendedProperties; - - /** - * Body param: Focus Time event data. Used if eventType is focusTime. - */ - focusTimeProperties?: EventImportParams.FocusTimeProperties; - - /** - * Body param: A gadget that extends this event. Gadgets are deprecated; this - * structure is instead only used for returning birthday calendar metadata. - */ - gadget?: EventImportParams.Gadget; - - /** - * Body param: Whether attendees other than the organizer can invite others to the - * event. Optional. The default is True. - */ - guestsCanInviteOthers?: boolean; - - /** - * Body param: Whether attendees other than the organizer can modify the event. - * Optional. The default is False. - */ - guestsCanModify?: boolean; - - /** - * Body param: Whether attendees other than the organizer can see who the event's - * attendees are. Optional. The default is True. - */ - guestsCanSeeOtherGuests?: boolean; - - /** - * Body param: An absolute link to the Google Hangout associated with this event. - * Read-only. - */ - hangoutLink?: string; - - /** - * Body param: An absolute link to this event in the Google Calendar Web UI. - * Read-only. - */ - htmlLink?: string; - - /** - * Body param: Event unique identifier as defined in RFC5545. It is used to - * uniquely identify events accross calendaring systems and must be supplied when - * importing events via the import method. Note that the iCalUID and the id are not - * identical and only one of them should be supplied at event creation time. One - * difference in their semantics is that in recurring events, all occurrences of - * one event have different ids while they all share the same iCalUIDs. To retrieve - * an event using its iCalUID, call the events.list method using the iCalUID - * parameter. To retrieve an event using its id, call the events.get method. - */ - iCalUID?: string; - - /** - * Body param: Type of the resource ("calendar#event"). - */ - kind?: string; - - /** - * Body param: Geographic location of the event as free-form text. Optional. - */ - location?: string; - - /** - * Body param: Whether this is a locked event copy where no changes can be made to - * the main event fields "summary", "description", "location", "start", "end" or - * "recurrence". The default is False. Read-Only. - */ - locked?: boolean; - - /** - * Body param: The organizer of the event. If the organizer is also an attendee, - * this is indicated with a separate entry in attendees with the organizer field - * set to True. To change the organizer, use the move operation. Read-only, except - * when importing an event. - */ - organizer?: EventImportParams.Organizer; - - /** - * Body param: For an instance of a recurring event, this is the time at which this - * event would start according to the recurrence data in the recurring event - * identified by recurringEventId. It uniquely identifies the instance within the - * recurring event series even if the instance was moved to a different time. - * Immutable. - */ - originalStartTime?: EventImportParams.OriginalStartTime; - - /** - * Body param: Out of office event data. Used if eventType is outOfOffice. - */ - outOfOfficeProperties?: EventImportParams.OutOfOfficeProperties; - - /** - * Body param: If set to True, Event propagation is disabled. Note that it is not - * the same thing as Private event properties. Optional. Immutable. The default is - * False. - */ - privateCopy?: boolean; - - /** - * Body param: List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, - * as specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in - * this field; event start and end times are specified in the start and end fields. - * This field is omitted for single events or instances of recurring events. - */ - recurrence?: Array; - - /** - * Body param: For an instance of a recurring event, this is the id of the - * recurring event to which this instance belongs. Immutable. - */ - recurringEventId?: string; - - /** - * Body param: Information about the event's reminders for the authenticated user. - */ - reminders?: EventImportParams.Reminders; - - /** - * Body param: Sequence number as per iCalendar. - */ - sequence?: number; - - /** - * Body param: Source from which the event was created. For example, a web page, an - * email message or any document identifiable by an URL with HTTP or HTTPS scheme. - * Can only be seen or modified by the creator of the event. - */ - source?: EventImportParams.Source; - - /** - * Body param: The (inclusive) start time of the event. For a recurring event, this - * is the start time of the first instance. - */ - start?: EventImportParams.Start; - - /** - * Body param: Status of the event. Optional. Possible values are: - * - * - "confirmed" - The event is confirmed. This is the default status. - * - "tentative" - The event is tentatively confirmed. - * - "cancelled" - The event is cancelled (deleted). The list method returns - * cancelled events only on incremental sync (when syncToken or updatedMin are - * specified) or if the showDeleted flag is set to true. The get method always - * returns them. A cancelled status represents two different states depending on - * the event type: - * - Cancelled exceptions of an uncancelled recurring event indicate that this - * instance should no longer be presented to the user. Clients should store these - * events for the lifetime of the parent recurring event. Cancelled exceptions - * are only guaranteed to have values for the id, recurringEventId and - * originalStartTime fields populated. The other fields might be empty. - * - All other cancelled events represent deleted events. Clients should remove - * their locally synced copies. Such cancelled events will eventually disappear, - * so do not rely on them being available indefinitely. Deleted events are only - * guaranteed to have the id field populated. On the organizer's calendar, - * cancelled events continue to expose event details (summary, location, etc.) so - * that they can be restored (undeleted). Similarly, the events to which the user - * was invited and that they manually removed continue to provide details. - * However, incremental sync requests with showDeleted set to false will not - * return these details. If an event changes its organizer (for example via the - * move operation) and the original organizer is not on the attendee list, it - * will leave behind a cancelled event where only the id field is guaranteed to - * be populated. - */ - status?: string; - - /** - * Body param: Title of the event. - */ - summary?: string; - - /** - * Body param: Whether the event blocks time on the calendar. Optional. Possible - * values are: - * - * - "opaque" - Default value. The event does block time on the calendar. This is - * equivalent to setting Show me as to Busy in the Calendar UI. - * - "transparent" - The event does not block time on the calendar. This is - * equivalent to setting Show me as to Available in the Calendar UI. - */ - transparency?: string; - - /** - * Body param: Last modification time of the event (as a RFC3339 timestamp). - * Read-only. - */ - updated?: string; - - /** - * Body param: Visibility of the event. Optional. Possible values are: - * - * - "default" - Uses the default visibility for events on the calendar. This is - * the default value. - * - "public" - The event is public and event details are visible to all readers of - * the calendar. - * - "private" - The event is private and only event attendees may view event - * details. - * - "confidential" - The event is private. This value is provided for - * compatibility reasons. - */ - visibility?: string; - - /** - * Body param: Working location event data. - */ - workingLocationProperties?: EventImportParams.WorkingLocationProperties; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Version number of conference data supported by the API client. + * Version 0 assumes no conference data support and ignores conference data in the + * event's body. Version 1 enables support for copying of ConferenceData as well as + * for creating new conferences using the createRequest field of conferenceData. + * The default is 0. + */ + conferenceDataVersion?: number; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Whether API client performing operation supports event attachments. + * Optional. The default is False. + */ + supportsAttachments?: boolean; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: Opaque identifier of the event. When creating new single or + * recurring events, you can specify their IDs. Provided IDs must follow these + * rules: + * + * - characters allowed in the ID are those used in base32hex encoding, i.e. + * lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938 + * - the length of the ID must be between 5 and 1024 characters + * - the ID must be unique per calendar Due to the globally distributed nature of + * the system, we cannot guarantee that ID collisions will be detected at event + * creation time. To minimize the risk of collisions we recommend using an + * established UUID algorithm such as one described in RFC4122. If you do not + * specify an ID, it will be automatically generated by the server. Note that the + * icalUID and the id are not identical and only one of them should be supplied + * at event creation time. One difference in their semantics is that in recurring + * events, all occurrences of one event have different ids while they all share + * the same icalUIDs. + */ + id?: string; + + /** + * Body param: Whether anyone can invite themselves to the event (deprecated). + * Optional. The default is False. + */ + anyoneCanAddSelf?: boolean; + + /** + * Body param: File attachments for the event. In order to modify attachments the + * supportsAttachments request parameter should be set to true. There can be at + * most 25 attachments per event, + */ + attachments?: Array; + + /** + * Body param: The attendees of the event. See the Events with attendees guide for + * more information on scheduling events with other calendar users. Service + * accounts need to use domain-wide delegation of authority to populate the + * attendee list. + */ + attendees?: Array; + + /** + * Body param: Whether attendees may have been omitted from the event's + * representation. When retrieving an event, this may be due to a restriction + * specified by the maxAttendee query parameter. When updating an event, this can + * be used to only update the participant's response. Optional. The default is + * False. + */ + attendeesOmitted?: boolean; + + /** + * Body param: The color of the event. This is an ID referring to an entry in the + * event section of the colors definition (see the colors endpoint). Optional. + */ + colorId?: string; + + /** + * Body param: The conference-related information, such as details of a Google Meet + * conference. To create new conference details use the createRequest field. To + * persist your changes, remember to set the conferenceDataVersion request + * parameter to 1 for all event modification requests. + */ + conferenceData?: EventImportParams.ConferenceData; + + /** + * Body param: Creation time of the event (as a RFC3339 timestamp). Read-only. + */ + created?: string; + + /** + * Body param: The creator of the event. Read-only. + */ + creator?: EventImportParams.Creator; + + /** + * Body param: Description of the event. Can contain HTML. Optional. + */ + description?: string; + + /** + * Body param: The (exclusive) end time of the event. For a recurring event, this + * is the end time of the first instance. + */ + end?: EventImportParams.End; + + /** + * Body param: Whether the end time is actually unspecified. An end time is still + * provided for compatibility reasons, even if this attribute is set to True. The + * default is False. + */ + endTimeUnspecified?: boolean; + + /** + * Body param: ETag of the resource. + */ + etag?: string; + + /** + * Body param: Specific type of the event. This cannot be modified after the event + * is created. Possible values are: + * + * - "default" - A regular event or not further specified. + * - "outOfOffice" - An out-of-office event. + * - "focusTime" - A focus-time event. + * - "workingLocation" - A working location event. Currently, only "default " and + * "workingLocation" events can be created using the API. Extended support for + * other event types will be made available in later releases. + */ + eventType?: string; + + /** + * Body param: Extended properties of the event. + */ + extendedProperties?: EventImportParams.ExtendedProperties; + + /** + * Body param: Focus Time event data. Used if eventType is focusTime. + */ + focusTimeProperties?: EventImportParams.FocusTimeProperties; + + /** + * Body param: A gadget that extends this event. Gadgets are deprecated; this + * structure is instead only used for returning birthday calendar metadata. + */ + gadget?: EventImportParams.Gadget; + + /** + * Body param: Whether attendees other than the organizer can invite others to the + * event. Optional. The default is True. + */ + guestsCanInviteOthers?: boolean; + + /** + * Body param: Whether attendees other than the organizer can modify the event. + * Optional. The default is False. + */ + guestsCanModify?: boolean; + + /** + * Body param: Whether attendees other than the organizer can see who the event's + * attendees are. Optional. The default is True. + */ + guestsCanSeeOtherGuests?: boolean; + + /** + * Body param: An absolute link to the Google Hangout associated with this event. + * Read-only. + */ + hangoutLink?: string; + + /** + * Body param: An absolute link to this event in the Google Calendar Web UI. + * Read-only. + */ + htmlLink?: string; + + /** + * Body param: Event unique identifier as defined in RFC5545. It is used to + * uniquely identify events accross calendaring systems and must be supplied when + * importing events via the import method. Note that the iCalUID and the id are not + * identical and only one of them should be supplied at event creation time. One + * difference in their semantics is that in recurring events, all occurrences of + * one event have different ids while they all share the same iCalUIDs. To retrieve + * an event using its iCalUID, call the events.list method using the iCalUID + * parameter. To retrieve an event using its id, call the events.get method. + */ + iCalUID?: string; + + /** + * Body param: Type of the resource ("calendar#event"). + */ + kind?: string; + + /** + * Body param: Geographic location of the event as free-form text. Optional. + */ + location?: string; + + /** + * Body param: Whether this is a locked event copy where no changes can be made to + * the main event fields "summary", "description", "location", "start", "end" or + * "recurrence". The default is False. Read-Only. + */ + locked?: boolean; + + /** + * Body param: The organizer of the event. If the organizer is also an attendee, + * this is indicated with a separate entry in attendees with the organizer field + * set to True. To change the organizer, use the move operation. Read-only, except + * when importing an event. + */ + organizer?: EventImportParams.Organizer; + + /** + * Body param: For an instance of a recurring event, this is the time at which this + * event would start according to the recurrence data in the recurring event + * identified by recurringEventId. It uniquely identifies the instance within the + * recurring event series even if the instance was moved to a different time. + * Immutable. + */ + originalStartTime?: EventImportParams.OriginalStartTime; + + /** + * Body param: Out of office event data. Used if eventType is outOfOffice. + */ + outOfOfficeProperties?: EventImportParams.OutOfOfficeProperties; + + /** + * Body param: If set to True, Event propagation is disabled. Note that it is not + * the same thing as Private event properties. Optional. Immutable. The default is + * False. + */ + privateCopy?: boolean; + + /** + * Body param: List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event, + * as specified in RFC5545. Note that DTSTART and DTEND lines are not allowed in + * this field; event start and end times are specified in the start and end fields. + * This field is omitted for single events or instances of recurring events. + */ + recurrence?: Array; + + /** + * Body param: For an instance of a recurring event, this is the id of the + * recurring event to which this instance belongs. Immutable. + */ + recurringEventId?: string; + + /** + * Body param: Information about the event's reminders for the authenticated user. + */ + reminders?: EventImportParams.Reminders; + + /** + * Body param: Sequence number as per iCalendar. + */ + sequence?: number; + + /** + * Body param: Source from which the event was created. For example, a web page, an + * email message or any document identifiable by an URL with HTTP or HTTPS scheme. + * Can only be seen or modified by the creator of the event. + */ + source?: EventImportParams.Source; + + /** + * Body param: The (inclusive) start time of the event. For a recurring event, this + * is the start time of the first instance. + */ + start?: EventImportParams.Start; + + /** + * Body param: Status of the event. Optional. Possible values are: + * + * - "confirmed" - The event is confirmed. This is the default status. + * - "tentative" - The event is tentatively confirmed. + * - "cancelled" - The event is cancelled (deleted). The list method returns + * cancelled events only on incremental sync (when syncToken or updatedMin are + * specified) or if the showDeleted flag is set to true. The get method always + * returns them. A cancelled status represents two different states depending on + * the event type: + * - Cancelled exceptions of an uncancelled recurring event indicate that this + * instance should no longer be presented to the user. Clients should store these + * events for the lifetime of the parent recurring event. Cancelled exceptions + * are only guaranteed to have values for the id, recurringEventId and + * originalStartTime fields populated. The other fields might be empty. + * - All other cancelled events represent deleted events. Clients should remove + * their locally synced copies. Such cancelled events will eventually disappear, + * so do not rely on them being available indefinitely. Deleted events are only + * guaranteed to have the id field populated. On the organizer's calendar, + * cancelled events continue to expose event details (summary, location, etc.) so + * that they can be restored (undeleted). Similarly, the events to which the user + * was invited and that they manually removed continue to provide details. + * However, incremental sync requests with showDeleted set to false will not + * return these details. If an event changes its organizer (for example via the + * move operation) and the original organizer is not on the attendee list, it + * will leave behind a cancelled event where only the id field is guaranteed to + * be populated. + */ + status?: string; + + /** + * Body param: Title of the event. + */ + summary?: string; + + /** + * Body param: Whether the event blocks time on the calendar. Optional. Possible + * values are: + * + * - "opaque" - Default value. The event does block time on the calendar. This is + * equivalent to setting Show me as to Busy in the Calendar UI. + * - "transparent" - The event does not block time on the calendar. This is + * equivalent to setting Show me as to Available in the Calendar UI. + */ + transparency?: string; + + /** + * Body param: Last modification time of the event (as a RFC3339 timestamp). + * Read-only. + */ + updated?: string; + + /** + * Body param: Visibility of the event. Optional. Possible values are: + * + * - "default" - Uses the default visibility for events on the calendar. This is + * the default value. + * - "public" - The event is public and event details are visible to all readers of + * the calendar. + * - "private" - The event is private and only event attendees may view event + * details. + * - "confidential" - The event is private. This value is provided for + * compatibility reasons. + */ + visibility?: string; + + /** + * Body param: Working location event data. + */ + workingLocationProperties?: EventImportParams.WorkingLocationProperties; } export namespace EventImportParams { - export interface Attachment { - /** - * ID of the attached file. Read-only. For Google Drive files, this is the ID of - * the corresponding Files resource entry in the Drive API. - */ - fileId?: string; - - /** - * URL link to the attachment. For adding Google Drive file attachments use the - * same format as in alternateLink property of the Files resource in the Drive API. - * Required when adding an attachment. - */ - fileUrl?: string; - - /** - * URL link to the attachment's icon. This field can only be modified for custom - * third-party attachments. - */ - iconLink?: string; - - /** - * Internet media type (MIME type) of the attachment. - */ - mimeType?: string; - - /** - * Attachment title. - */ - title?: string; - } - - export interface Attendee { - /** - * The attendee's Profile ID, if available. - */ - id?: string; - - /** - * Number of additional guests. Optional. The default is 0. - */ - additionalGuests?: number; - - /** - * The attendee's response comment. Optional. - */ - comment?: string; - - /** - * The attendee's name, if available. Optional. - */ - displayName?: string; - - /** - * The attendee's email address, if available. This field must be present when - * adding an attendee. It must be a valid email address as per RFC5322. Required - * when adding an attendee. - */ - email?: string; - - /** - * Whether this is an optional attendee. Optional. The default is False. - */ - optional?: boolean; - - /** - * Whether the attendee is the organizer of the event. Read-only. The default is - * False. - */ - organizer?: boolean; - - /** - * Whether the attendee is a resource. Can only be set when the attendee is added - * to the event for the first time. Subsequent modifications are ignored. Optional. - * The default is False. - */ - resource?: boolean; - - /** - * The attendee's response status. Possible values are: - * - * - "needsAction" - The attendee has not responded to the invitation (recommended - * for new events). - * - "declined" - The attendee has declined the invitation. - * - "tentative" - The attendee has tentatively accepted the invitation. - * - "accepted" - The attendee has accepted the invitation. Warning: If you add an - * event using the values declined, tentative, or accepted, attendees with the - * "Add invitations to my calendar" setting set to "When I respond to invitation - * in email" won't see an event on their calendar unless they choose to change - * their invitation response in the event invitation email. - */ - responseStatus?: string; - - /** - * Whether this entry represents the calendar on which this copy of the event - * appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * The conference-related information, such as details of a Google Meet conference. - * To create new conference details use the createRequest field. To persist your - * changes, remember to set the conferenceDataVersion request parameter to 1 for - * all event modification requests. - */ - export interface ConferenceData { - /** - * The ID of the conference. Can be used by developers to keep track of - * conferences, should not be displayed to users. The ID value is formed - * differently for each conference solution type: - * - * - eventHangout: ID is not set. (This conference type is deprecated.) - * - eventNamedHangout: ID is the name of the Hangout. (This conference type is - * deprecated.) - * - hangoutsMeet: ID is the 10-letter meeting code, for example aaa-bbbb-ccc. - * - addOn: ID is defined by the third-party provider. Optional. - */ - conferenceId?: string; - - /** - * The conference solution, such as Google Meet. Unset for a conference with a - * failed create request. Either conferenceSolution and at least one entryPoint, or - * createRequest is required. - */ - conferenceSolution?: ConferenceData.ConferenceSolution; - - /** - * A request to generate a new conference and attach it to the event. The data is - * generated asynchronously. To see whether the data is present check the status - * field. Either conferenceSolution and at least one entryPoint, or createRequest - * is required. - */ - createRequest?: ConferenceData.CreateRequest; - - /** - * Information about individual conference entry points, such as URLs or phone - * numbers. All of them must belong to the same conference. Either - * conferenceSolution and at least one entryPoint, or createRequest is required. - */ - entryPoints?: Array; - - /** - * Additional notes (such as instructions from the domain administrator, legal - * notices) to display to the user. Can contain HTML. The maximum length is 2048 - * characters. Optional. - */ - notes?: string; - - /** - * Additional properties related to a conference. An example would be a - * solution-specific setting for enabling video streaming. - */ - parameters?: ConferenceData.Parameters; - - /** - * The signature of the conference data. Generated on server side. Unset for a - * conference with a failed create request. Optional for a conference with a - * pending create request. - */ - signature?: string; - } - - export namespace ConferenceData { - /** - * The conference solution, such as Google Meet. Unset for a conference with a - * failed create request. Either conferenceSolution and at least one entryPoint, or - * createRequest is required. - */ - export interface ConferenceSolution { - /** - * The user-visible icon for this solution. - */ - iconUri?: string; - - /** - * The key which can uniquely identify the conference solution for this event. - */ - key?: ConferenceSolution.Key; - - /** - * The user-visible name of this solution. Not localized. - */ - name?: string; - } - - export namespace ConferenceSolution { - /** - * The key which can uniquely identify the conference solution for this event. - */ - export interface Key { - /** - * The conference solution type. If a client encounters an unfamiliar or empty - * type, it should still be able to display the entry points. However, it should - * disallow modifications. The possible values are: - * - * - "eventHangout" for Hangouts for consumers (deprecated; existing events may - * show this conference solution type but new conferences cannot be created) - * - "eventNamedHangout" for classic Hangouts for Google Workspace users - * (deprecated; existing events may show this conference solution type but new - * conferences cannot be created) - * - "hangoutsMeet" for Google Meet (http://meet.google.com) - * - "addOn" for 3P conference providers - */ - type?: string; - } - } - - /** - * A request to generate a new conference and attach it to the event. The data is - * generated asynchronously. To see whether the data is present check the status - * field. Either conferenceSolution and at least one entryPoint, or createRequest - * is required. - */ - export interface CreateRequest { - /** - * The conference solution, such as Hangouts or Google Meet. - */ - conferenceSolutionKey?: CreateRequest.ConferenceSolutionKey; - - /** - * The client-generated unique ID for this request. Clients should regenerate this - * ID for every new request. If an ID provided is the same as for the previous - * request, the request is ignored. - */ - requestId?: string; - - /** - * The status of the conference create request. - */ - status?: CreateRequest.Status; - } - - export namespace CreateRequest { - /** - * The conference solution, such as Hangouts or Google Meet. - */ - export interface ConferenceSolutionKey { - /** - * The conference solution type. If a client encounters an unfamiliar or empty - * type, it should still be able to display the entry points. However, it should - * disallow modifications. The possible values are: - * - * - "eventHangout" for Hangouts for consumers (deprecated; existing events may - * show this conference solution type but new conferences cannot be created) - * - "eventNamedHangout" for classic Hangouts for Google Workspace users - * (deprecated; existing events may show this conference solution type but new - * conferences cannot be created) - * - "hangoutsMeet" for Google Meet (http://meet.google.com) - * - "addOn" for 3P conference providers - */ - type?: string; - } - - /** - * The status of the conference create request. - */ - export interface Status { - /** - * The current status of the conference create request. Read-only. The possible - * values are: - * - * - "pending": the conference create request is still being processed. - * - "success": the conference create request succeeded, the entry points are - * populated. - * - "failure": the conference create request failed, there are no entry points. - */ - statusCode?: string; - } - } - - export interface EntryPoint { - /** - * The access code to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - accessCode?: string; - - /** - * Features of the entry point, such as being toll or toll-free. One entry point - * can have multiple features. However, toll and toll-free cannot be both set on - * the same entry point. - */ - entryPointFeatures?: Array; - - /** - * The type of the conference entry point. Possible values are: - * - * - "video" - joining a conference over HTTP. A conference can have zero or one - * video entry point. - * - "phone" - joining a conference by dialing a phone number. A conference can - * have zero or more phone entry points. - * - "sip" - joining a conference over SIP. A conference can have zero or one sip - * entry point. - * - "more" - further conference joining instructions, for example additional phone - * numbers. A conference can have zero or one more entry point. A conference with - * only a more entry point is not a valid conference. - */ - entryPointType?: string; - - /** - * The label for the URI. Visible to end users. Not localized. The maximum length - * is 512 characters. Examples: - * - * - for video: meet.google.com/aaa-bbbb-ccc - * - for phone: +1 123 268 2601 - * - for sip: 12345678@altostrat.com - * - for more: should not be filled - * Optional. - */ - label?: string; - - /** - * The meeting code to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - meetingCode?: string; - - /** - * The passcode to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - */ - passcode?: string; - - /** - * The password to access the conference. The maximum length is 128 characters. - * When creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - password?: string; - - /** - * The PIN to access the conference. The maximum length is 128 characters. When - * creating new conference data, populate only the subset of {meetingCode, - * accessCode, passcode, password, pin} fields that match the terminology that the - * conference provider uses. Only the populated fields should be displayed. - * Optional. - */ - pin?: string; - - /** - * The CLDR/ISO 3166 region code for the country associated with this phone access. - * Example: "SE" for Sweden. Calendar backend will populate this field only for - * EntryPointType.PHONE. - */ - regionCode?: string; - - /** - * The URI of the entry point. The maximum length is 1300 characters. Format: - * - * - for video, http: or https: schema is required. - * - for phone, tel: schema is required. The URI should include the entire dial - * sequence (e.g., tel:+12345678900,,,123456789;1234). - * - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com. - * - for more, http: or https: schema is required. - */ - uri?: string; - } - - /** - * Additional properties related to a conference. An example would be a - * solution-specific setting for enabling video streaming. - */ - export interface Parameters { - /** - * Additional add-on specific data. - */ - addOnParameters?: Parameters.AddOnParameters; - } - - export namespace Parameters { - /** - * Additional add-on specific data. - */ - export interface AddOnParameters { - parameters?: Record; - } - } - } - - /** - * The creator of the event. Read-only. - */ - export interface Creator { - /** - * The creator's Profile ID, if available. - */ - id?: string; - - /** - * The creator's name, if available. - */ - displayName?: string; - - /** - * The creator's email address, if available. - */ - email?: string; - - /** - * Whether the creator corresponds to the calendar on which this copy of the event - * appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * The (exclusive) end time of the event. For a recurring event, this is the end - * time of the first instance. - */ - export interface End { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Extended properties of the event. - */ - export interface ExtendedProperties { - /** - * Properties that are private to the copy of the event that appears on this - * calendar. - */ - private?: Record; - - /** - * Properties that are shared between copies of the event on other attendees' - * calendars. - */ - shared?: Record; - } - - /** - * Focus Time event data. Used if eventType is focusTime. - */ - export interface FocusTimeProperties { - /** - * Whether to decline meeting invitations which overlap Focus Time events. Valid - * values are declineNone, meaning that no meeting invitations are declined; - * declineAllConflictingInvitations, meaning that all conflicting meeting - * invitations that conflict with the event are declined; and - * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting - * invitations which arrive while the Focus Time event is present are to be - * declined. - */ - autoDeclineMode?: string; - - /** - * The status to mark the user in Chat and related products. This can be available - * or doNotDisturb. - */ - chatStatus?: string; - - /** - * Response message to set if an existing event or new invitation is automatically - * declined by Calendar. - */ - declineMessage?: string; - } - - /** - * A gadget that extends this event. Gadgets are deprecated; this structure is - * instead only used for returning birthday calendar metadata. - */ - export interface Gadget { - /** - * The gadget's display mode. Deprecated. Possible values are: - * - * - "icon" - The gadget displays next to the event's title in the calendar view. - * - "chip" - The gadget displays when the event is clicked. - */ - display?: string; - - /** - * The gadget's height in pixels. The height must be an integer greater than 0. - * Optional. Deprecated. - */ - height?: number; - - /** - * The gadget's icon URL. The URL scheme must be HTTPS. Deprecated. - */ - iconLink?: string; - - /** - * The gadget's URL. The URL scheme must be HTTPS. Deprecated. - */ - link?: string; - - /** - * Preferences. - */ - preferences?: Record; - - /** - * The gadget's title. Deprecated. - */ - title?: string; - - /** - * The gadget's type. Deprecated. - */ - type?: string; - - /** - * The gadget's width in pixels. The width must be an integer greater than 0. - * Optional. Deprecated. - */ - width?: number; - } - - /** - * The organizer of the event. If the organizer is also an attendee, this is - * indicated with a separate entry in attendees with the organizer field set to - * True. To change the organizer, use the move operation. Read-only, except when - * importing an event. - */ - export interface Organizer { - /** - * The organizer's Profile ID, if available. - */ - id?: string; - - /** - * The organizer's name, if available. - */ - displayName?: string; - - /** - * The organizer's email address, if available. It must be a valid email address as - * per RFC5322. - */ - email?: string; - - /** - * Whether the organizer corresponds to the calendar on which this copy of the - * event appears. Read-only. The default is False. - */ - self?: boolean; - } - - /** - * For an instance of a recurring event, this is the time at which this event would - * start according to the recurrence data in the recurring event identified by - * recurringEventId. It uniquely identifies the instance within the recurring event - * series even if the instance was moved to a different time. Immutable. - */ - export interface OriginalStartTime { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Out of office event data. Used if eventType is outOfOffice. - */ - export interface OutOfOfficeProperties { - /** - * Whether to decline meeting invitations which overlap Out of office events. Valid - * values are declineNone, meaning that no meeting invitations are declined; - * declineAllConflictingInvitations, meaning that all conflicting meeting - * invitations that conflict with the event are declined; and - * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting - * invitations which arrive while the Out of office event is present are to be - * declined. - */ - autoDeclineMode?: string; - - /** - * Response message to set if an existing event or new invitation is automatically - * declined by Calendar. - */ - declineMessage?: string; - } - - /** - * Information about the event's reminders for the authenticated user. - */ - export interface Reminders { - /** - * If the event doesn't use the default reminders, this lists the reminders - * specific to the event, or, if not set, indicates that no reminders are set for - * this event. The maximum number of override reminders is 5. - */ - overrides?: Array; - - /** - * Whether the default reminders of the calendar apply to the event. - */ - useDefault?: boolean; - } - - export namespace Reminders { - export interface Override { - /** - * The method used by this reminder. Possible values are: - * - * - "email" - Reminders are sent via email. - * - "popup" - Reminders are sent via a UI popup. - * Required when adding a reminder. - */ - method?: string; - - /** - * Number of minutes before the start of the event when the reminder should - * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required - * when adding a reminder. - */ - minutes?: number; - } - } - - /** - * Source from which the event was created. For example, a web page, an email - * message or any document identifiable by an URL with HTTP or HTTPS scheme. Can - * only be seen or modified by the creator of the event. - */ - export interface Source { - /** - * Title of the source; for example a title of a web page or an email subject. - */ - title?: string; - - /** - * URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS. - */ - url?: string; - } - - /** - * The (inclusive) start time of the event. For a recurring event, this is the - * start time of the first instance. - */ - export interface Start { - /** - * The date, in the format "yyyy-mm-dd", if this is an all-day event. - */ - date?: string; - - /** - * The time, as a combined date-time value (formatted according to RFC3339). A time - * zone offset is required unless a time zone is explicitly specified in timeZone. - */ - dateTime?: string; - - /** - * The time zone in which the time is specified. (Formatted as an IANA Time Zone - * Database name, e.g. "Europe/Zurich".) For recurring events this field is - * required and specifies the time zone in which the recurrence is expanded. For - * single events this field is optional and indicates a custom time zone for the - * event start/end. - */ - timeZone?: string; - } - - /** - * Working location event data. - */ - export interface WorkingLocationProperties { - /** - * If present, specifies that the user is working from a custom location. - */ - customLocation?: WorkingLocationProperties.CustomLocation; - - /** - * If present, specifies that the user is working at home. - */ - homeOffice?: unknown; - - /** - * If present, specifies that the user is working from an office. - */ - officeLocation?: WorkingLocationProperties.OfficeLocation; - - /** - * Type of the working location. Possible values are: - * - * - "homeOffice" - The user is working at home. - * - "officeLocation" - The user is working from an office. - * - "customLocation" - The user is working from a custom location. Any details are - * specified in a sub-field of the specified name, but this field may be missing - * if empty. Any other fields are ignored. Required when adding working location - * properties. - */ - type?: string; - } - - export namespace WorkingLocationProperties { - /** - * If present, specifies that the user is working from a custom location. - */ - export interface CustomLocation { - /** - * An optional extra label for additional information. - */ - label?: string; - } - - /** - * If present, specifies that the user is working from an office. - */ - export interface OfficeLocation { - /** - * An optional building identifier. This should reference a building ID in the - * organization's Resources database. - */ - buildingId?: string; - - /** - * An optional desk identifier. - */ - deskId?: string; - - /** - * An optional floor identifier. - */ - floorId?: string; - - /** - * An optional floor section identifier. - */ - floorSectionId?: string; - - /** - * The office name that's displayed in Calendar Web and Mobile clients. We - * recommend you reference a building name in the organization's Resources - * database. - */ - label?: string; - } - } + export interface Attachment { + /** + * ID of the attached file. Read-only. For Google Drive files, this is the ID of + * the corresponding Files resource entry in the Drive API. + */ + fileId?: string; + + /** + * URL link to the attachment. For adding Google Drive file attachments use the + * same format as in alternateLink property of the Files resource in the Drive API. + * Required when adding an attachment. + */ + fileUrl?: string; + + /** + * URL link to the attachment's icon. This field can only be modified for custom + * third-party attachments. + */ + iconLink?: string; + + /** + * Internet media type (MIME type) of the attachment. + */ + mimeType?: string; + + /** + * Attachment title. + */ + title?: string; + } + + export interface Attendee { + /** + * The attendee's Profile ID, if available. + */ + id?: string; + + /** + * Number of additional guests. Optional. The default is 0. + */ + additionalGuests?: number; + + /** + * The attendee's response comment. Optional. + */ + comment?: string; + + /** + * The attendee's name, if available. Optional. + */ + displayName?: string; + + /** + * The attendee's email address, if available. This field must be present when + * adding an attendee. It must be a valid email address as per RFC5322. Required + * when adding an attendee. + */ + email?: string; + + /** + * Whether this is an optional attendee. Optional. The default is False. + */ + optional?: boolean; + + /** + * Whether the attendee is the organizer of the event. Read-only. The default is + * False. + */ + organizer?: boolean; + + /** + * Whether the attendee is a resource. Can only be set when the attendee is added + * to the event for the first time. Subsequent modifications are ignored. Optional. + * The default is False. + */ + resource?: boolean; + + /** + * The attendee's response status. Possible values are: + * + * - "needsAction" - The attendee has not responded to the invitation (recommended + * for new events). + * - "declined" - The attendee has declined the invitation. + * - "tentative" - The attendee has tentatively accepted the invitation. + * - "accepted" - The attendee has accepted the invitation. Warning: If you add an + * event using the values declined, tentative, or accepted, attendees with the + * "Add invitations to my calendar" setting set to "When I respond to invitation + * in email" won't see an event on their calendar unless they choose to change + * their invitation response in the event invitation email. + */ + responseStatus?: string; + + /** + * Whether this entry represents the calendar on which this copy of the event + * appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * The conference-related information, such as details of a Google Meet conference. + * To create new conference details use the createRequest field. To persist your + * changes, remember to set the conferenceDataVersion request parameter to 1 for + * all event modification requests. + */ + export interface ConferenceData { + /** + * The ID of the conference. Can be used by developers to keep track of + * conferences, should not be displayed to users. The ID value is formed + * differently for each conference solution type: + * + * - eventHangout: ID is not set. (This conference type is deprecated.) + * - eventNamedHangout: ID is the name of the Hangout. (This conference type is + * deprecated.) + * - hangoutsMeet: ID is the 10-letter meeting code, for example aaa-bbbb-ccc. + * - addOn: ID is defined by the third-party provider. Optional. + */ + conferenceId?: string; + + /** + * The conference solution, such as Google Meet. Unset for a conference with a + * failed create request. Either conferenceSolution and at least one entryPoint, or + * createRequest is required. + */ + conferenceSolution?: ConferenceData.ConferenceSolution; + + /** + * A request to generate a new conference and attach it to the event. The data is + * generated asynchronously. To see whether the data is present check the status + * field. Either conferenceSolution and at least one entryPoint, or createRequest + * is required. + */ + createRequest?: ConferenceData.CreateRequest; + + /** + * Information about individual conference entry points, such as URLs or phone + * numbers. All of them must belong to the same conference. Either + * conferenceSolution and at least one entryPoint, or createRequest is required. + */ + entryPoints?: Array; + + /** + * Additional notes (such as instructions from the domain administrator, legal + * notices) to display to the user. Can contain HTML. The maximum length is 2048 + * characters. Optional. + */ + notes?: string; + + /** + * Additional properties related to a conference. An example would be a + * solution-specific setting for enabling video streaming. + */ + parameters?: ConferenceData.Parameters; + + /** + * The signature of the conference data. Generated on server side. Unset for a + * conference with a failed create request. Optional for a conference with a + * pending create request. + */ + signature?: string; + } + + export namespace ConferenceData { + /** + * The conference solution, such as Google Meet. Unset for a conference with a + * failed create request. Either conferenceSolution and at least one entryPoint, or + * createRequest is required. + */ + export interface ConferenceSolution { + /** + * The user-visible icon for this solution. + */ + iconUri?: string; + + /** + * The key which can uniquely identify the conference solution for this event. + */ + key?: ConferenceSolution.Key; + + /** + * The user-visible name of this solution. Not localized. + */ + name?: string; + } + + export namespace ConferenceSolution { + /** + * The key which can uniquely identify the conference solution for this event. + */ + export interface Key { + /** + * The conference solution type. If a client encounters an unfamiliar or empty + * type, it should still be able to display the entry points. However, it should + * disallow modifications. The possible values are: + * + * - "eventHangout" for Hangouts for consumers (deprecated; existing events may + * show this conference solution type but new conferences cannot be created) + * - "eventNamedHangout" for classic Hangouts for Google Workspace users + * (deprecated; existing events may show this conference solution type but new + * conferences cannot be created) + * - "hangoutsMeet" for Google Meet (http://meet.google.com) + * - "addOn" for 3P conference providers + */ + type?: string; + } + } + + /** + * A request to generate a new conference and attach it to the event. The data is + * generated asynchronously. To see whether the data is present check the status + * field. Either conferenceSolution and at least one entryPoint, or createRequest + * is required. + */ + export interface CreateRequest { + /** + * The conference solution, such as Hangouts or Google Meet. + */ + conferenceSolutionKey?: CreateRequest.ConferenceSolutionKey; + + /** + * The client-generated unique ID for this request. Clients should regenerate this + * ID for every new request. If an ID provided is the same as for the previous + * request, the request is ignored. + */ + requestId?: string; + + /** + * The status of the conference create request. + */ + status?: CreateRequest.Status; + } + + export namespace CreateRequest { + /** + * The conference solution, such as Hangouts or Google Meet. + */ + export interface ConferenceSolutionKey { + /** + * The conference solution type. If a client encounters an unfamiliar or empty + * type, it should still be able to display the entry points. However, it should + * disallow modifications. The possible values are: + * + * - "eventHangout" for Hangouts for consumers (deprecated; existing events may + * show this conference solution type but new conferences cannot be created) + * - "eventNamedHangout" for classic Hangouts for Google Workspace users + * (deprecated; existing events may show this conference solution type but new + * conferences cannot be created) + * - "hangoutsMeet" for Google Meet (http://meet.google.com) + * - "addOn" for 3P conference providers + */ + type?: string; + } + + /** + * The status of the conference create request. + */ + export interface Status { + /** + * The current status of the conference create request. Read-only. The possible + * values are: + * + * - "pending": the conference create request is still being processed. + * - "success": the conference create request succeeded, the entry points are + * populated. + * - "failure": the conference create request failed, there are no entry points. + */ + statusCode?: string; + } + } + + export interface EntryPoint { + /** + * The access code to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + accessCode?: string; + + /** + * Features of the entry point, such as being toll or toll-free. One entry point + * can have multiple features. However, toll and toll-free cannot be both set on + * the same entry point. + */ + entryPointFeatures?: Array; + + /** + * The type of the conference entry point. Possible values are: + * + * - "video" - joining a conference over HTTP. A conference can have zero or one + * video entry point. + * - "phone" - joining a conference by dialing a phone number. A conference can + * have zero or more phone entry points. + * - "sip" - joining a conference over SIP. A conference can have zero or one sip + * entry point. + * - "more" - further conference joining instructions, for example additional phone + * numbers. A conference can have zero or one more entry point. A conference with + * only a more entry point is not a valid conference. + */ + entryPointType?: string; + + /** + * The label for the URI. Visible to end users. Not localized. The maximum length + * is 512 characters. Examples: + * + * - for video: meet.google.com/aaa-bbbb-ccc + * - for phone: +1 123 268 2601 + * - for sip: 12345678@altostrat.com + * - for more: should not be filled + * Optional. + */ + label?: string; + + /** + * The meeting code to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + meetingCode?: string; + + /** + * The passcode to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + */ + passcode?: string; + + /** + * The password to access the conference. The maximum length is 128 characters. + * When creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + password?: string; + + /** + * The PIN to access the conference. The maximum length is 128 characters. When + * creating new conference data, populate only the subset of {meetingCode, + * accessCode, passcode, password, pin} fields that match the terminology that the + * conference provider uses. Only the populated fields should be displayed. + * Optional. + */ + pin?: string; + + /** + * The CLDR/ISO 3166 region code for the country associated with this phone access. + * Example: "SE" for Sweden. Calendar backend will populate this field only for + * EntryPointType.PHONE. + */ + regionCode?: string; + + /** + * The URI of the entry point. The maximum length is 1300 characters. Format: + * + * - for video, http: or https: schema is required. + * - for phone, tel: schema is required. The URI should include the entire dial + * sequence (e.g., tel:+12345678900,,,123456789;1234). + * - for sip, sip: schema is required, e.g., sip:12345678@myprovider.com. + * - for more, http: or https: schema is required. + */ + uri?: string; + } + + /** + * Additional properties related to a conference. An example would be a + * solution-specific setting for enabling video streaming. + */ + export interface Parameters { + /** + * Additional add-on specific data. + */ + addOnParameters?: Parameters.AddOnParameters; + } + + export namespace Parameters { + /** + * Additional add-on specific data. + */ + export interface AddOnParameters { + parameters?: Record; + } + } + } + + /** + * The creator of the event. Read-only. + */ + export interface Creator { + /** + * The creator's Profile ID, if available. + */ + id?: string; + + /** + * The creator's name, if available. + */ + displayName?: string; + + /** + * The creator's email address, if available. + */ + email?: string; + + /** + * Whether the creator corresponds to the calendar on which this copy of the event + * appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * The (exclusive) end time of the event. For a recurring event, this is the end + * time of the first instance. + */ + export interface End { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Extended properties of the event. + */ + export interface ExtendedProperties { + /** + * Properties that are private to the copy of the event that appears on this + * calendar. + */ + private?: Record; + + /** + * Properties that are shared between copies of the event on other attendees' + * calendars. + */ + shared?: Record; + } + + /** + * Focus Time event data. Used if eventType is focusTime. + */ + export interface FocusTimeProperties { + /** + * Whether to decline meeting invitations which overlap Focus Time events. Valid + * values are declineNone, meaning that no meeting invitations are declined; + * declineAllConflictingInvitations, meaning that all conflicting meeting + * invitations that conflict with the event are declined; and + * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting + * invitations which arrive while the Focus Time event is present are to be + * declined. + */ + autoDeclineMode?: string; + + /** + * The status to mark the user in Chat and related products. This can be available + * or doNotDisturb. + */ + chatStatus?: string; + + /** + * Response message to set if an existing event or new invitation is automatically + * declined by Calendar. + */ + declineMessage?: string; + } + + /** + * A gadget that extends this event. Gadgets are deprecated; this structure is + * instead only used for returning birthday calendar metadata. + */ + export interface Gadget { + /** + * The gadget's display mode. Deprecated. Possible values are: + * + * - "icon" - The gadget displays next to the event's title in the calendar view. + * - "chip" - The gadget displays when the event is clicked. + */ + display?: string; + + /** + * The gadget's height in pixels. The height must be an integer greater than 0. + * Optional. Deprecated. + */ + height?: number; + + /** + * The gadget's icon URL. The URL scheme must be HTTPS. Deprecated. + */ + iconLink?: string; + + /** + * The gadget's URL. The URL scheme must be HTTPS. Deprecated. + */ + link?: string; + + /** + * Preferences. + */ + preferences?: Record; + + /** + * The gadget's title. Deprecated. + */ + title?: string; + + /** + * The gadget's type. Deprecated. + */ + type?: string; + + /** + * The gadget's width in pixels. The width must be an integer greater than 0. + * Optional. Deprecated. + */ + width?: number; + } + + /** + * The organizer of the event. If the organizer is also an attendee, this is + * indicated with a separate entry in attendees with the organizer field set to + * True. To change the organizer, use the move operation. Read-only, except when + * importing an event. + */ + export interface Organizer { + /** + * The organizer's Profile ID, if available. + */ + id?: string; + + /** + * The organizer's name, if available. + */ + displayName?: string; + + /** + * The organizer's email address, if available. It must be a valid email address as + * per RFC5322. + */ + email?: string; + + /** + * Whether the organizer corresponds to the calendar on which this copy of the + * event appears. Read-only. The default is False. + */ + self?: boolean; + } + + /** + * For an instance of a recurring event, this is the time at which this event would + * start according to the recurrence data in the recurring event identified by + * recurringEventId. It uniquely identifies the instance within the recurring event + * series even if the instance was moved to a different time. Immutable. + */ + export interface OriginalStartTime { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Out of office event data. Used if eventType is outOfOffice. + */ + export interface OutOfOfficeProperties { + /** + * Whether to decline meeting invitations which overlap Out of office events. Valid + * values are declineNone, meaning that no meeting invitations are declined; + * declineAllConflictingInvitations, meaning that all conflicting meeting + * invitations that conflict with the event are declined; and + * declineOnlyNewConflictingInvitations, meaning that only new conflicting meeting + * invitations which arrive while the Out of office event is present are to be + * declined. + */ + autoDeclineMode?: string; + + /** + * Response message to set if an existing event or new invitation is automatically + * declined by Calendar. + */ + declineMessage?: string; + } + + /** + * Information about the event's reminders for the authenticated user. + */ + export interface Reminders { + /** + * If the event doesn't use the default reminders, this lists the reminders + * specific to the event, or, if not set, indicates that no reminders are set for + * this event. The maximum number of override reminders is 5. + */ + overrides?: Array; + + /** + * Whether the default reminders of the calendar apply to the event. + */ + useDefault?: boolean; + } + + export namespace Reminders { + export interface Override { + /** + * The method used by this reminder. Possible values are: + * + * - "email" - Reminders are sent via email. + * - "popup" - Reminders are sent via a UI popup. + * Required when adding a reminder. + */ + method?: string; + + /** + * Number of minutes before the start of the event when the reminder should + * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required + * when adding a reminder. + */ + minutes?: number; + } + } + + /** + * Source from which the event was created. For example, a web page, an email + * message or any document identifiable by an URL with HTTP or HTTPS scheme. Can + * only be seen or modified by the creator of the event. + */ + export interface Source { + /** + * Title of the source; for example a title of a web page or an email subject. + */ + title?: string; + + /** + * URL of the source pointing to a resource. The URL scheme must be HTTP or HTTPS. + */ + url?: string; + } + + /** + * The (inclusive) start time of the event. For a recurring event, this is the + * start time of the first instance. + */ + export interface Start { + /** + * The date, in the format "yyyy-mm-dd", if this is an all-day event. + */ + date?: string; + + /** + * The time, as a combined date-time value (formatted according to RFC3339). A time + * zone offset is required unless a time zone is explicitly specified in timeZone. + */ + dateTime?: string; + + /** + * The time zone in which the time is specified. (Formatted as an IANA Time Zone + * Database name, e.g. "Europe/Zurich".) For recurring events this field is + * required and specifies the time zone in which the recurrence is expanded. For + * single events this field is optional and indicates a custom time zone for the + * event start/end. + */ + timeZone?: string; + } + + /** + * Working location event data. + */ + export interface WorkingLocationProperties { + /** + * If present, specifies that the user is working from a custom location. + */ + customLocation?: WorkingLocationProperties.CustomLocation; + + /** + * If present, specifies that the user is working at home. + */ + homeOffice?: unknown; + + /** + * If present, specifies that the user is working from an office. + */ + officeLocation?: WorkingLocationProperties.OfficeLocation; + + /** + * Type of the working location. Possible values are: + * + * - "homeOffice" - The user is working at home. + * - "officeLocation" - The user is working from an office. + * - "customLocation" - The user is working from a custom location. Any details are + * specified in a sub-field of the specified name, but this field may be missing + * if empty. Any other fields are ignored. Required when adding working location + * properties. + */ + type?: string; + } + + export namespace WorkingLocationProperties { + /** + * If present, specifies that the user is working from a custom location. + */ + export interface CustomLocation { + /** + * An optional extra label for additional information. + */ + label?: string; + } + + /** + * If present, specifies that the user is working from an office. + */ + export interface OfficeLocation { + /** + * An optional building identifier. This should reference a building ID in the + * organization's Resources database. + */ + buildingId?: string; + + /** + * An optional desk identifier. + */ + deskId?: string; + + /** + * An optional floor identifier. + */ + floorId?: string; + + /** + * An optional floor section identifier. + */ + floorSectionId?: string; + + /** + * The office name that's displayed in Calendar Web and Mobile clients. We + * recommend you reference a building name in the organization's Resources + * database. + */ + label?: string; + } + } } export interface EventInstancesParams { - /** - * Path param: Calendar identifier. To retrieve calendar IDs call the - * calendarList.list method. If you want to access the primary calendar of the - * currently logged in user, use the "primary" keyword. - */ - calendarId: string; - - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Deprecated and ignored. A value will always be returned in the - * email field for the organizer, creator and attendees, even if no real email - * address is available (i.e. a generated, non-working value will be provided). - */ - alwaysIncludeEmail?: boolean; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: The maximum number of attendees to include in the response. If - * there are more than the specified number of attendees, only the participant is - * returned. Optional. - */ - maxAttendees?: number; - - /** - * Query param: Maximum number of events returned on one result page. By default - * the value is 250 events. The page size can never be larger than 2500 events. - * Optional. - */ - maxResults?: number; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: The original start time of the instance in the result. Optional. - */ - originalStart?: string; - - /** - * Query param: Token specifying which result page to return. Optional. - */ - pageToken?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Whether to include deleted events (with status equals "cancelled") - * in the result. Cancelled instances of recurring events will still be included if - * singleEvents is False. Optional. The default is False. - */ - showDeleted?: boolean; - - /** - * Query param: Upper bound (exclusive) for an event's start time to filter by. - * Optional. The default is not to filter by start time. Must be an RFC3339 - * timestamp with mandatory time zone offset. - */ - timeMax?: string; - - /** - * Query param: Lower bound (inclusive) for an event's end time to filter by. - * Optional. The default is not to filter by end time. Must be an RFC3339 timestamp - * with mandatory time zone offset. - */ - timeMin?: string; - - /** - * Query param: Time zone used in the response. Optional. The default is the time - * zone of the calendar. - */ - timeZone?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Path param: Calendar identifier. To retrieve calendar IDs call the + * calendarList.list method. If you want to access the primary calendar of the + * currently logged in user, use the "primary" keyword. + */ + calendarId: string; + + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Deprecated and ignored. A value will always be returned in the + * email field for the organizer, creator and attendees, even if no real email + * address is available (i.e. a generated, non-working value will be provided). + */ + alwaysIncludeEmail?: boolean; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: The maximum number of attendees to include in the response. If + * there are more than the specified number of attendees, only the participant is + * returned. Optional. + */ + maxAttendees?: number; + + /** + * Query param: Maximum number of events returned on one result page. By default + * the value is 250 events. The page size can never be larger than 2500 events. + * Optional. + */ + maxResults?: number; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: The original start time of the instance in the result. Optional. + */ + originalStart?: string; + + /** + * Query param: Token specifying which result page to return. Optional. + */ + pageToken?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Whether to include deleted events (with status equals "cancelled") + * in the result. Cancelled instances of recurring events will still be included if + * singleEvents is False. Optional. The default is False. + */ + showDeleted?: boolean; + + /** + * Query param: Upper bound (exclusive) for an event's start time to filter by. + * Optional. The default is not to filter by start time. Must be an RFC3339 + * timestamp with mandatory time zone offset. + */ + timeMax?: string; + + /** + * Query param: Lower bound (inclusive) for an event's end time to filter by. + * Optional. The default is not to filter by end time. Must be an RFC3339 timestamp + * with mandatory time zone offset. + */ + timeMin?: string; + + /** + * Query param: Time zone used in the response. Optional. The default is the time + * zone of the calendar. + */ + timeZone?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface EventMoveParams { - /** - * Path param: Calendar identifier of the source calendar where the event currently - * is on. - */ - calendarId: string; - - /** - * Query param: Calendar identifier of the target calendar where the event is to be - * moved to. - */ - destination: string; - - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use sendUpdates instead. - * - * Whether to send notifications about the change of the event's organizer. Note - * that some emails might still be sent even if you set the value to false. The - * default is false. - */ - sendNotifications?: boolean; - - /** - * Query param: Guests who should receive notifications about the change of the - * event's organizer. - */ - sendUpdates?: "all" | "externalOnly" | "none"; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Path param: Calendar identifier of the source calendar where the event currently + * is on. + */ + calendarId: string; + + /** + * Query param: Calendar identifier of the target calendar where the event is to be + * moved to. + */ + destination: string; + + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use sendUpdates instead. + * + * Whether to send notifications about the change of the event's organizer. Note + * that some emails might still be sent even if you set the value to false. The + * default is false. + */ + sendNotifications?: boolean; + + /** + * Query param: Guests who should receive notifications about the change of the + * event's organizer. + */ + sendUpdates?: "all" | "externalOnly" | "none"; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface EventQuickAddParams { - /** - * The text describing the event to be created. - */ - text: string; - - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Deprecated. Please use sendUpdates instead. - * - * Whether to send notifications about the creation of the event. Note that some - * emails might still be sent even if you set the value to false. The default is - * false. - */ - sendNotifications?: boolean; - - /** - * Guests who should receive notifications about the creation of the new event. - */ - sendUpdates?: "all" | "externalOnly" | "none"; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * The text describing the event to be created. + */ + text: string; + + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Deprecated. Please use sendUpdates instead. + * + * Whether to send notifications about the creation of the event. Note that some + * emails might still be sent even if you set the value to false. The default is + * false. + */ + sendNotifications?: boolean; + + /** + * Guests who should receive notifications about the creation of the new event. + */ + sendUpdates?: "all" | "externalOnly" | "none"; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface EventWatchParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Deprecated and ignored. - */ - alwaysIncludeEmail?: boolean; - - /** - * Query param: Event types to return. Optional. This parameter can be repeated - * multiple times to return events of different types. The default is ["default", - * "focusTime", "outOfOffice"]. - */ - eventTypes?: Array< - "default" | "focusTime" | "outOfOffice" | "workingLocation" - >; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: Specifies an event ID in the iCalendar format to be provided in the - * response. Optional. Use this if you want to search for an event by its iCalendar - * ID. - */ - iCalUID?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: The maximum number of attendees to include in the response. If - * there are more than the specified number of attendees, only the participant is - * returned. Optional. - */ - maxAttendees?: number; - - /** - * Query param: Maximum number of events returned on one result page. The number of - * events in the resulting page may be less than this value, or none at all, even - * if there are more events matching the query. Incomplete pages can be detected by - * a non-empty nextPageToken field in the response. By default the value is 250 - * events. The page size can never be larger than 2500 events. Optional. - */ - maxResults?: number; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: The order of the events returned in the result. Optional. The - * default is an unspecified, stable order. - */ - orderBy?: "startTime" | "updated"; - - /** - * Query param: Token specifying which result page to return. Optional. - */ - pageToken?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: Extended properties constraint specified as propertyName=value. - * Matches only private properties. This parameter might be repeated multiple times - * to return events that match all given constraints. - */ - privateExtendedProperty?: Array; - - /** - * Query param: Free text search terms to find events that match these terms in the - * following fields: - * - * - summary - * - description - * - location - * - attendee's displayName - * - attendee's email - * - organizer's displayName - * - organizer's email - * - workingLocationProperties.officeLocation.buildingId - * - workingLocationProperties.officeLocation.deskId - * - workingLocationProperties.officeLocation.label - * - workingLocationProperties.customLocation.label These search terms also match - * predefined keywords against all display title translations of working - * location, out-of-office, and focus-time events. For example, searching for - * "Office" or "Bureau" returns working location events of type officeLocation, - * whereas searching for "Out of office" or "Abwesend" returns out-of-office - * events. Optional. - */ - q?: string; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Extended properties constraint specified as propertyName=value. - * Matches only shared properties. This parameter might be repeated multiple times - * to return events that match all given constraints. - */ - sharedExtendedProperty?: Array; - - /** - * Query param: Whether to include deleted events (with status equals "cancelled") - * in the result. Cancelled instances of recurring events (but not the underlying - * recurring event) will still be included if showDeleted and singleEvents are both - * False. If showDeleted and singleEvents are both True, only single instances of - * deleted events (but not the underlying recurring events) are returned. Optional. - * The default is False. - */ - showDeleted?: boolean; - - /** - * Query param: Whether to include hidden invitations in the result. Optional. The - * default is False. - */ - showHiddenInvitations?: boolean; - - /** - * Query param: Whether to expand recurring events into instances and only return - * single one-off events and instances of recurring events, but not the underlying - * recurring events themselves. Optional. The default is False. - */ - singleEvents?: boolean; - - /** - * Query param: Token obtained from the nextSyncToken field returned on the last - * page of results from the previous list request. It makes the result of this list - * request contain only entries that have changed since then. All events deleted - * since the previous list request will always be in the result set and it is not - * allowed to set showDeleted to False. There are several query parameters that - * cannot be specified together with nextSyncToken to ensure consistency of the - * client state. - * - * These are: - * - * - iCalUID - * - orderBy - * - privateExtendedProperty - * - q - * - sharedExtendedProperty - * - timeMin - * - timeMax - * - updatedMin All other query parameters should be the same as for the initial - * synchronization to avoid undefined behavior. If the syncToken expires, the - * server will respond with a 410 GONE response code and the client should clear - * its storage and perform a full synchronization without any syncToken. Learn - * more about incremental synchronization. Optional. The default is to return all - * entries. - */ - syncToken?: string; - - /** - * Query param: Upper bound (exclusive) for an event's start time to filter by. - * Optional. The default is not to filter by start time. Must be an RFC3339 - * timestamp with mandatory time zone offset, for example, - * 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided - * but are ignored. If timeMin is set, timeMax must be greater than timeMin. - */ - timeMax?: string; - - /** - * Query param: Lower bound (exclusive) for an event's end time to filter by. - * Optional. The default is not to filter by end time. Must be an RFC3339 timestamp - * with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, - * 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMax - * is set, timeMin must be smaller than timeMax. - */ - timeMin?: string; - - /** - * Query param: Time zone used in the response. Optional. The default is the time - * zone of the calendar. - */ - timeZone?: string; - - /** - * Query param: Lower bound for an event's last modification time (as a RFC3339 - * timestamp) to filter by. When specified, entries deleted since this time will - * always be included regardless of showDeleted. Optional. The default is not to - * filter by last modification time. - */ - updatedMin?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: A UUID or similar unique string that identifies this channel. - */ - id?: string; - - /** - * Body param: An arbitrary string delivered to the target address with each - * notification delivered over this channel. Optional. - */ - token?: string; - - /** - * Body param: The address where notifications are delivered for this channel. - */ - address?: string; - - /** - * Body param: Date and time of notification channel expiration, expressed as a - * Unix timestamp, in milliseconds. Optional. - */ - expiration?: string; - - /** - * Body param: Identifies this as a notification channel used to watch for changes - * to a resource, which is "api#channel". - */ - kind?: string; - - /** - * Body param: Additional parameters controlling delivery channel behavior. - * Optional. - */ - params?: Record; - - /** - * Body param: A Boolean value to indicate whether payload is wanted. Optional. - */ - payload?: boolean; - - /** - * Body param: An opaque ID that identifies the resource being watched on this - * channel. Stable across different API versions. - */ - resourceId?: string; - - /** - * Body param: A version-specific identifier for the watched resource. - */ - resourceUri?: string; - - /** - * Body param: The type of delivery mechanism used for this channel. Valid values - * are "web_hook" (or "webhook"). Both values refer to a channel where Http - * requests are used to deliver messages. - */ - type?: string; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Deprecated and ignored. + */ + alwaysIncludeEmail?: boolean; + + /** + * Query param: Event types to return. Optional. This parameter can be repeated + * multiple times to return events of different types. The default is ["default", + * "focusTime", "outOfOffice"]. + */ + eventTypes?: Array<"default" | "focusTime" | "outOfOffice" | "workingLocation">; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: Specifies an event ID in the iCalendar format to be provided in the + * response. Optional. Use this if you want to search for an event by its iCalendar + * ID. + */ + iCalUID?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: The maximum number of attendees to include in the response. If + * there are more than the specified number of attendees, only the participant is + * returned. Optional. + */ + maxAttendees?: number; + + /** + * Query param: Maximum number of events returned on one result page. The number of + * events in the resulting page may be less than this value, or none at all, even + * if there are more events matching the query. Incomplete pages can be detected by + * a non-empty nextPageToken field in the response. By default the value is 250 + * events. The page size can never be larger than 2500 events. Optional. + */ + maxResults?: number; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: The order of the events returned in the result. Optional. The + * default is an unspecified, stable order. + */ + orderBy?: "startTime" | "updated"; + + /** + * Query param: Token specifying which result page to return. Optional. + */ + pageToken?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: Extended properties constraint specified as propertyName=value. + * Matches only private properties. This parameter might be repeated multiple times + * to return events that match all given constraints. + */ + privateExtendedProperty?: Array; + + /** + * Query param: Free text search terms to find events that match these terms in the + * following fields: + * + * - summary + * - description + * - location + * - attendee's displayName + * - attendee's email + * - organizer's displayName + * - organizer's email + * - workingLocationProperties.officeLocation.buildingId + * - workingLocationProperties.officeLocation.deskId + * - workingLocationProperties.officeLocation.label + * - workingLocationProperties.customLocation.label These search terms also match + * predefined keywords against all display title translations of working + * location, out-of-office, and focus-time events. For example, searching for + * "Office" or "Bureau" returns working location events of type officeLocation, + * whereas searching for "Out of office" or "Abwesend" returns out-of-office + * events. Optional. + */ + q?: string; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Extended properties constraint specified as propertyName=value. + * Matches only shared properties. This parameter might be repeated multiple times + * to return events that match all given constraints. + */ + sharedExtendedProperty?: Array; + + /** + * Query param: Whether to include deleted events (with status equals "cancelled") + * in the result. Cancelled instances of recurring events (but not the underlying + * recurring event) will still be included if showDeleted and singleEvents are both + * False. If showDeleted and singleEvents are both True, only single instances of + * deleted events (but not the underlying recurring events) are returned. Optional. + * The default is False. + */ + showDeleted?: boolean; + + /** + * Query param: Whether to include hidden invitations in the result. Optional. The + * default is False. + */ + showHiddenInvitations?: boolean; + + /** + * Query param: Whether to expand recurring events into instances and only return + * single one-off events and instances of recurring events, but not the underlying + * recurring events themselves. Optional. The default is False. + */ + singleEvents?: boolean; + + /** + * Query param: Token obtained from the nextSyncToken field returned on the last + * page of results from the previous list request. It makes the result of this list + * request contain only entries that have changed since then. All events deleted + * since the previous list request will always be in the result set and it is not + * allowed to set showDeleted to False. There are several query parameters that + * cannot be specified together with nextSyncToken to ensure consistency of the + * client state. + * + * These are: + * + * - iCalUID + * - orderBy + * - privateExtendedProperty + * - q + * - sharedExtendedProperty + * - timeMin + * - timeMax + * - updatedMin All other query parameters should be the same as for the initial + * synchronization to avoid undefined behavior. If the syncToken expires, the + * server will respond with a 410 GONE response code and the client should clear + * its storage and perform a full synchronization without any syncToken. Learn + * more about incremental synchronization. Optional. The default is to return all + * entries. + */ + syncToken?: string; + + /** + * Query param: Upper bound (exclusive) for an event's start time to filter by. + * Optional. The default is not to filter by start time. Must be an RFC3339 + * timestamp with mandatory time zone offset, for example, + * 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided + * but are ignored. If timeMin is set, timeMax must be greater than timeMin. + */ + timeMax?: string; + + /** + * Query param: Lower bound (exclusive) for an event's end time to filter by. + * Optional. The default is not to filter by end time. Must be an RFC3339 timestamp + * with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, + * 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMax + * is set, timeMin must be smaller than timeMax. + */ + timeMin?: string; + + /** + * Query param: Time zone used in the response. Optional. The default is the time + * zone of the calendar. + */ + timeZone?: string; + + /** + * Query param: Lower bound for an event's last modification time (as a RFC3339 + * timestamp) to filter by. When specified, entries deleted since this time will + * always be included regardless of showDeleted. Optional. The default is not to + * filter by last modification time. + */ + updatedMin?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: A UUID or similar unique string that identifies this channel. + */ + id?: string; + + /** + * Body param: An arbitrary string delivered to the target address with each + * notification delivered over this channel. Optional. + */ + token?: string; + + /** + * Body param: The address where notifications are delivered for this channel. + */ + address?: string; + + /** + * Body param: Date and time of notification channel expiration, expressed as a + * Unix timestamp, in milliseconds. Optional. + */ + expiration?: string; + + /** + * Body param: Identifies this as a notification channel used to watch for changes + * to a resource, which is "api#channel". + */ + kind?: string; + + /** + * Body param: Additional parameters controlling delivery channel behavior. + * Optional. + */ + params?: Record; + + /** + * Body param: A Boolean value to indicate whether payload is wanted. Optional. + */ + payload?: boolean; + + /** + * Body param: An opaque ID that identifies the resource being watched on this + * channel. Stable across different API versions. + */ + resourceId?: string; + + /** + * Body param: A version-specific identifier for the watched resource. + */ + resourceUri?: string; + + /** + * Body param: The type of delivery mechanism used for this channel. Valid values + * are "web_hook" (or "webhook"). Both values refer to a channel where Http + * requests are used to deliver messages. + */ + type?: string; } export declare namespace Events { - export { - type Event as Event, - type Events as Events, - type EventCreateParams as EventCreateParams, - type EventRetrieveParams as EventRetrieveParams, - type EventUpdateParams as EventUpdateParams, - type EventListParams as EventListParams, - type EventDeleteParams as EventDeleteParams, - type EventImportParams as EventImportParams, - type EventInstancesParams as EventInstancesParams, - type EventMoveParams as EventMoveParams, - type EventQuickAddParams as EventQuickAddParams, - type EventWatchParams as EventWatchParams, - }; + export { + type Event, + Events, + type EventCreateParams, + type EventRetrieveParams, + EventUpdateParams, + type EventListParams, + type EventDeleteParams, + type EventImportParams, + type EventInstancesParams, + type EventMoveParams, + type EventQuickAddParams, + type EventWatchParams, + }; } diff --git a/packages/google-calendar/src/resources/calendars/index.ts b/packages/google-calendar/src/resources/calendars/index.ts index e06b5cd3..501f38f2 100644 --- a/packages/google-calendar/src/resources/calendars/index.ts +++ b/packages/google-calendar/src/resources/calendars/index.ts @@ -1,36 +1,36 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. export { - ACL, - type ACLRule, - type ACLRetrieveResponse, - type ACLCreateParams, - type ACLRetrieveParams, - type ACLDeleteParams, - type ACLRetrieveRuleParams, - type ACLUpdateRuleParams, - type ACLWatchParams, + ACL, + type ACLRule, + type ACLRetrieveResponse, + type ACLCreateParams, + type ACLRetrieveParams, + type ACLDeleteParams, + type ACLRetrieveRuleParams, + type ACLUpdateRuleParams, + type ACLWatchParams, } from "./acl"; export { - Calendars, - type Calendar, - type CalendarCreateParams, - type CalendarRetrieveParams, - type CalendarUpdateParams, - type CalendarDeleteParams, - type CalendarClearParams, + Calendars, + type Calendar, + type CalendarCreateParams, + type CalendarRetrieveParams, + type CalendarUpdateParams, + type CalendarDeleteParams, + type CalendarClearParams, } from "./calendars"; export { - Events, - type Event, - type EventCreateParams, - type EventRetrieveParams, - type EventUpdateParams, - type EventListParams, - type EventDeleteParams, - type EventImportParams, - type EventInstancesParams, - type EventMoveParams, - type EventQuickAddParams, - type EventWatchParams, + Events, + type Event, + type EventCreateParams, + type EventRetrieveParams, + type EventUpdateParams, + type EventListParams, + type EventDeleteParams, + type EventImportParams, + type EventInstancesParams, + type EventMoveParams, + type EventQuickAddParams, + type EventWatchParams, } from "./events"; diff --git a/packages/google-calendar/src/resources/check-free-busy.ts b/packages/google-calendar/src/resources/check-free-busy.ts index 21e9b9fd..99d0a63e 100644 --- a/packages/google-calendar/src/resources/check-free-busy.ts +++ b/packages/google-calendar/src/resources/check-free-busy.ts @@ -1,234 +1,222 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { APIResource } from "../core/resource"; -import { APIPromise } from "../core/api-promise"; -import { RequestOptions } from "../internal/request-options"; +import type { APIPromise } from "../core/api-promise"; +import type { RequestOptions } from "../internal/request-options"; export class CheckFreeBusy extends APIResource { - /** - * Returns free/busy information for a set of calendars. - */ - checkFreeBusy( - params: CheckFreeBusyCheckFreeBusyParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - userIp, - ...body - } = params ?? {}; - return this._client.post("/freeBusy", { - query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, - body, - ...options, - }); - } + /** + * Returns free/busy information for a set of calendars. + */ + checkFreeBusy( + params: CheckFreeBusyCheckFreeBusyParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp, ...body } = params ?? {}; + return this._client.post("/freeBusy", { + query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, + body, + ...options, + }); + } } export interface CheckFreeBusyCheckFreeBusyResponse { - /** - * List of free/busy information for calendars. - */ - calendars?: Record; - - /** - * Expansion of groups. - */ - groups?: Record; - - /** - * Type of the resource ("calendar#freeBusy"). - */ - kind?: string; - - /** - * The end of the interval. - */ - timeMax?: string; - - /** - * The start of the interval. - */ - timeMin?: string; + /** + * List of free/busy information for calendars. + */ + calendars?: Record; + + /** + * Expansion of groups. + */ + groups?: Record; + + /** + * Type of the resource ("calendar#freeBusy"). + */ + kind?: string; + + /** + * The end of the interval. + */ + timeMax?: string; + + /** + * The start of the interval. + */ + timeMin?: string; } export namespace CheckFreeBusyCheckFreeBusyResponse { - /** - * Free/busy expansions for a single calendar. - */ - export interface Calendars { - /** - * List of time ranges during which this calendar should be regarded as busy. - */ - busy?: Array; - - /** - * Optional error(s) (if computation for the calendar failed). - */ - errors?: Array; - } - - export namespace Calendars { - export interface Busy { - /** - * The (exclusive) end of the time period. - */ - end?: string; - - /** - * The (inclusive) start of the time period. - */ - start?: string; - } - - export interface Error { - /** - * Domain, or broad category, of the error. - */ - domain?: string; - - /** - * Specific reason for the error. Some of the possible values are: - * - * - "groupTooBig" - The group of users requested is too large for a single query. - * - "tooManyCalendarsRequested" - The number of calendars requested is too large - * for a single query. - * - "notFound" - The requested resource was not found. - * - "internalError" - The API service has encountered an internal error. - * Additional error types may be added in the future, so clients should - * gracefully handle additional error statuses not included in this list. - */ - reason?: string; - } - } - - /** - * List of calendars that are members of this group. - */ - export interface Groups { - /** - * List of calendars' identifiers within a group. - */ - calendars?: Array; - - /** - * Optional error(s) (if computation for the group failed). - */ - errors?: Array; - } - - export namespace Groups { - export interface Error { - /** - * Domain, or broad category, of the error. - */ - domain?: string; - - /** - * Specific reason for the error. Some of the possible values are: - * - * - "groupTooBig" - The group of users requested is too large for a single query. - * - "tooManyCalendarsRequested" - The number of calendars requested is too large - * for a single query. - * - "notFound" - The requested resource was not found. - * - "internalError" - The API service has encountered an internal error. - * Additional error types may be added in the future, so clients should - * gracefully handle additional error statuses not included in this list. - */ - reason?: string; - } - } + /** + * Free/busy expansions for a single calendar. + */ + export interface Calendars { + /** + * List of time ranges during which this calendar should be regarded as busy. + */ + busy?: Array; + + /** + * Optional error(s) (if computation for the calendar failed). + */ + errors?: Array; + } + + export namespace Calendars { + export interface Busy { + /** + * The (exclusive) end of the time period. + */ + end?: string; + + /** + * The (inclusive) start of the time period. + */ + start?: string; + } + + export interface Error { + /** + * Domain, or broad category, of the error. + */ + domain?: string; + + /** + * Specific reason for the error. Some of the possible values are: + * + * - "groupTooBig" - The group of users requested is too large for a single query. + * - "tooManyCalendarsRequested" - The number of calendars requested is too large + * for a single query. + * - "notFound" - The requested resource was not found. + * - "internalError" - The API service has encountered an internal error. + * Additional error types may be added in the future, so clients should + * gracefully handle additional error statuses not included in this list. + */ + reason?: string; + } + } + + /** + * List of calendars that are members of this group. + */ + export interface Groups { + /** + * List of calendars' identifiers within a group. + */ + calendars?: Array; + + /** + * Optional error(s) (if computation for the group failed). + */ + errors?: Array; + } + + export namespace Groups { + export interface Error { + /** + * Domain, or broad category, of the error. + */ + domain?: string; + + /** + * Specific reason for the error. Some of the possible values are: + * + * - "groupTooBig" - The group of users requested is too large for a single query. + * - "tooManyCalendarsRequested" - The number of calendars requested is too large + * for a single query. + * - "notFound" - The requested resource was not found. + * - "internalError" - The API service has encountered an internal error. + * Additional error types may be added in the future, so clients should + * gracefully handle additional error statuses not included in this list. + */ + reason?: string; + } + } } export interface CheckFreeBusyCheckFreeBusyParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: Maximal number of calendars for which FreeBusy information is to be - * provided. Optional. Maximum value is 50. - */ - calendarExpansionMax?: number; - - /** - * Body param: Maximal number of calendar identifiers to be provided for a single - * group. Optional. An error is returned for a group with more members than this - * value. Maximum value is 100. - */ - groupExpansionMax?: number; - - /** - * Body param: List of calendars and/or groups to query. - */ - items?: Array; - - /** - * Body param: The end of the interval for the query formatted as per RFC3339. - */ - timeMax?: string; - - /** - * Body param: The start of the interval for the query formatted as per RFC3339. - */ - timeMin?: string; - - /** - * Body param: Time zone used in the response. Optional. The default is UTC. - */ - timeZone?: string; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: Maximal number of calendars for which FreeBusy information is to be + * provided. Optional. Maximum value is 50. + */ + calendarExpansionMax?: number; + + /** + * Body param: Maximal number of calendar identifiers to be provided for a single + * group. Optional. An error is returned for a group with more members than this + * value. Maximum value is 100. + */ + groupExpansionMax?: number; + + /** + * Body param: List of calendars and/or groups to query. + */ + items?: Array; + + /** + * Body param: The end of the interval for the query formatted as per RFC3339. + */ + timeMax?: string; + + /** + * Body param: The start of the interval for the query formatted as per RFC3339. + */ + timeMin?: string; + + /** + * Body param: Time zone used in the response. Optional. The default is UTC. + */ + timeZone?: string; } export namespace CheckFreeBusyCheckFreeBusyParams { - export interface Item { - /** - * The identifier of a calendar or a group. - */ - id?: string; - } + export interface Item { + /** + * The identifier of a calendar or a group. + */ + id?: string; + } } export declare namespace CheckFreeBusy { - export { - type CheckFreeBusyCheckFreeBusyResponse as CheckFreeBusyCheckFreeBusyResponse, - type CheckFreeBusyCheckFreeBusyParams as CheckFreeBusyCheckFreeBusyParams, - }; + export { CheckFreeBusyCheckFreeBusyResponse, type CheckFreeBusyCheckFreeBusyParams }; } diff --git a/packages/google-calendar/src/resources/index.ts b/packages/google-calendar/src/resources/index.ts index 3955f30d..d61736cd 100644 --- a/packages/google-calendar/src/resources/index.ts +++ b/packages/google-calendar/src/resources/index.ts @@ -2,26 +2,26 @@ export * from "./shared"; export { - Calendars, - type Calendar, - type CalendarCreateParams, - type CalendarRetrieveParams, - type CalendarUpdateParams, - type CalendarDeleteParams, - type CalendarClearParams, + Calendars, + type Calendar, + type CalendarCreateParams, + type CalendarRetrieveParams, + type CalendarUpdateParams, + type CalendarDeleteParams, + type CalendarClearParams, } from "./calendars/calendars"; export { - CheckFreeBusy, - type CheckFreeBusyCheckFreeBusyResponse, - type CheckFreeBusyCheckFreeBusyParams, + CheckFreeBusy, + type CheckFreeBusyCheckFreeBusyResponse, + type CheckFreeBusyCheckFreeBusyParams, } from "./check-free-busy"; export { - ListColors, - type ListColorListColorsResponse, - type ListColorListColorsParams, + ListColors, + type ListColorListColorsResponse, + type ListColorListColorsParams, } from "./list-colors"; export { - StopWatching, - type StopWatchingStopWatchingParams, + StopWatching, + type StopWatchingStopWatchingParams, } from "./stop-watching"; export { Users } from "./users/users"; diff --git a/packages/google-calendar/src/resources/list-colors.ts b/packages/google-calendar/src/resources/list-colors.ts index 7e61e2cf..935af8b8 100644 --- a/packages/google-calendar/src/resources/list-colors.ts +++ b/packages/google-calendar/src/resources/list-colors.ts @@ -1,123 +1,120 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { APIResource } from "../core/resource"; -import { APIPromise } from "../core/api-promise"; -import { RequestOptions } from "../internal/request-options"; +import type { APIPromise } from "../core/api-promise"; +import type { RequestOptions } from "../internal/request-options"; export class ListColors extends APIResource { - /** - * Returns the color definitions for calendars and events. - */ - listColors( - query: ListColorListColorsParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - return this._client.get("/colors", { query, ...options }); - } + /** + * Returns the color definitions for calendars and events. + */ + listColors( + query: ListColorListColorsParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + return this._client.get("/colors", { query, ...options }); + } } export interface ListColorListColorsResponse { - /** - * A global palette of calendar colors, mapping from the color ID to its - * definition. A calendarListEntry resource refers to one of these color IDs in its - * colorId field. Read-only. - */ - calendar?: Record; - - /** - * A global palette of event colors, mapping from the color ID to its definition. - * An event resource may refer to one of these color IDs in its colorId field. - * Read-only. - */ - event?: Record; - - /** - * Type of the resource ("calendar#colors"). - */ - kind?: string; - - /** - * Last modification time of the color palette (as a RFC3339 timestamp). Read-only. - */ - updated?: string; + /** + * A global palette of calendar colors, mapping from the color ID to its + * definition. A calendarListEntry resource refers to one of these color IDs in its + * colorId field. Read-only. + */ + calendar?: Record; + + /** + * A global palette of event colors, mapping from the color ID to its definition. + * An event resource may refer to one of these color IDs in its colorId field. + * Read-only. + */ + event?: Record; + + /** + * Type of the resource ("calendar#colors"). + */ + kind?: string; + + /** + * Last modification time of the color palette (as a RFC3339 timestamp). Read-only. + */ + updated?: string; } export namespace ListColorListColorsResponse { - /** - * A calendar color definition. - */ - export interface Calendar { - /** - * The background color associated with this color definition. - */ - background?: string; - - /** - * The foreground color that can be used to write on top of a background with - * 'background' color. - */ - foreground?: string; - } - - /** - * An event color definition. - */ - export interface Event { - /** - * The background color associated with this color definition. - */ - background?: string; - - /** - * The foreground color that can be used to write on top of a background with - * 'background' color. - */ - foreground?: string; - } + /** + * A calendar color definition. + */ + export interface Calendar { + /** + * The background color associated with this color definition. + */ + background?: string; + + /** + * The foreground color that can be used to write on top of a background with + * 'background' color. + */ + foreground?: string; + } + + /** + * An event color definition. + */ + export interface Event { + /** + * The background color associated with this color definition. + */ + background?: string; + + /** + * The foreground color that can be used to write on top of a background with + * 'background' color. + */ + foreground?: string; + } } export interface ListColorListColorsParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export declare namespace ListColors { - export { - type ListColorListColorsResponse as ListColorListColorsResponse, - type ListColorListColorsParams as ListColorListColorsParams, - }; + export type { ListColorListColorsResponse, ListColorListColorsParams }; } diff --git a/packages/google-calendar/src/resources/shared.ts b/packages/google-calendar/src/resources/shared.ts index f1ebe94f..195e892f 100644 --- a/packages/google-calendar/src/resources/shared.ts +++ b/packages/google-calendar/src/resources/shared.ts @@ -1,59 +1,59 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. export interface Channel { - /** - * A UUID or similar unique string that identifies this channel. - */ - id?: string; - - /** - * An arbitrary string delivered to the target address with each notification - * delivered over this channel. Optional. - */ - token?: string; - - /** - * The address where notifications are delivered for this channel. - */ - address?: string; - - /** - * Date and time of notification channel expiration, expressed as a Unix timestamp, - * in milliseconds. Optional. - */ - expiration?: string; - - /** - * Identifies this as a notification channel used to watch for changes to a - * resource, which is "api#channel". - */ - kind?: string; - - /** - * Additional parameters controlling delivery channel behavior. Optional. - */ - params?: Record; - - /** - * A Boolean value to indicate whether payload is wanted. Optional. - */ - payload?: boolean; - - /** - * An opaque ID that identifies the resource being watched on this channel. Stable - * across different API versions. - */ - resourceId?: string; - - /** - * A version-specific identifier for the watched resource. - */ - resourceUri?: string; - - /** - * The type of delivery mechanism used for this channel. Valid values are - * "web_hook" (or "webhook"). Both values refer to a channel where Http requests - * are used to deliver messages. - */ - type?: string; + /** + * A UUID or similar unique string that identifies this channel. + */ + id?: string; + + /** + * An arbitrary string delivered to the target address with each notification + * delivered over this channel. Optional. + */ + token?: string; + + /** + * The address where notifications are delivered for this channel. + */ + address?: string; + + /** + * Date and time of notification channel expiration, expressed as a Unix timestamp, + * in milliseconds. Optional. + */ + expiration?: string; + + /** + * Identifies this as a notification channel used to watch for changes to a + * resource, which is "api#channel". + */ + kind?: string; + + /** + * Additional parameters controlling delivery channel behavior. Optional. + */ + params?: Record; + + /** + * A Boolean value to indicate whether payload is wanted. Optional. + */ + payload?: boolean; + + /** + * An opaque ID that identifies the resource being watched on this channel. Stable + * across different API versions. + */ + resourceId?: string; + + /** + * A version-specific identifier for the watched resource. + */ + resourceUri?: string; + + /** + * The type of delivery mechanism used for this channel. Valid values are + * "web_hook" (or "webhook"). Both values refer to a channel where Http requests + * are used to deliver messages. + */ + type?: string; } diff --git a/packages/google-calendar/src/resources/stop-watching.ts b/packages/google-calendar/src/resources/stop-watching.ts index 55799931..4600862a 100644 --- a/packages/google-calendar/src/resources/stop-watching.ts +++ b/packages/google-calendar/src/resources/stop-watching.ts @@ -1,133 +1,124 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { APIResource } from "../core/resource"; -import { APIPromise } from "../core/api-promise"; +import type { APIPromise } from "../core/api-promise"; import { buildHeaders } from "../internal/headers"; -import { RequestOptions } from "../internal/request-options"; +import type { RequestOptions } from "../internal/request-options"; export class StopWatching extends APIResource { - /** - * Stop watching resources through this channel - */ - stopWatching( - params: StopWatchingStopWatchingParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - userIp, - ...body - } = params ?? {}; - return this._client.post("/channels/stop", { - query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, - body, - ...options, - headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), - }); - } + /** + * Stop watching resources through this channel + */ + stopWatching( + params: StopWatchingStopWatchingParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp, ...body } = params ?? {}; + return this._client.post("/channels/stop", { + query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, + body, + ...options, + headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), + }); + } } export interface StopWatchingStopWatchingParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: A UUID or similar unique string that identifies this channel. - */ - id?: string; - - /** - * Body param: An arbitrary string delivered to the target address with each - * notification delivered over this channel. Optional. - */ - token?: string; - - /** - * Body param: The address where notifications are delivered for this channel. - */ - address?: string; - - /** - * Body param: Date and time of notification channel expiration, expressed as a - * Unix timestamp, in milliseconds. Optional. - */ - expiration?: string; - - /** - * Body param: Identifies this as a notification channel used to watch for changes - * to a resource, which is "api#channel". - */ - kind?: string; - - /** - * Body param: Additional parameters controlling delivery channel behavior. - * Optional. - */ - params?: Record; - - /** - * Body param: A Boolean value to indicate whether payload is wanted. Optional. - */ - payload?: boolean; - - /** - * Body param: An opaque ID that identifies the resource being watched on this - * channel. Stable across different API versions. - */ - resourceId?: string; - - /** - * Body param: A version-specific identifier for the watched resource. - */ - resourceUri?: string; - - /** - * Body param: The type of delivery mechanism used for this channel. Valid values - * are "web_hook" (or "webhook"). Both values refer to a channel where Http - * requests are used to deliver messages. - */ - type?: string; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: A UUID or similar unique string that identifies this channel. + */ + id?: string; + + /** + * Body param: An arbitrary string delivered to the target address with each + * notification delivered over this channel. Optional. + */ + token?: string; + + /** + * Body param: The address where notifications are delivered for this channel. + */ + address?: string; + + /** + * Body param: Date and time of notification channel expiration, expressed as a + * Unix timestamp, in milliseconds. Optional. + */ + expiration?: string; + + /** + * Body param: Identifies this as a notification channel used to watch for changes + * to a resource, which is "api#channel". + */ + kind?: string; + + /** + * Body param: Additional parameters controlling delivery channel behavior. + * Optional. + */ + params?: Record; + + /** + * Body param: A Boolean value to indicate whether payload is wanted. Optional. + */ + payload?: boolean; + + /** + * Body param: An opaque ID that identifies the resource being watched on this + * channel. Stable across different API versions. + */ + resourceId?: string; + + /** + * Body param: A version-specific identifier for the watched resource. + */ + resourceUri?: string; + + /** + * Body param: The type of delivery mechanism used for this channel. Valid values + * are "web_hook" (or "webhook"). Both values refer to a channel where Http + * requests are used to deliver messages. + */ + type?: string; } export declare namespace StopWatching { - export { type StopWatchingStopWatchingParams as StopWatchingStopWatchingParams }; + export type { StopWatchingStopWatchingParams }; } diff --git a/packages/google-calendar/src/resources/users/me/calendar-list.ts b/packages/google-calendar/src/resources/users/me/calendar-list.ts index 4d3ec612..7476a3f7 100644 --- a/packages/google-calendar/src/resources/users/me/calendar-list.ts +++ b/packages/google-calendar/src/resources/users/me/calendar-list.ts @@ -1,1184 +1,1165 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { APIResource } from "../../../core/resource"; -import * as Shared from "../../shared"; -import { APIPromise } from "../../../core/api-promise"; +import type * as Shared from "../../shared"; +import type { APIPromise } from "../../../core/api-promise"; import { buildHeaders } from "../../../internal/headers"; -import { RequestOptions } from "../../../internal/request-options"; +import type { RequestOptions } from "../../../internal/request-options"; import { path } from "../../../internal/utils/path"; export class CalendarList extends APIResource { - /** - * Inserts an existing calendar into the user's calendar list. - */ - create( - params: CalendarListCreateParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - colorRgbFormat, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - userIp, - ...body - } = params ?? {}; - return this._client.post("/users/me/calendarList", { - query: { - alt, - colorRgbFormat, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - userIp, - }, - body, - ...options, - }); - } - - /** - * Returns a calendar from the user's calendar list. - */ - retrieve( - calendarID: string, - query: CalendarListRetrieveParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - return this._client.get(path`/users/me/calendarList/${calendarID}`, { - query, - ...options, - }); - } - - /** - * Updates an existing calendar on the user's calendar list. - */ - update( - calendarID: string, - params: CalendarListUpdateParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - colorRgbFormat, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - userIp, - ...body - } = params ?? {}; - return this._client.put(path`/users/me/calendarList/${calendarID}`, { - query: { - alt, - colorRgbFormat, - fields, - key, - oauth_token, - prettyPrint, - quotaUser, - userIp, - }, - body, - ...options, - }); - } - - /** - * Returns the calendars on the user's calendar list. - */ - list( - query: CalendarListListParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - return this._client.get("/users/me/calendarList", { query, ...options }); - } - - /** - * Removes a calendar from the user's calendar list. - */ - delete( - calendarID: string, - params: CalendarListDeleteParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp } = - params ?? {}; - return this._client.delete(path`/users/me/calendarList/${calendarID}`, { - query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, - ...options, - headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), - }); - } - - /** - * Watch for changes to CalendarList resources. - */ - watch( - params: CalendarListWatchParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - fields, - key, - maxResults, - minAccessRole, - oauth_token, - pageToken, - prettyPrint, - quotaUser, - showDeleted, - showHidden, - syncToken, - userIp, - ...body - } = params ?? {}; - return this._client.post("/users/me/calendarList/watch", { - query: { - alt, - fields, - key, - maxResults, - minAccessRole, - oauth_token, - pageToken, - prettyPrint, - quotaUser, - showDeleted, - showHidden, - syncToken, - userIp, - }, - body, - ...options, - }); - } + /** + * Inserts an existing calendar into the user's calendar list. + */ + create( + params: CalendarListCreateParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { alt, colorRgbFormat, fields, key, oauth_token, prettyPrint, quotaUser, userIp, ...body } = + params ?? {}; + return this._client.post("/users/me/calendarList", { + query: { + alt, + colorRgbFormat, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + userIp, + }, + body, + ...options, + }); + } + + /** + * Returns a calendar from the user's calendar list. + */ + retrieve( + calendarID: string, + query: CalendarListRetrieveParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + return this._client.get(path`/users/me/calendarList/${calendarID}`, { + query, + ...options, + }); + } + + /** + * Updates an existing calendar on the user's calendar list. + */ + update( + calendarID: string, + params: CalendarListUpdateParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { alt, colorRgbFormat, fields, key, oauth_token, prettyPrint, quotaUser, userIp, ...body } = + params ?? {}; + return this._client.put(path`/users/me/calendarList/${calendarID}`, { + query: { + alt, + colorRgbFormat, + fields, + key, + oauth_token, + prettyPrint, + quotaUser, + userIp, + }, + body, + ...options, + }); + } + + /** + * Returns the calendars on the user's calendar list. + */ + list( + query: CalendarListListParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + return this._client.get("/users/me/calendarList", { query, ...options }); + } + + /** + * Removes a calendar from the user's calendar list. + */ + delete( + calendarID: string, + params: CalendarListDeleteParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp } = params ?? {}; + return this._client.delete(path`/users/me/calendarList/${calendarID}`, { + query: { alt, fields, key, oauth_token, prettyPrint, quotaUser, userIp }, + ...options, + headers: buildHeaders([{ Accept: "*/*" }, options?.headers]), + }); + } + + /** + * Watch for changes to CalendarList resources. + */ + watch( + params: CalendarListWatchParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { + alt, + fields, + key, + maxResults, + minAccessRole, + oauth_token, + pageToken, + prettyPrint, + quotaUser, + showDeleted, + showHidden, + syncToken, + userIp, + ...body + } = params ?? {}; + return this._client.post("/users/me/calendarList/watch", { + query: { + alt, + fields, + key, + maxResults, + minAccessRole, + oauth_token, + pageToken, + prettyPrint, + quotaUser, + showDeleted, + showHidden, + syncToken, + userIp, + }, + body, + ...options, + }); + } } export interface CalendarListEntry { - /** - * Identifier of the calendar. - */ - id?: string; - - /** - * The effective access role that the authenticated user has on the calendar. - * Read-only. Possible values are: - * - * - "freeBusyReader" - Provides read access to free/busy information. - * - "reader" - Provides read access to the calendar. Private events will appear to - * users with reader access, but event details will be hidden. - * - "writer" - Provides read and write access to the calendar. Private events will - * appear to users with writer access, and event details will be visible. - * - "owner" - Provides ownership of the calendar. This role has all of the - * permissions of the writer role with the additional ability to see and - * manipulate ACLs. - */ - accessRole?: string; - - /** - * The main color of the calendar in the hexadecimal format "#0088aa". This - * property supersedes the index-based colorId property. To set or change this - * property, you need to specify colorRgbFormat=true in the parameters of the - * insert, update and patch methods. Optional. - */ - backgroundColor?: string; - - /** - * The color of the calendar. This is an ID referring to an entry in the calendar - * section of the colors definition (see the colors endpoint). This property is - * superseded by the backgroundColor and foregroundColor properties and can be - * ignored when using these properties. Optional. - */ - colorId?: string; - - /** - * Conferencing properties for this calendar, for example what types of conferences - * are allowed. - */ - conferenceProperties?: CalendarListEntry.ConferenceProperties; - - /** - * The default reminders that the authenticated user has for this calendar. - */ - defaultReminders?: Array; - - /** - * Whether this calendar list entry has been deleted from the calendar list. - * Read-only. Optional. The default is False. - */ - deleted?: boolean; - - /** - * Description of the calendar. Optional. Read-only. - */ - description?: string; - - /** - * ETag of the resource. - */ - etag?: string; - - /** - * The foreground color of the calendar in the hexadecimal format "#ffffff". This - * property supersedes the index-based colorId property. To set or change this - * property, you need to specify colorRgbFormat=true in the parameters of the - * insert, update and patch methods. Optional. - */ - foregroundColor?: string; - - /** - * Whether the calendar has been hidden from the list. Optional. The attribute is - * only returned when the calendar is hidden, in which case the value is true. - */ - hidden?: boolean; - - /** - * Type of the resource ("calendar#calendarListEntry"). - */ - kind?: string; - - /** - * Geographic location of the calendar as free-form text. Optional. Read-only. - */ - location?: string; - - /** - * The notifications that the authenticated user is receiving for this calendar. - */ - notificationSettings?: CalendarListEntry.NotificationSettings; - - /** - * Whether the calendar is the primary calendar of the authenticated user. - * Read-only. Optional. The default is False. - */ - primary?: boolean; - - /** - * Whether the calendar content shows up in the calendar UI. Optional. The default - * is False. - */ - selected?: boolean; - - /** - * Title of the calendar. Read-only. - */ - summary?: string; - - /** - * The summary that the authenticated user has set for this calendar. Optional. - */ - summaryOverride?: string; - - /** - * The time zone of the calendar. Optional. Read-only. - */ - timeZone?: string; + /** + * Identifier of the calendar. + */ + id?: string; + + /** + * The effective access role that the authenticated user has on the calendar. + * Read-only. Possible values are: + * + * - "freeBusyReader" - Provides read access to free/busy information. + * - "reader" - Provides read access to the calendar. Private events will appear to + * users with reader access, but event details will be hidden. + * - "writer" - Provides read and write access to the calendar. Private events will + * appear to users with writer access, and event details will be visible. + * - "owner" - Provides ownership of the calendar. This role has all of the + * permissions of the writer role with the additional ability to see and + * manipulate ACLs. + */ + accessRole?: string; + + /** + * The main color of the calendar in the hexadecimal format "#0088aa". This + * property supersedes the index-based colorId property. To set or change this + * property, you need to specify colorRgbFormat=true in the parameters of the + * insert, update and patch methods. Optional. + */ + backgroundColor?: string; + + /** + * The color of the calendar. This is an ID referring to an entry in the calendar + * section of the colors definition (see the colors endpoint). This property is + * superseded by the backgroundColor and foregroundColor properties and can be + * ignored when using these properties. Optional. + */ + colorId?: string; + + /** + * Conferencing properties for this calendar, for example what types of conferences + * are allowed. + */ + conferenceProperties?: CalendarListEntry.ConferenceProperties; + + /** + * The default reminders that the authenticated user has for this calendar. + */ + defaultReminders?: Array; + + /** + * Whether this calendar list entry has been deleted from the calendar list. + * Read-only. Optional. The default is False. + */ + deleted?: boolean; + + /** + * Description of the calendar. Optional. Read-only. + */ + description?: string; + + /** + * ETag of the resource. + */ + etag?: string; + + /** + * The foreground color of the calendar in the hexadecimal format "#ffffff". This + * property supersedes the index-based colorId property. To set or change this + * property, you need to specify colorRgbFormat=true in the parameters of the + * insert, update and patch methods. Optional. + */ + foregroundColor?: string; + + /** + * Whether the calendar has been hidden from the list. Optional. The attribute is + * only returned when the calendar is hidden, in which case the value is true. + */ + hidden?: boolean; + + /** + * Type of the resource ("calendar#calendarListEntry"). + */ + kind?: string; + + /** + * Geographic location of the calendar as free-form text. Optional. Read-only. + */ + location?: string; + + /** + * The notifications that the authenticated user is receiving for this calendar. + */ + notificationSettings?: CalendarListEntry.NotificationSettings; + + /** + * Whether the calendar is the primary calendar of the authenticated user. + * Read-only. Optional. The default is False. + */ + primary?: boolean; + + /** + * Whether the calendar content shows up in the calendar UI. Optional. The default + * is False. + */ + selected?: boolean; + + /** + * Title of the calendar. Read-only. + */ + summary?: string; + + /** + * The summary that the authenticated user has set for this calendar. Optional. + */ + summaryOverride?: string; + + /** + * The time zone of the calendar. Optional. Read-only. + */ + timeZone?: string; } export namespace CalendarListEntry { - /** - * Conferencing properties for this calendar, for example what types of conferences - * are allowed. - */ - export interface ConferenceProperties { - /** - * The types of conference solutions that are supported for this calendar. The - * possible values are: - * - * - "eventHangout" - * - "eventNamedHangout" - * - "hangoutsMeet" Optional. - */ - allowedConferenceSolutionTypes?: Array; - } - - export interface DefaultReminder { - /** - * The method used by this reminder. Possible values are: - * - * - "email" - Reminders are sent via email. - * - "popup" - Reminders are sent via a UI popup. - * Required when adding a reminder. - */ - method?: string; - - /** - * Number of minutes before the start of the event when the reminder should - * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required - * when adding a reminder. - */ - minutes?: number; - } - - /** - * The notifications that the authenticated user is receiving for this calendar. - */ - export interface NotificationSettings { - /** - * The list of notifications set for this calendar. - */ - notifications?: Array; - } - - export namespace NotificationSettings { - export interface Notification { - /** - * The method used to deliver the notification. The possible value is: - * - * - "email" - Notifications are sent via email. - * Required when adding a notification. - */ - method?: string; - - /** - * The type of notification. Possible values are: - * - * - "eventCreation" - Notification sent when a new event is put on the calendar. - * - "eventChange" - Notification sent when an event is changed. - * - "eventCancellation" - Notification sent when an event is cancelled. - * - "eventResponse" - Notification sent when an attendee responds to the event - * invitation. - * - "agenda" - An agenda with the events of the day (sent out in the morning). - * Required when adding a notification. - */ - type?: string; - } - } + /** + * Conferencing properties for this calendar, for example what types of conferences + * are allowed. + */ + export interface ConferenceProperties { + /** + * The types of conference solutions that are supported for this calendar. The + * possible values are: + * + * - "eventHangout" + * - "eventNamedHangout" + * - "hangoutsMeet" Optional. + */ + allowedConferenceSolutionTypes?: Array; + } + + export interface DefaultReminder { + /** + * The method used by this reminder. Possible values are: + * + * - "email" - Reminders are sent via email. + * - "popup" - Reminders are sent via a UI popup. + * Required when adding a reminder. + */ + method?: string; + + /** + * Number of minutes before the start of the event when the reminder should + * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required + * when adding a reminder. + */ + minutes?: number; + } + + /** + * The notifications that the authenticated user is receiving for this calendar. + */ + export interface NotificationSettings { + /** + * The list of notifications set for this calendar. + */ + notifications?: Array; + } + + export namespace NotificationSettings { + export interface Notification { + /** + * The method used to deliver the notification. The possible value is: + * + * - "email" - Notifications are sent via email. + * Required when adding a notification. + */ + method?: string; + + /** + * The type of notification. Possible values are: + * + * - "eventCreation" - Notification sent when a new event is put on the calendar. + * - "eventChange" - Notification sent when an event is changed. + * - "eventCancellation" - Notification sent when an event is cancelled. + * - "eventResponse" - Notification sent when an attendee responds to the event + * invitation. + * - "agenda" - An agenda with the events of the day (sent out in the morning). + * Required when adding a notification. + */ + type?: string; + } + } } export interface CalendarListListResponse { - /** - * ETag of the collection. - */ - etag?: string; - - /** - * Calendars that are present on the user's calendar list. - */ - items?: Array; - - /** - * Type of the collection ("calendar#calendarList"). - */ - kind?: string; - - /** - * Token used to access the next page of this result. Omitted if no further results - * are available, in which case nextSyncToken is provided. - */ - nextPageToken?: string; - - /** - * Token used at a later point in time to retrieve only the entries that have - * changed since this result was returned. Omitted if further results are - * available, in which case nextPageToken is provided. - */ - nextSyncToken?: string; + /** + * ETag of the collection. + */ + etag?: string; + + /** + * Calendars that are present on the user's calendar list. + */ + items?: Array; + + /** + * Type of the collection ("calendar#calendarList"). + */ + kind?: string; + + /** + * Token used to access the next page of this result. Omitted if no further results + * are available, in which case nextSyncToken is provided. + */ + nextPageToken?: string; + + /** + * Token used at a later point in time to retrieve only the entries that have + * changed since this result was returned. Omitted if further results are + * available, in which case nextPageToken is provided. + */ + nextSyncToken?: string; } export interface CalendarListCreateParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Whether to use the foregroundColor and backgroundColor fields to - * write the calendar colors (RGB). If this feature is used, the index-based - * colorId field will be set to the best matching option automatically. Optional. - * The default is False. - */ - colorRgbFormat?: boolean; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: Identifier of the calendar. - */ - id?: string; - - /** - * Body param: The effective access role that the authenticated user has on the - * calendar. Read-only. Possible values are: - * - * - "freeBusyReader" - Provides read access to free/busy information. - * - "reader" - Provides read access to the calendar. Private events will appear to - * users with reader access, but event details will be hidden. - * - "writer" - Provides read and write access to the calendar. Private events will - * appear to users with writer access, and event details will be visible. - * - "owner" - Provides ownership of the calendar. This role has all of the - * permissions of the writer role with the additional ability to see and - * manipulate ACLs. - */ - accessRole?: string; - - /** - * Body param: The main color of the calendar in the hexadecimal format "#0088aa". - * This property supersedes the index-based colorId property. To set or change this - * property, you need to specify colorRgbFormat=true in the parameters of the - * insert, update and patch methods. Optional. - */ - backgroundColor?: string; - - /** - * Body param: The color of the calendar. This is an ID referring to an entry in - * the calendar section of the colors definition (see the colors endpoint). This - * property is superseded by the backgroundColor and foregroundColor properties and - * can be ignored when using these properties. Optional. - */ - colorId?: string; - - /** - * Body param: Conferencing properties for this calendar, for example what types of - * conferences are allowed. - */ - conferenceProperties?: CalendarListCreateParams.ConferenceProperties; - - /** - * Body param: The default reminders that the authenticated user has for this - * calendar. - */ - defaultReminders?: Array; - - /** - * Body param: Whether this calendar list entry has been deleted from the calendar - * list. Read-only. Optional. The default is False. - */ - deleted?: boolean; - - /** - * Body param: Description of the calendar. Optional. Read-only. - */ - description?: string; - - /** - * Body param: ETag of the resource. - */ - etag?: string; - - /** - * Body param: The foreground color of the calendar in the hexadecimal format - * "#ffffff". This property supersedes the index-based colorId property. To set or - * change this property, you need to specify colorRgbFormat=true in the parameters - * of the insert, update and patch methods. Optional. - */ - foregroundColor?: string; - - /** - * Body param: Whether the calendar has been hidden from the list. Optional. The - * attribute is only returned when the calendar is hidden, in which case the value - * is true. - */ - hidden?: boolean; - - /** - * Body param: Type of the resource ("calendar#calendarListEntry"). - */ - kind?: string; - - /** - * Body param: Geographic location of the calendar as free-form text. Optional. - * Read-only. - */ - location?: string; - - /** - * Body param: The notifications that the authenticated user is receiving for this - * calendar. - */ - notificationSettings?: CalendarListCreateParams.NotificationSettings; - - /** - * Body param: Whether the calendar is the primary calendar of the authenticated - * user. Read-only. Optional. The default is False. - */ - primary?: boolean; - - /** - * Body param: Whether the calendar content shows up in the calendar UI. Optional. - * The default is False. - */ - selected?: boolean; - - /** - * Body param: Title of the calendar. Read-only. - */ - summary?: string; - - /** - * Body param: The summary that the authenticated user has set for this calendar. - * Optional. - */ - summaryOverride?: string; - - /** - * Body param: The time zone of the calendar. Optional. Read-only. - */ - timeZone?: string; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Whether to use the foregroundColor and backgroundColor fields to + * write the calendar colors (RGB). If this feature is used, the index-based + * colorId field will be set to the best matching option automatically. Optional. + * The default is False. + */ + colorRgbFormat?: boolean; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: Identifier of the calendar. + */ + id?: string; + + /** + * Body param: The effective access role that the authenticated user has on the + * calendar. Read-only. Possible values are: + * + * - "freeBusyReader" - Provides read access to free/busy information. + * - "reader" - Provides read access to the calendar. Private events will appear to + * users with reader access, but event details will be hidden. + * - "writer" - Provides read and write access to the calendar. Private events will + * appear to users with writer access, and event details will be visible. + * - "owner" - Provides ownership of the calendar. This role has all of the + * permissions of the writer role with the additional ability to see and + * manipulate ACLs. + */ + accessRole?: string; + + /** + * Body param: The main color of the calendar in the hexadecimal format "#0088aa". + * This property supersedes the index-based colorId property. To set or change this + * property, you need to specify colorRgbFormat=true in the parameters of the + * insert, update and patch methods. Optional. + */ + backgroundColor?: string; + + /** + * Body param: The color of the calendar. This is an ID referring to an entry in + * the calendar section of the colors definition (see the colors endpoint). This + * property is superseded by the backgroundColor and foregroundColor properties and + * can be ignored when using these properties. Optional. + */ + colorId?: string; + + /** + * Body param: Conferencing properties for this calendar, for example what types of + * conferences are allowed. + */ + conferenceProperties?: CalendarListCreateParams.ConferenceProperties; + + /** + * Body param: The default reminders that the authenticated user has for this + * calendar. + */ + defaultReminders?: Array; + + /** + * Body param: Whether this calendar list entry has been deleted from the calendar + * list. Read-only. Optional. The default is False. + */ + deleted?: boolean; + + /** + * Body param: Description of the calendar. Optional. Read-only. + */ + description?: string; + + /** + * Body param: ETag of the resource. + */ + etag?: string; + + /** + * Body param: The foreground color of the calendar in the hexadecimal format + * "#ffffff". This property supersedes the index-based colorId property. To set or + * change this property, you need to specify colorRgbFormat=true in the parameters + * of the insert, update and patch methods. Optional. + */ + foregroundColor?: string; + + /** + * Body param: Whether the calendar has been hidden from the list. Optional. The + * attribute is only returned when the calendar is hidden, in which case the value + * is true. + */ + hidden?: boolean; + + /** + * Body param: Type of the resource ("calendar#calendarListEntry"). + */ + kind?: string; + + /** + * Body param: Geographic location of the calendar as free-form text. Optional. + * Read-only. + */ + location?: string; + + /** + * Body param: The notifications that the authenticated user is receiving for this + * calendar. + */ + notificationSettings?: CalendarListCreateParams.NotificationSettings; + + /** + * Body param: Whether the calendar is the primary calendar of the authenticated + * user. Read-only. Optional. The default is False. + */ + primary?: boolean; + + /** + * Body param: Whether the calendar content shows up in the calendar UI. Optional. + * The default is False. + */ + selected?: boolean; + + /** + * Body param: Title of the calendar. Read-only. + */ + summary?: string; + + /** + * Body param: The summary that the authenticated user has set for this calendar. + * Optional. + */ + summaryOverride?: string; + + /** + * Body param: The time zone of the calendar. Optional. Read-only. + */ + timeZone?: string; } export namespace CalendarListCreateParams { - /** - * Conferencing properties for this calendar, for example what types of conferences - * are allowed. - */ - export interface ConferenceProperties { - /** - * The types of conference solutions that are supported for this calendar. The - * possible values are: - * - * - "eventHangout" - * - "eventNamedHangout" - * - "hangoutsMeet" Optional. - */ - allowedConferenceSolutionTypes?: Array; - } - - export interface DefaultReminder { - /** - * The method used by this reminder. Possible values are: - * - * - "email" - Reminders are sent via email. - * - "popup" - Reminders are sent via a UI popup. - * Required when adding a reminder. - */ - method?: string; - - /** - * Number of minutes before the start of the event when the reminder should - * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required - * when adding a reminder. - */ - minutes?: number; - } - - /** - * The notifications that the authenticated user is receiving for this calendar. - */ - export interface NotificationSettings { - /** - * The list of notifications set for this calendar. - */ - notifications?: Array; - } - - export namespace NotificationSettings { - export interface Notification { - /** - * The method used to deliver the notification. The possible value is: - * - * - "email" - Notifications are sent via email. - * Required when adding a notification. - */ - method?: string; - - /** - * The type of notification. Possible values are: - * - * - "eventCreation" - Notification sent when a new event is put on the calendar. - * - "eventChange" - Notification sent when an event is changed. - * - "eventCancellation" - Notification sent when an event is cancelled. - * - "eventResponse" - Notification sent when an attendee responds to the event - * invitation. - * - "agenda" - An agenda with the events of the day (sent out in the morning). - * Required when adding a notification. - */ - type?: string; - } - } + /** + * Conferencing properties for this calendar, for example what types of conferences + * are allowed. + */ + export interface ConferenceProperties { + /** + * The types of conference solutions that are supported for this calendar. The + * possible values are: + * + * - "eventHangout" + * - "eventNamedHangout" + * - "hangoutsMeet" Optional. + */ + allowedConferenceSolutionTypes?: Array; + } + + export interface DefaultReminder { + /** + * The method used by this reminder. Possible values are: + * + * - "email" - Reminders are sent via email. + * - "popup" - Reminders are sent via a UI popup. + * Required when adding a reminder. + */ + method?: string; + + /** + * Number of minutes before the start of the event when the reminder should + * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required + * when adding a reminder. + */ + minutes?: number; + } + + /** + * The notifications that the authenticated user is receiving for this calendar. + */ + export interface NotificationSettings { + /** + * The list of notifications set for this calendar. + */ + notifications?: Array; + } + + export namespace NotificationSettings { + export interface Notification { + /** + * The method used to deliver the notification. The possible value is: + * + * - "email" - Notifications are sent via email. + * Required when adding a notification. + */ + method?: string; + + /** + * The type of notification. Possible values are: + * + * - "eventCreation" - Notification sent when a new event is put on the calendar. + * - "eventChange" - Notification sent when an event is changed. + * - "eventCancellation" - Notification sent when an event is cancelled. + * - "eventResponse" - Notification sent when an attendee responds to the event + * invitation. + * - "agenda" - An agenda with the events of the day (sent out in the morning). + * Required when adding a notification. + */ + type?: string; + } + } } export interface CalendarListRetrieveParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface CalendarListUpdateParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Whether to use the foregroundColor and backgroundColor fields to - * write the calendar colors (RGB). If this feature is used, the index-based - * colorId field will be set to the best matching option automatically. Optional. - * The default is False. - */ - colorRgbFormat?: boolean; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: Identifier of the calendar. - */ - id?: string; - - /** - * Body param: The effective access role that the authenticated user has on the - * calendar. Read-only. Possible values are: - * - * - "freeBusyReader" - Provides read access to free/busy information. - * - "reader" - Provides read access to the calendar. Private events will appear to - * users with reader access, but event details will be hidden. - * - "writer" - Provides read and write access to the calendar. Private events will - * appear to users with writer access, and event details will be visible. - * - "owner" - Provides ownership of the calendar. This role has all of the - * permissions of the writer role with the additional ability to see and - * manipulate ACLs. - */ - accessRole?: string; - - /** - * Body param: The main color of the calendar in the hexadecimal format "#0088aa". - * This property supersedes the index-based colorId property. To set or change this - * property, you need to specify colorRgbFormat=true in the parameters of the - * insert, update and patch methods. Optional. - */ - backgroundColor?: string; - - /** - * Body param: The color of the calendar. This is an ID referring to an entry in - * the calendar section of the colors definition (see the colors endpoint). This - * property is superseded by the backgroundColor and foregroundColor properties and - * can be ignored when using these properties. Optional. - */ - colorId?: string; - - /** - * Body param: Conferencing properties for this calendar, for example what types of - * conferences are allowed. - */ - conferenceProperties?: CalendarListUpdateParams.ConferenceProperties; - - /** - * Body param: The default reminders that the authenticated user has for this - * calendar. - */ - defaultReminders?: Array; - - /** - * Body param: Whether this calendar list entry has been deleted from the calendar - * list. Read-only. Optional. The default is False. - */ - deleted?: boolean; - - /** - * Body param: Description of the calendar. Optional. Read-only. - */ - description?: string; - - /** - * Body param: ETag of the resource. - */ - etag?: string; - - /** - * Body param: The foreground color of the calendar in the hexadecimal format - * "#ffffff". This property supersedes the index-based colorId property. To set or - * change this property, you need to specify colorRgbFormat=true in the parameters - * of the insert, update and patch methods. Optional. - */ - foregroundColor?: string; - - /** - * Body param: Whether the calendar has been hidden from the list. Optional. The - * attribute is only returned when the calendar is hidden, in which case the value - * is true. - */ - hidden?: boolean; - - /** - * Body param: Type of the resource ("calendar#calendarListEntry"). - */ - kind?: string; - - /** - * Body param: Geographic location of the calendar as free-form text. Optional. - * Read-only. - */ - location?: string; - - /** - * Body param: The notifications that the authenticated user is receiving for this - * calendar. - */ - notificationSettings?: CalendarListUpdateParams.NotificationSettings; - - /** - * Body param: Whether the calendar is the primary calendar of the authenticated - * user. Read-only. Optional. The default is False. - */ - primary?: boolean; - - /** - * Body param: Whether the calendar content shows up in the calendar UI. Optional. - * The default is False. - */ - selected?: boolean; - - /** - * Body param: Title of the calendar. Read-only. - */ - summary?: string; - - /** - * Body param: The summary that the authenticated user has set for this calendar. - * Optional. - */ - summaryOverride?: string; - - /** - * Body param: The time zone of the calendar. Optional. Read-only. - */ - timeZone?: string; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Whether to use the foregroundColor and backgroundColor fields to + * write the calendar colors (RGB). If this feature is used, the index-based + * colorId field will be set to the best matching option automatically. Optional. + * The default is False. + */ + colorRgbFormat?: boolean; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: Identifier of the calendar. + */ + id?: string; + + /** + * Body param: The effective access role that the authenticated user has on the + * calendar. Read-only. Possible values are: + * + * - "freeBusyReader" - Provides read access to free/busy information. + * - "reader" - Provides read access to the calendar. Private events will appear to + * users with reader access, but event details will be hidden. + * - "writer" - Provides read and write access to the calendar. Private events will + * appear to users with writer access, and event details will be visible. + * - "owner" - Provides ownership of the calendar. This role has all of the + * permissions of the writer role with the additional ability to see and + * manipulate ACLs. + */ + accessRole?: string; + + /** + * Body param: The main color of the calendar in the hexadecimal format "#0088aa". + * This property supersedes the index-based colorId property. To set or change this + * property, you need to specify colorRgbFormat=true in the parameters of the + * insert, update and patch methods. Optional. + */ + backgroundColor?: string; + + /** + * Body param: The color of the calendar. This is an ID referring to an entry in + * the calendar section of the colors definition (see the colors endpoint). This + * property is superseded by the backgroundColor and foregroundColor properties and + * can be ignored when using these properties. Optional. + */ + colorId?: string; + + /** + * Body param: Conferencing properties for this calendar, for example what types of + * conferences are allowed. + */ + conferenceProperties?: CalendarListUpdateParams.ConferenceProperties; + + /** + * Body param: The default reminders that the authenticated user has for this + * calendar. + */ + defaultReminders?: Array; + + /** + * Body param: Whether this calendar list entry has been deleted from the calendar + * list. Read-only. Optional. The default is False. + */ + deleted?: boolean; + + /** + * Body param: Description of the calendar. Optional. Read-only. + */ + description?: string; + + /** + * Body param: ETag of the resource. + */ + etag?: string; + + /** + * Body param: The foreground color of the calendar in the hexadecimal format + * "#ffffff". This property supersedes the index-based colorId property. To set or + * change this property, you need to specify colorRgbFormat=true in the parameters + * of the insert, update and patch methods. Optional. + */ + foregroundColor?: string; + + /** + * Body param: Whether the calendar has been hidden from the list. Optional. The + * attribute is only returned when the calendar is hidden, in which case the value + * is true. + */ + hidden?: boolean; + + /** + * Body param: Type of the resource ("calendar#calendarListEntry"). + */ + kind?: string; + + /** + * Body param: Geographic location of the calendar as free-form text. Optional. + * Read-only. + */ + location?: string; + + /** + * Body param: The notifications that the authenticated user is receiving for this + * calendar. + */ + notificationSettings?: CalendarListUpdateParams.NotificationSettings; + + /** + * Body param: Whether the calendar is the primary calendar of the authenticated + * user. Read-only. Optional. The default is False. + */ + primary?: boolean; + + /** + * Body param: Whether the calendar content shows up in the calendar UI. Optional. + * The default is False. + */ + selected?: boolean; + + /** + * Body param: Title of the calendar. Read-only. + */ + summary?: string; + + /** + * Body param: The summary that the authenticated user has set for this calendar. + * Optional. + */ + summaryOverride?: string; + + /** + * Body param: The time zone of the calendar. Optional. Read-only. + */ + timeZone?: string; } export namespace CalendarListUpdateParams { - /** - * Conferencing properties for this calendar, for example what types of conferences - * are allowed. - */ - export interface ConferenceProperties { - /** - * The types of conference solutions that are supported for this calendar. The - * possible values are: - * - * - "eventHangout" - * - "eventNamedHangout" - * - "hangoutsMeet" Optional. - */ - allowedConferenceSolutionTypes?: Array; - } - - export interface DefaultReminder { - /** - * The method used by this reminder. Possible values are: - * - * - "email" - Reminders are sent via email. - * - "popup" - Reminders are sent via a UI popup. - * Required when adding a reminder. - */ - method?: string; - - /** - * Number of minutes before the start of the event when the reminder should - * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required - * when adding a reminder. - */ - minutes?: number; - } - - /** - * The notifications that the authenticated user is receiving for this calendar. - */ - export interface NotificationSettings { - /** - * The list of notifications set for this calendar. - */ - notifications?: Array; - } - - export namespace NotificationSettings { - export interface Notification { - /** - * The method used to deliver the notification. The possible value is: - * - * - "email" - Notifications are sent via email. - * Required when adding a notification. - */ - method?: string; - - /** - * The type of notification. Possible values are: - * - * - "eventCreation" - Notification sent when a new event is put on the calendar. - * - "eventChange" - Notification sent when an event is changed. - * - "eventCancellation" - Notification sent when an event is cancelled. - * - "eventResponse" - Notification sent when an attendee responds to the event - * invitation. - * - "agenda" - An agenda with the events of the day (sent out in the morning). - * Required when adding a notification. - */ - type?: string; - } - } + /** + * Conferencing properties for this calendar, for example what types of conferences + * are allowed. + */ + export interface ConferenceProperties { + /** + * The types of conference solutions that are supported for this calendar. The + * possible values are: + * + * - "eventHangout" + * - "eventNamedHangout" + * - "hangoutsMeet" Optional. + */ + allowedConferenceSolutionTypes?: Array; + } + + export interface DefaultReminder { + /** + * The method used by this reminder. Possible values are: + * + * - "email" - Reminders are sent via email. + * - "popup" - Reminders are sent via a UI popup. + * Required when adding a reminder. + */ + method?: string; + + /** + * Number of minutes before the start of the event when the reminder should + * trigger. Valid values are between 0 and 40320 (4 weeks in minutes). Required + * when adding a reminder. + */ + minutes?: number; + } + + /** + * The notifications that the authenticated user is receiving for this calendar. + */ + export interface NotificationSettings { + /** + * The list of notifications set for this calendar. + */ + notifications?: Array; + } + + export namespace NotificationSettings { + export interface Notification { + /** + * The method used to deliver the notification. The possible value is: + * + * - "email" - Notifications are sent via email. + * Required when adding a notification. + */ + method?: string; + + /** + * The type of notification. Possible values are: + * + * - "eventCreation" - Notification sent when a new event is put on the calendar. + * - "eventChange" - Notification sent when an event is changed. + * - "eventCancellation" - Notification sent when an event is cancelled. + * - "eventResponse" - Notification sent when an attendee responds to the event + * invitation. + * - "agenda" - An agenda with the events of the day (sent out in the morning). + * Required when adding a notification. + */ + type?: string; + } + } } export interface CalendarListListParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Maximum number of entries returned on one result page. By default the value is - * 100 entries. The page size can never be larger than 250 entries. Optional. - */ - maxResults?: number; - - /** - * The minimum access role for the user in the returned entries. Optional. The - * default is no restriction. - */ - minAccessRole?: "freeBusyReader" | "owner" | "reader" | "writer"; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Token specifying which result page to return. Optional. - */ - pageToken?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Whether to include deleted calendar list entries in the result. Optional. The - * default is False. - */ - showDeleted?: boolean; - - /** - * Whether to show hidden entries. Optional. The default is False. - */ - showHidden?: boolean; - - /** - * Token obtained from the nextSyncToken field returned on the last page of results - * from the previous list request. It makes the result of this list request contain - * only entries that have changed since then. If only read-only fields such as - * calendar properties or ACLs have changed, the entry won't be returned. All - * entries deleted and hidden since the previous list request will always be in the - * result set and it is not allowed to set showDeleted neither showHidden to False. - * To ensure client state consistency minAccessRole query parameter cannot be - * specified together with nextSyncToken. If the syncToken expires, the server will - * respond with a 410 GONE response code and the client should clear its storage - * and perform a full synchronization without any syncToken. Learn more about - * incremental synchronization. Optional. The default is to return all entries. - */ - syncToken?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Maximum number of entries returned on one result page. By default the value is + * 100 entries. The page size can never be larger than 250 entries. Optional. + */ + maxResults?: number; + + /** + * The minimum access role for the user in the returned entries. Optional. The + * default is no restriction. + */ + minAccessRole?: "freeBusyReader" | "owner" | "reader" | "writer"; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Token specifying which result page to return. Optional. + */ + pageToken?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Whether to include deleted calendar list entries in the result. Optional. The + * default is False. + */ + showDeleted?: boolean; + + /** + * Whether to show hidden entries. Optional. The default is False. + */ + showHidden?: boolean; + + /** + * Token obtained from the nextSyncToken field returned on the last page of results + * from the previous list request. It makes the result of this list request contain + * only entries that have changed since then. If only read-only fields such as + * calendar properties or ACLs have changed, the entry won't be returned. All + * entries deleted and hidden since the previous list request will always be in the + * result set and it is not allowed to set showDeleted neither showHidden to False. + * To ensure client state consistency minAccessRole query parameter cannot be + * specified together with nextSyncToken. If the syncToken expires, the server will + * respond with a 410 GONE response code and the client should clear its storage + * and perform a full synchronization without any syncToken. Learn more about + * incremental synchronization. Optional. The default is to return all entries. + */ + syncToken?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface CalendarListDeleteParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface CalendarListWatchParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: Maximum number of entries returned on one result page. By default - * the value is 100 entries. The page size can never be larger than 250 entries. - * Optional. - */ - maxResults?: number; - - /** - * Query param: The minimum access role for the user in the returned entries. - * Optional. The default is no restriction. - */ - minAccessRole?: "freeBusyReader" | "owner" | "reader" | "writer"; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Token specifying which result page to return. Optional. - */ - pageToken?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Whether to include deleted calendar list entries in the result. - * Optional. The default is False. - */ - showDeleted?: boolean; - - /** - * Query param: Whether to show hidden entries. Optional. The default is False. - */ - showHidden?: boolean; - - /** - * Query param: Token obtained from the nextSyncToken field returned on the last - * page of results from the previous list request. It makes the result of this list - * request contain only entries that have changed since then. If only read-only - * fields such as calendar properties or ACLs have changed, the entry won't be - * returned. All entries deleted and hidden since the previous list request will - * always be in the result set and it is not allowed to set showDeleted neither - * showHidden to False. To ensure client state consistency minAccessRole query - * parameter cannot be specified together with nextSyncToken. If the syncToken - * expires, the server will respond with a 410 GONE response code and the client - * should clear its storage and perform a full synchronization without any - * syncToken. Learn more about incremental synchronization. Optional. The default - * is to return all entries. - */ - syncToken?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: A UUID or similar unique string that identifies this channel. - */ - id?: string; - - /** - * Body param: An arbitrary string delivered to the target address with each - * notification delivered over this channel. Optional. - */ - token?: string; - - /** - * Body param: The address where notifications are delivered for this channel. - */ - address?: string; - - /** - * Body param: Date and time of notification channel expiration, expressed as a - * Unix timestamp, in milliseconds. Optional. - */ - expiration?: string; - - /** - * Body param: Identifies this as a notification channel used to watch for changes - * to a resource, which is "api#channel". - */ - kind?: string; - - /** - * Body param: Additional parameters controlling delivery channel behavior. - * Optional. - */ - params?: Record; - - /** - * Body param: A Boolean value to indicate whether payload is wanted. Optional. - */ - payload?: boolean; - - /** - * Body param: An opaque ID that identifies the resource being watched on this - * channel. Stable across different API versions. - */ - resourceId?: string; - - /** - * Body param: A version-specific identifier for the watched resource. - */ - resourceUri?: string; - - /** - * Body param: The type of delivery mechanism used for this channel. Valid values - * are "web_hook" (or "webhook"). Both values refer to a channel where Http - * requests are used to deliver messages. - */ - type?: string; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: Maximum number of entries returned on one result page. By default + * the value is 100 entries. The page size can never be larger than 250 entries. + * Optional. + */ + maxResults?: number; + + /** + * Query param: The minimum access role for the user in the returned entries. + * Optional. The default is no restriction. + */ + minAccessRole?: "freeBusyReader" | "owner" | "reader" | "writer"; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Token specifying which result page to return. Optional. + */ + pageToken?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Whether to include deleted calendar list entries in the result. + * Optional. The default is False. + */ + showDeleted?: boolean; + + /** + * Query param: Whether to show hidden entries. Optional. The default is False. + */ + showHidden?: boolean; + + /** + * Query param: Token obtained from the nextSyncToken field returned on the last + * page of results from the previous list request. It makes the result of this list + * request contain only entries that have changed since then. If only read-only + * fields such as calendar properties or ACLs have changed, the entry won't be + * returned. All entries deleted and hidden since the previous list request will + * always be in the result set and it is not allowed to set showDeleted neither + * showHidden to False. To ensure client state consistency minAccessRole query + * parameter cannot be specified together with nextSyncToken. If the syncToken + * expires, the server will respond with a 410 GONE response code and the client + * should clear its storage and perform a full synchronization without any + * syncToken. Learn more about incremental synchronization. Optional. The default + * is to return all entries. + */ + syncToken?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: A UUID or similar unique string that identifies this channel. + */ + id?: string; + + /** + * Body param: An arbitrary string delivered to the target address with each + * notification delivered over this channel. Optional. + */ + token?: string; + + /** + * Body param: The address where notifications are delivered for this channel. + */ + address?: string; + + /** + * Body param: Date and time of notification channel expiration, expressed as a + * Unix timestamp, in milliseconds. Optional. + */ + expiration?: string; + + /** + * Body param: Identifies this as a notification channel used to watch for changes + * to a resource, which is "api#channel". + */ + kind?: string; + + /** + * Body param: Additional parameters controlling delivery channel behavior. + * Optional. + */ + params?: Record; + + /** + * Body param: A Boolean value to indicate whether payload is wanted. Optional. + */ + payload?: boolean; + + /** + * Body param: An opaque ID that identifies the resource being watched on this + * channel. Stable across different API versions. + */ + resourceId?: string; + + /** + * Body param: A version-specific identifier for the watched resource. + */ + resourceUri?: string; + + /** + * Body param: The type of delivery mechanism used for this channel. Valid values + * are "web_hook" (or "webhook"). Both values refer to a channel where Http + * requests are used to deliver messages. + */ + type?: string; } export declare namespace CalendarList { - export { - type CalendarListEntry as CalendarListEntry, - type CalendarListListResponse as CalendarListListResponse, - type CalendarListCreateParams as CalendarListCreateParams, - type CalendarListRetrieveParams as CalendarListRetrieveParams, - type CalendarListUpdateParams as CalendarListUpdateParams, - type CalendarListListParams as CalendarListListParams, - type CalendarListDeleteParams as CalendarListDeleteParams, - type CalendarListWatchParams as CalendarListWatchParams, - }; + export { + type CalendarListEntry, + type CalendarListListResponse, + CalendarListCreateParams, + type CalendarListRetrieveParams, + type CalendarListUpdateParams, + type CalendarListListParams, + type CalendarListDeleteParams, + type CalendarListWatchParams, + }; } diff --git a/packages/google-calendar/src/resources/users/me/index.ts b/packages/google-calendar/src/resources/users/me/index.ts index bb782ada..4c473a96 100644 --- a/packages/google-calendar/src/resources/users/me/index.ts +++ b/packages/google-calendar/src/resources/users/me/index.ts @@ -1,22 +1,22 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. export { - CalendarList, - type CalendarListEntry, - type CalendarListListResponse, - type CalendarListCreateParams, - type CalendarListRetrieveParams, - type CalendarListUpdateParams, - type CalendarListListParams, - type CalendarListDeleteParams, - type CalendarListWatchParams, + CalendarList, + type CalendarListEntry, + type CalendarListListResponse, + type CalendarListCreateParams, + type CalendarListRetrieveParams, + type CalendarListUpdateParams, + type CalendarListListParams, + type CalendarListDeleteParams, + type CalendarListWatchParams, } from "./calendar-list"; export { Me } from "./me"; export { - Settings, - type SettingRetrieveResponse, - type SettingRetrieveSettingResponse, - type SettingRetrieveParams, - type SettingRetrieveSettingParams, - type SettingWatchParams, + Settings, + type SettingRetrieveResponse, + type SettingRetrieveSettingResponse, + type SettingRetrieveParams, + type SettingRetrieveSettingParams, + type SettingWatchParams, } from "./settings"; diff --git a/packages/google-calendar/src/resources/users/me/me.ts b/packages/google-calendar/src/resources/users/me/me.ts index 64963cba..24b1c7f1 100644 --- a/packages/google-calendar/src/resources/users/me/me.ts +++ b/packages/google-calendar/src/resources/users/me/me.ts @@ -3,55 +3,53 @@ import { APIResource } from "../../../core/resource"; import * as CalendarListAPI from "./calendar-list"; import { - CalendarList, - CalendarListCreateParams, - CalendarListDeleteParams, - CalendarListEntry, - CalendarListListParams, - CalendarListListResponse, - CalendarListRetrieveParams, - CalendarListUpdateParams, - CalendarListWatchParams, + CalendarList, + CalendarListCreateParams, + CalendarListDeleteParams, + CalendarListEntry, + CalendarListListParams, + CalendarListListResponse, + CalendarListRetrieveParams, + CalendarListUpdateParams, + CalendarListWatchParams, } from "./calendar-list"; import * as SettingsAPI from "./settings"; import { - SettingRetrieveParams, - SettingRetrieveResponse, - SettingRetrieveSettingParams, - SettingRetrieveSettingResponse, - SettingWatchParams, - Settings, + SettingRetrieveParams, + SettingRetrieveResponse, + SettingRetrieveSettingParams, + SettingRetrieveSettingResponse, + SettingWatchParams, + Settings, } from "./settings"; export class Me extends APIResource { - calendarList: CalendarListAPI.CalendarList = new CalendarListAPI.CalendarList( - this._client, - ); - settings: SettingsAPI.Settings = new SettingsAPI.Settings(this._client); + calendarList: CalendarListAPI.CalendarList = new CalendarListAPI.CalendarList(this._client); + settings: SettingsAPI.Settings = new SettingsAPI.Settings(this._client); } Me.CalendarList = CalendarList; Me.Settings = Settings; export declare namespace Me { - export { - CalendarList as CalendarList, - type CalendarListEntry as CalendarListEntry, - type CalendarListListResponse as CalendarListListResponse, - type CalendarListCreateParams as CalendarListCreateParams, - type CalendarListRetrieveParams as CalendarListRetrieveParams, - type CalendarListUpdateParams as CalendarListUpdateParams, - type CalendarListListParams as CalendarListListParams, - type CalendarListDeleteParams as CalendarListDeleteParams, - type CalendarListWatchParams as CalendarListWatchParams, - }; + export { + CalendarList, + CalendarListEntry, + CalendarListListResponse, + CalendarListCreateParams, + CalendarListRetrieveParams, + CalendarListUpdateParams, + CalendarListListParams, + CalendarListDeleteParams, + CalendarListWatchParams, + }; - export { - Settings as Settings, - type SettingRetrieveResponse as SettingRetrieveResponse, - type SettingRetrieveSettingResponse as SettingRetrieveSettingResponse, - type SettingRetrieveParams as SettingRetrieveParams, - type SettingRetrieveSettingParams as SettingRetrieveSettingParams, - type SettingWatchParams as SettingWatchParams, - }; + export { + Settings, + SettingRetrieveResponse, + SettingRetrieveSettingResponse, + SettingRetrieveParams, + SettingRetrieveSettingParams, + SettingWatchParams, + }; } diff --git a/packages/google-calendar/src/resources/users/me/settings.ts b/packages/google-calendar/src/resources/users/me/settings.ts index 3193b16e..ed46274a 100644 --- a/packages/google-calendar/src/resources/users/me/settings.ts +++ b/packages/google-calendar/src/resources/users/me/settings.ts @@ -1,378 +1,378 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { APIResource } from "../../../core/resource"; -import * as Shared from "../../shared"; -import { APIPromise } from "../../../core/api-promise"; -import { RequestOptions } from "../../../internal/request-options"; +import type * as Shared from "../../shared"; +import type { APIPromise } from "../../../core/api-promise"; +import type { RequestOptions } from "../../../internal/request-options"; import { path } from "../../../internal/utils/path"; export class Settings extends APIResource { - /** - * Returns all user settings for the authenticated user. - */ - retrieve( - query: SettingRetrieveParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - return this._client.get("/users/me/settings", { query, ...options }); - } - - /** - * Returns a single user setting. - */ - retrieveSetting( - setting: string, - query: SettingRetrieveSettingParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - return this._client.get(path`/users/me/settings/${setting}`, { - query, - ...options, - }); - } - - /** - * Watch for changes to Settings resources. - */ - watch( - params: SettingWatchParams | null | undefined = {}, - options?: RequestOptions, - ): APIPromise { - const { - alt, - fields, - key, - maxResults, - oauth_token, - pageToken, - prettyPrint, - quotaUser, - syncToken, - userIp, - ...body - } = params ?? {}; - return this._client.post("/users/me/settings/watch", { - query: { - alt, - fields, - key, - maxResults, - oauth_token, - pageToken, - prettyPrint, - quotaUser, - syncToken, - userIp, - }, - body, - ...options, - }); - } + /** + * Returns all user settings for the authenticated user. + */ + retrieve( + query: SettingRetrieveParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + return this._client.get("/users/me/settings", { query, ...options }); + } + + /** + * Returns a single user setting. + */ + retrieveSetting( + setting: string, + query: SettingRetrieveSettingParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + return this._client.get(path`/users/me/settings/${setting}`, { + query, + ...options, + }); + } + + /** + * Watch for changes to Settings resources. + */ + watch( + params: SettingWatchParams | null | undefined = {}, + options?: RequestOptions, + ): APIPromise { + const { + alt, + fields, + key, + maxResults, + oauth_token, + pageToken, + prettyPrint, + quotaUser, + syncToken, + userIp, + ...body + } = params ?? {}; + return this._client.post("/users/me/settings/watch", { + query: { + alt, + fields, + key, + maxResults, + oauth_token, + pageToken, + prettyPrint, + quotaUser, + syncToken, + userIp, + }, + body, + ...options, + }); + } } export interface SettingRetrieveResponse { - /** - * Etag of the collection. - */ - etag?: string; - - /** - * List of user settings. - */ - items?: Array; - - /** - * Type of the collection ("calendar#settings"). - */ - kind?: string; - - /** - * Token used to access the next page of this result. Omitted if no further results - * are available, in which case nextSyncToken is provided. - */ - nextPageToken?: string; - - /** - * Token used at a later point in time to retrieve only the entries that have - * changed since this result was returned. Omitted if further results are - * available, in which case nextPageToken is provided. - */ - nextSyncToken?: string; + /** + * Etag of the collection. + */ + etag?: string; + + /** + * List of user settings. + */ + items?: Array; + + /** + * Type of the collection ("calendar#settings"). + */ + kind?: string; + + /** + * Token used to access the next page of this result. Omitted if no further results + * are available, in which case nextSyncToken is provided. + */ + nextPageToken?: string; + + /** + * Token used at a later point in time to retrieve only the entries that have + * changed since this result was returned. Omitted if further results are + * available, in which case nextPageToken is provided. + */ + nextSyncToken?: string; } export namespace SettingRetrieveResponse { - export interface Item { - /** - * The id of the user setting. - */ - id?: string; - - /** - * ETag of the resource. - */ - etag?: string; - - /** - * Type of the resource ("calendar#setting"). - */ - kind?: string; - - /** - * Value of the user setting. The format of the value depends on the ID of the - * setting. It must always be a UTF-8 string of length up to 1024 characters. - */ - value?: string; - } + export interface Item { + /** + * The id of the user setting. + */ + id?: string; + + /** + * ETag of the resource. + */ + etag?: string; + + /** + * Type of the resource ("calendar#setting"). + */ + kind?: string; + + /** + * Value of the user setting. The format of the value depends on the ID of the + * setting. It must always be a UTF-8 string of length up to 1024 characters. + */ + value?: string; + } } export interface SettingRetrieveSettingResponse { - /** - * The id of the user setting. - */ - id?: string; - - /** - * ETag of the resource. - */ - etag?: string; - - /** - * Type of the resource ("calendar#setting"). - */ - kind?: string; - - /** - * Value of the user setting. The format of the value depends on the ID of the - * setting. It must always be a UTF-8 string of length up to 1024 characters. - */ - value?: string; + /** + * The id of the user setting. + */ + id?: string; + + /** + * ETag of the resource. + */ + etag?: string; + + /** + * Type of the resource ("calendar#setting"). + */ + kind?: string; + + /** + * Value of the user setting. The format of the value depends on the ID of the + * setting. It must always be a UTF-8 string of length up to 1024 characters. + */ + value?: string; } export interface SettingRetrieveParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Maximum number of entries returned on one result page. By default the value is - * 100 entries. The page size can never be larger than 250 entries. Optional. - */ - maxResults?: number; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Token specifying which result page to return. Optional. - */ - pageToken?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Token obtained from the nextSyncToken field returned on the last page of results - * from the previous list request. It makes the result of this list request contain - * only entries that have changed since then. If the syncToken expires, the server - * will respond with a 410 GONE response code and the client should clear its - * storage and perform a full synchronization without any syncToken. Learn more - * about incremental synchronization. Optional. The default is to return all - * entries. - */ - syncToken?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Maximum number of entries returned on one result page. By default the value is + * 100 entries. The page size can never be larger than 250 entries. Optional. + */ + maxResults?: number; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Token specifying which result page to return. Optional. + */ + pageToken?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Token obtained from the nextSyncToken field returned on the last page of results + * from the previous list request. It makes the result of this list request contain + * only entries that have changed since then. If the syncToken expires, the server + * will respond with a 410 GONE response code and the client should clear its + * storage and perform a full synchronization without any syncToken. Learn more + * about incremental synchronization. Optional. The default is to return all + * entries. + */ + syncToken?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface SettingRetrieveSettingParams { - /** - * Data format for the response. - */ - alt?: "json"; - - /** - * Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * API key. Your API key identifies your project and provides you with API access, - * quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * An opaque string that represents a user for quota purposes. Must not exceed 40 - * characters. - */ - quotaUser?: string; - - /** - * Deprecated. Please use quotaUser instead. - */ - userIp?: string; + /** + * Data format for the response. + */ + alt?: "json"; + + /** + * Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * API key. Your API key identifies your project and provides you with API access, + * quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * An opaque string that represents a user for quota purposes. Must not exceed 40 + * characters. + */ + quotaUser?: string; + + /** + * Deprecated. Please use quotaUser instead. + */ + userIp?: string; } export interface SettingWatchParams { - /** - * Query param: Data format for the response. - */ - alt?: "json"; - - /** - * Query param: Selector specifying which fields to include in a partial response. - */ - fields?: string; - - /** - * Query param: API key. Your API key identifies your project and provides you with - * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. - */ - key?: string; - - /** - * Query param: Maximum number of entries returned on one result page. By default - * the value is 100 entries. The page size can never be larger than 250 entries. - * Optional. - */ - maxResults?: number; - - /** - * Query param: OAuth 2.0 token for the current user. - */ - oauth_token?: string; - - /** - * Query param: Token specifying which result page to return. Optional. - */ - pageToken?: string; - - /** - * Query param: Returns response with indentations and line breaks. - */ - prettyPrint?: boolean; - - /** - * Query param: An opaque string that represents a user for quota purposes. Must - * not exceed 40 characters. - */ - quotaUser?: string; - - /** - * Query param: Token obtained from the nextSyncToken field returned on the last - * page of results from the previous list request. It makes the result of this list - * request contain only entries that have changed since then. If the syncToken - * expires, the server will respond with a 410 GONE response code and the client - * should clear its storage and perform a full synchronization without any - * syncToken. Learn more about incremental synchronization. Optional. The default - * is to return all entries. - */ - syncToken?: string; - - /** - * Query param: Deprecated. Please use quotaUser instead. - */ - userIp?: string; - - /** - * Body param: A UUID or similar unique string that identifies this channel. - */ - id?: string; - - /** - * Body param: An arbitrary string delivered to the target address with each - * notification delivered over this channel. Optional. - */ - token?: string; - - /** - * Body param: The address where notifications are delivered for this channel. - */ - address?: string; - - /** - * Body param: Date and time of notification channel expiration, expressed as a - * Unix timestamp, in milliseconds. Optional. - */ - expiration?: string; - - /** - * Body param: Identifies this as a notification channel used to watch for changes - * to a resource, which is "api#channel". - */ - kind?: string; - - /** - * Body param: Additional parameters controlling delivery channel behavior. - * Optional. - */ - params?: Record; - - /** - * Body param: A Boolean value to indicate whether payload is wanted. Optional. - */ - payload?: boolean; - - /** - * Body param: An opaque ID that identifies the resource being watched on this - * channel. Stable across different API versions. - */ - resourceId?: string; - - /** - * Body param: A version-specific identifier for the watched resource. - */ - resourceUri?: string; - - /** - * Body param: The type of delivery mechanism used for this channel. Valid values - * are "web_hook" (or "webhook"). Both values refer to a channel where Http - * requests are used to deliver messages. - */ - type?: string; + /** + * Query param: Data format for the response. + */ + alt?: "json"; + + /** + * Query param: Selector specifying which fields to include in a partial response. + */ + fields?: string; + + /** + * Query param: API key. Your API key identifies your project and provides you with + * API access, quota, and reports. Required unless you provide an OAuth 2.0 token. + */ + key?: string; + + /** + * Query param: Maximum number of entries returned on one result page. By default + * the value is 100 entries. The page size can never be larger than 250 entries. + * Optional. + */ + maxResults?: number; + + /** + * Query param: OAuth 2.0 token for the current user. + */ + oauth_token?: string; + + /** + * Query param: Token specifying which result page to return. Optional. + */ + pageToken?: string; + + /** + * Query param: Returns response with indentations and line breaks. + */ + prettyPrint?: boolean; + + /** + * Query param: An opaque string that represents a user for quota purposes. Must + * not exceed 40 characters. + */ + quotaUser?: string; + + /** + * Query param: Token obtained from the nextSyncToken field returned on the last + * page of results from the previous list request. It makes the result of this list + * request contain only entries that have changed since then. If the syncToken + * expires, the server will respond with a 410 GONE response code and the client + * should clear its storage and perform a full synchronization without any + * syncToken. Learn more about incremental synchronization. Optional. The default + * is to return all entries. + */ + syncToken?: string; + + /** + * Query param: Deprecated. Please use quotaUser instead. + */ + userIp?: string; + + /** + * Body param: A UUID or similar unique string that identifies this channel. + */ + id?: string; + + /** + * Body param: An arbitrary string delivered to the target address with each + * notification delivered over this channel. Optional. + */ + token?: string; + + /** + * Body param: The address where notifications are delivered for this channel. + */ + address?: string; + + /** + * Body param: Date and time of notification channel expiration, expressed as a + * Unix timestamp, in milliseconds. Optional. + */ + expiration?: string; + + /** + * Body param: Identifies this as a notification channel used to watch for changes + * to a resource, which is "api#channel". + */ + kind?: string; + + /** + * Body param: Additional parameters controlling delivery channel behavior. + * Optional. + */ + params?: Record; + + /** + * Body param: A Boolean value to indicate whether payload is wanted. Optional. + */ + payload?: boolean; + + /** + * Body param: An opaque ID that identifies the resource being watched on this + * channel. Stable across different API versions. + */ + resourceId?: string; + + /** + * Body param: A version-specific identifier for the watched resource. + */ + resourceUri?: string; + + /** + * Body param: The type of delivery mechanism used for this channel. Valid values + * are "web_hook" (or "webhook"). Both values refer to a channel where Http + * requests are used to deliver messages. + */ + type?: string; } export declare namespace Settings { - export { - type SettingRetrieveResponse as SettingRetrieveResponse, - type SettingRetrieveSettingResponse as SettingRetrieveSettingResponse, - type SettingRetrieveParams as SettingRetrieveParams, - type SettingRetrieveSettingParams as SettingRetrieveSettingParams, - type SettingWatchParams as SettingWatchParams, - }; + export type { + SettingRetrieveResponse, + SettingRetrieveSettingResponse, + SettingRetrieveParams, + SettingRetrieveSettingParams, + SettingWatchParams, + }; } diff --git a/packages/google-calendar/src/resources/users/users.ts b/packages/google-calendar/src/resources/users/users.ts index debf6313..94854282 100644 --- a/packages/google-calendar/src/resources/users/users.ts +++ b/packages/google-calendar/src/resources/users/users.ts @@ -5,11 +5,11 @@ import * as MeAPI from "./me/me"; import { Me } from "./me/me"; export class Users extends APIResource { - me: MeAPI.Me = new MeAPI.Me(this._client); + me: MeAPI.Me = new MeAPI.Me(this._client); } Users.Me = Me; export declare namespace Users { - export { Me as Me }; + export { Me }; } diff --git a/packages/google-calendar/tsconfig.json b/packages/google-calendar/tsconfig.json index 70c407ed..e86f68f1 100644 --- a/packages/google-calendar/tsconfig.json +++ b/packages/google-calendar/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/tooling/eslint-config/base.js b/tooling/eslint-config/base.js deleted file mode 100644 index 201492cc..00000000 --- a/tooling/eslint-config/base.js +++ /dev/null @@ -1,32 +0,0 @@ -import js from "@eslint/js"; -import eslintConfigPrettier from "eslint-config-prettier"; -import turboPlugin from "eslint-plugin-turbo"; -import tseslint from "typescript-eslint"; -import onlyWarn from "eslint-plugin-only-warn"; - -/** - * A shared ESLint configuration for the repository. - * - * @type {import("eslint").Linter.Config} - * */ -export const config = [ - js.configs.recommended, - eslintConfigPrettier, - ...tseslint.configs.recommended, - { - plugins: { - turbo: turboPlugin, - }, - rules: { - "turbo/no-undeclared-env-vars": "warn", - }, - }, - { - plugins: { - onlyWarn, - }, - }, - { - ignores: ["dist/**"], - }, -]; \ No newline at end of file diff --git a/tooling/eslint-config/next.js b/tooling/eslint-config/next.js deleted file mode 100644 index da32c86f..00000000 --- a/tooling/eslint-config/next.js +++ /dev/null @@ -1,49 +0,0 @@ -import js from "@eslint/js"; -import eslintConfigPrettier from "eslint-config-prettier"; -import tseslint from "typescript-eslint"; -import pluginReactHooks from "eslint-plugin-react-hooks"; -import pluginReact from "eslint-plugin-react"; -import globals from "globals"; -import pluginNext from "@next/eslint-plugin-next"; -import { config as baseConfig } from "./base.js"; - -/** - * A custom ESLint configuration for libraries that use Next.js. - * - * @type {import("eslint").Linter.Config} - * */ -export const config = [ - ...baseConfig, - js.configs.recommended, - eslintConfigPrettier, - ...tseslint.configs.recommended, - { - ...pluginReact.configs.flat.recommended, - languageOptions: { - ...pluginReact.configs.flat.recommended.languageOptions, - globals: { - ...globals.serviceworker, - }, - }, - }, - { - plugins: { - "@next/next": pluginNext, - }, - rules: { - ...pluginNext.configs.recommended.rules, - ...pluginNext.configs["core-web-vitals"].rules, - }, - }, - { - plugins: { - "react-hooks": pluginReactHooks, - }, - settings: { react: { version: "detect" } }, - rules: { - ...pluginReactHooks.configs.recommended.rules, - // React scope no longer necessary with new JSX transform. - "react/react-in-jsx-scope": "off", - }, - }, -]; diff --git a/tooling/eslint-config/package.json b/tooling/eslint-config/package.json deleted file mode 100644 index 5e6e49e6..00000000 --- a/tooling/eslint-config/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@repo/eslint-config", - "version": "0.0.0", - "type": "module", - "private": true, - "exports": { - "./base": "./base.js", - "./next": "./next.js", - "./react": "./react.js" - }, - "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" - } -} \ No newline at end of file diff --git a/tooling/eslint-config/react.js b/tooling/eslint-config/react.js deleted file mode 100644 index bd4dadaf..00000000 --- a/tooling/eslint-config/react.js +++ /dev/null @@ -1,39 +0,0 @@ -import js from "@eslint/js"; -import eslintConfigPrettier from "eslint-config-prettier"; -import tseslint from "typescript-eslint"; -import pluginReactHooks from "eslint-plugin-react-hooks"; -import pluginReact from "eslint-plugin-react"; -import globals from "globals"; -import { config as baseConfig } from "./base.js"; - -/** - * A custom ESLint configuration for libraries that use React. - * - * @type {import("eslint").Linter.Config} */ -export const config = [ - ...baseConfig, - js.configs.recommended, - eslintConfigPrettier, - ...tseslint.configs.recommended, - pluginReact.configs.flat.recommended, - { - languageOptions: { - ...pluginReact.configs.flat.recommended.languageOptions, - globals: { - ...globals.serviceworker, - ...globals.browser, - }, - }, - }, - { - plugins: { - "react-hooks": pluginReactHooks, - }, - settings: { react: { version: "detect" } }, - rules: { - ...pluginReactHooks.configs.recommended.rules, - // React scope no longer necessary with new JSX transform. - "react/react-in-jsx-scope": "off", - }, - }, -]; \ No newline at end of file diff --git a/tooling/typescript-config/base.json b/tooling/typescript-config/base.json index c30fa832..20b2ed02 100644 --- a/tooling/typescript-config/base.json +++ b/tooling/typescript-config/base.json @@ -1,21 +1,20 @@ { - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "declaration": true, - "declarationMap": true, - "esModuleInterop": true, - "incremental": false, - "isolatedModules": true, - "lib": ["ESNext", "DOM", "DOM.Iterable"], - "module": "ESNext", - "moduleDetection": "force", - "moduleResolution": "Bundler", - "noUncheckedIndexedAccess": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "target": "ES2022", - "noEmit": true - } + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "incremental": false, + "isolatedModules": true, + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleDetection": "force", + "moduleResolution": "Bundler", + "noUncheckedIndexedAccess": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ES2022", + "noEmit": true + } } - diff --git a/tooling/typescript-config/next.json b/tooling/typescript-config/next.json index abb51eee..6645c005 100644 --- a/tooling/typescript-config/next.json +++ b/tooling/typescript-config/next.json @@ -1,16 +1,16 @@ { - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./base.json", - "compilerOptions": { - "allowJs": true, - "module": "ESNext", - "moduleResolution": "Bundler", - "noEmit": true, - "jsx": "preserve", - "plugins": [ - { - "name": "next" - } - ] - } -} \ No newline at end of file + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./base.json", + "compilerOptions": { + "allowJs": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "noEmit": true, + "jsx": "preserve", + "plugins": [ + { + "name": "next" + } + ] + } +} diff --git a/tooling/typescript-config/package.json b/tooling/typescript-config/package.json index 034edce8..de85f97d 100644 --- a/tooling/typescript-config/package.json +++ b/tooling/typescript-config/package.json @@ -1,5 +1,5 @@ { - "name": "@repo/typescript-config", - "version": "0.0.1", - "private": true -} \ No newline at end of file + "name": "@repo/typescript-config", + "version": "0.0.1", + "private": true +} diff --git a/tooling/typescript-config/react.json b/tooling/typescript-config/react.json index 2c677efa..cf2f4483 100644 --- a/tooling/typescript-config/react.json +++ b/tooling/typescript-config/react.json @@ -1,7 +1,7 @@ { - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./base.json", - "compilerOptions": { - "jsx": "react-jsx" - } -} \ No newline at end of file + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./base.json", + "compilerOptions": { + "jsx": "react-jsx" + } +} diff --git a/tsconfig.json b/tsconfig.json index 9e26dfee..0967ef42 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1 +1 @@ -{} \ No newline at end of file +{} diff --git a/turbo.json b/turbo.json index db6363aa..0136634f 100644 --- a/turbo.json +++ b/turbo.json @@ -1,52 +1,49 @@ { - "$schema": "https://turbo.build/schema.json", - "tasks": { - "build": { - "dependsOn": ["^build"], - "env": [ - "NODE_ENV", - "DATABASE_URL", - "BETTER_AUTH_SECRET", - "BETTER_AUTH_URL", - "GOOGLE_CLIENT_ID", - "GOOGLE_CLIENT_SECRET" - ], - "inputs": ["$TURBO_DEFAULT$", ".env*"], - "outputs": ["dist/**", ".next/**", "!.next/cache/**"] - }, - "dev": { - "persistent": true, - "cache": false, - "env": [ - "NODE_ENV", - "DATABASE_URL", - "BETTER_AUTH_SECRET", - "BETTER_AUTH_URL", - "GOOGLE_CLIENT_ID", - "GOOGLE_CLIENT_SECRET" - ] - }, - "lint": { - "dependsOn": ["^lint"] - }, - "db:generate": { - "cache": false - }, - "db:migrate": { - "cache": false, - "env": [ "DATABASE_URL" ], - "inputs": ["$TURBO_DEFAULT$", ".env*"] - }, - "db:push": { - "cache": false, - "env": [ "DATABASE_URL" ], - "inputs": ["$TURBO_DEFAULT$", ".env*"] - }, - "db:studio": { - "persistent": true, - "cache": false, - "env": [ "DATABASE_URL" ], - "inputs": ["$TURBO_DEFAULT$", ".env*"] - } + "$schema": "https://turbo.build/schema.json", + "tasks": { + "build": { + "dependsOn": ["^build"], + "env": [ + "NODE_ENV", + "DATABASE_URL", + "BETTER_AUTH_SECRET", + "BETTER_AUTH_URL", + "GOOGLE_CLIENT_ID", + "GOOGLE_CLIENT_SECRET" + ], + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "outputs": ["dist/**", ".next/**", "!.next/cache/**"] + }, + "dev": { + "persistent": true, + "cache": false, + "env": [ + "NODE_ENV", + "DATABASE_URL", + "BETTER_AUTH_SECRET", + "BETTER_AUTH_URL", + "GOOGLE_CLIENT_ID", + "GOOGLE_CLIENT_SECRET" + ] + }, + "db:generate": { + "cache": false + }, + "db:migrate": { + "cache": false, + "env": ["DATABASE_URL"], + "inputs": ["$TURBO_DEFAULT$", ".env*"] + }, + "db:push": { + "cache": false, + "env": ["DATABASE_URL"], + "inputs": ["$TURBO_DEFAULT$", ".env*"] + }, + "db:studio": { + "persistent": true, + "cache": false, + "env": ["DATABASE_URL"], + "inputs": ["$TURBO_DEFAULT$", ".env*"] } -} \ No newline at end of file + } +}