From e2ce9472cfcbb118d6a2a85ccf777c01e4793f2f Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Thu, 29 Jun 2023 13:37:55 +0100 Subject: [PATCH] @trigger.dev/init: a number of improvements - Detect middleware usage and warn about how it could conflict with Trigger.dev and with a link to the docs - Lookup package versions and use the latest versions - Better error messages when registering an endpoint doesn't work --- .changeset/chatty-cars-agree.md | 9 + examples/nextjs-clerk/.gitignore | 35 ++ examples/nextjs-clerk/README.md | 34 ++ examples/nextjs-clerk/next.config.js | 4 + examples/nextjs-clerk/package.json | 29 + examples/nextjs-clerk/postcss.config.js | 6 + examples/nextjs-clerk/public/next.svg | 1 + examples/nextjs-clerk/public/vercel.svg | 1 + .../nextjs-clerk/src/app/api/trigger/route.ts | 31 + examples/nextjs-clerk/src/app/favicon.ico | Bin 0 -> 25931 bytes examples/nextjs-clerk/src/app/globals.css | 27 + examples/nextjs-clerk/src/app/layout.tsx | 24 + examples/nextjs-clerk/src/app/page.tsx | 11 + .../src/app/sign-in/[[...sign-in]]/page.tsx | 5 + .../src/app/sign-up/[[...sign-up]]/page.tsx | 5 + examples/nextjs-clerk/src/middleware.ts | 7 + examples/nextjs-clerk/tailwind.config.js | 18 + examples/nextjs-clerk/tsconfig.json | 28 + packages/init-trigger/package.json | 4 +- packages/init-trigger/src/index.ts | 106 +++- .../init-trigger/src/utils/addDependencies.ts | 89 ++- packages/init-trigger/src/utils/triggerApi.ts | 65 ++- pnpm-lock.yaml | 544 +++++++++++++++++- 23 files changed, 1032 insertions(+), 51 deletions(-) create mode 100644 .changeset/chatty-cars-agree.md create mode 100644 examples/nextjs-clerk/.gitignore create mode 100644 examples/nextjs-clerk/README.md create mode 100644 examples/nextjs-clerk/next.config.js create mode 100644 examples/nextjs-clerk/package.json create mode 100644 examples/nextjs-clerk/postcss.config.js create mode 100644 examples/nextjs-clerk/public/next.svg create mode 100644 examples/nextjs-clerk/public/vercel.svg create mode 100644 examples/nextjs-clerk/src/app/api/trigger/route.ts create mode 100644 examples/nextjs-clerk/src/app/favicon.ico create mode 100644 examples/nextjs-clerk/src/app/globals.css create mode 100644 examples/nextjs-clerk/src/app/layout.tsx create mode 100644 examples/nextjs-clerk/src/app/page.tsx create mode 100644 examples/nextjs-clerk/src/app/sign-in/[[...sign-in]]/page.tsx create mode 100644 examples/nextjs-clerk/src/app/sign-up/[[...sign-up]]/page.tsx create mode 100644 examples/nextjs-clerk/src/middleware.ts create mode 100644 examples/nextjs-clerk/tailwind.config.js create mode 100644 examples/nextjs-clerk/tsconfig.json diff --git a/.changeset/chatty-cars-agree.md b/.changeset/chatty-cars-agree.md new file mode 100644 index 000000000..a93e3d246 --- /dev/null +++ b/.changeset/chatty-cars-agree.md @@ -0,0 +1,9 @@ +--- +"@trigger.dev/init": patch +--- + +A number of improvements to the initialization experience: + +- Detect middleware usage and warn about how it could conflict with Trigger.dev and with a link to the docs +- Lookup package versions and use the latest versions +- Better error messages when registering an endpoint doesn't work diff --git a/examples/nextjs-clerk/.gitignore b/examples/nextjs-clerk/.gitignore new file mode 100644 index 000000000..8f322f0d8 --- /dev/null +++ b/examples/nextjs-clerk/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/examples/nextjs-clerk/README.md b/examples/nextjs-clerk/README.md new file mode 100644 index 000000000..f4da3c4c1 --- /dev/null +++ b/examples/nextjs-clerk/README.md @@ -0,0 +1,34 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/examples/nextjs-clerk/next.config.js b/examples/nextjs-clerk/next.config.js new file mode 100644 index 000000000..767719fc4 --- /dev/null +++ b/examples/nextjs-clerk/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {} + +module.exports = nextConfig diff --git a/examples/nextjs-clerk/package.json b/examples/nextjs-clerk/package.json new file mode 100644 index 000000000..61bac5d8e --- /dev/null +++ b/examples/nextjs-clerk/package.json @@ -0,0 +1,29 @@ +{ + "name": "@examples/nextjs-clerk", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@clerk/nextjs": "^4.21.12", + "@types/node": "20.3.2", + "@types/react": "^18.0.21", + "@types/react-dom": "^18.0.6", + "autoprefixer": "10.4.14", + "next": "13.4.7", + "postcss": "8.4.24", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tailwindcss": "3.3.2", + "typescript": "5.1.6", + "@trigger.dev/sdk": "2.0.0-next.4", + "@trigger.dev/nextjs": "1.0.0-next.5" + }, + "devDependencies": { + "@trigger.dev/init": "workspace:*" + } +} \ No newline at end of file diff --git a/examples/nextjs-clerk/postcss.config.js b/examples/nextjs-clerk/postcss.config.js new file mode 100644 index 000000000..33ad091d2 --- /dev/null +++ b/examples/nextjs-clerk/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/examples/nextjs-clerk/public/next.svg b/examples/nextjs-clerk/public/next.svg new file mode 100644 index 000000000..5174b28c5 --- /dev/null +++ b/examples/nextjs-clerk/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/nextjs-clerk/public/vercel.svg b/examples/nextjs-clerk/public/vercel.svg new file mode 100644 index 000000000..d2f842227 --- /dev/null +++ b/examples/nextjs-clerk/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/nextjs-clerk/src/app/api/trigger/route.ts b/examples/nextjs-clerk/src/app/api/trigger/route.ts new file mode 100644 index 000000000..6524d4895 --- /dev/null +++ b/examples/nextjs-clerk/src/app/api/trigger/route.ts @@ -0,0 +1,31 @@ + +import { Job, TriggerClient, eventTrigger } from "@trigger.dev/sdk"; +import { createAppRoute } from "@trigger.dev/nextjs"; + +const client = new TriggerClient({ + id: "my-nextjs-project", + url: process.env.VERCEL_URL, + apiKey: process.env.TRIGGER_API_KEY, + apiUrl: process.env.TRIGGER_API_URL, +}); + +new Job(client, { + id: "example-job", + name: "Example Job", + version: "0.0.1", + trigger: eventTrigger({ + name: "example.event", + }), + run: async (payload, io, ctx) => { + await io.logger.info("Hello world!", { payload }); + + return { + message: "Hello world!", + }; + }, +}); + +export const { POST, dynamic } = createAppRoute(client, { + path: "/api/trigger", +}); + \ No newline at end of file diff --git a/examples/nextjs-clerk/src/app/favicon.ico b/examples/nextjs-clerk/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/examples/nextjs-clerk/src/app/globals.css b/examples/nextjs-clerk/src/app/globals.css new file mode 100644 index 000000000..fd81e8858 --- /dev/null +++ b/examples/nextjs-clerk/src/app/globals.css @@ -0,0 +1,27 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} diff --git a/examples/nextjs-clerk/src/app/layout.tsx b/examples/nextjs-clerk/src/app/layout.tsx new file mode 100644 index 000000000..e2a7f6a99 --- /dev/null +++ b/examples/nextjs-clerk/src/app/layout.tsx @@ -0,0 +1,24 @@ +import "./globals.css"; +import { Inter } from "next/font/google"; +import { ClerkProvider } from "@clerk/nextjs"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata = { + title: "Next.js + Clerk - Trigger.dev starter", + description: "A starter for Next.js + Clerk", +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + {children} + + + ); +} diff --git a/examples/nextjs-clerk/src/app/page.tsx b/examples/nextjs-clerk/src/app/page.tsx new file mode 100644 index 000000000..29bddd666 --- /dev/null +++ b/examples/nextjs-clerk/src/app/page.tsx @@ -0,0 +1,11 @@ +import { UserButton } from "@clerk/nextjs"; + +export default function Home() { + return ( +
+
+ +
+
+ ); +} diff --git a/examples/nextjs-clerk/src/app/sign-in/[[...sign-in]]/page.tsx b/examples/nextjs-clerk/src/app/sign-in/[[...sign-in]]/page.tsx new file mode 100644 index 000000000..2cc13d4c9 --- /dev/null +++ b/examples/nextjs-clerk/src/app/sign-in/[[...sign-in]]/page.tsx @@ -0,0 +1,5 @@ +import { SignIn } from "@clerk/nextjs"; + +export default function Page() { + return ; +} diff --git a/examples/nextjs-clerk/src/app/sign-up/[[...sign-up]]/page.tsx b/examples/nextjs-clerk/src/app/sign-up/[[...sign-up]]/page.tsx new file mode 100644 index 000000000..27439454c --- /dev/null +++ b/examples/nextjs-clerk/src/app/sign-up/[[...sign-up]]/page.tsx @@ -0,0 +1,5 @@ +import { SignUp } from "@clerk/nextjs"; + +export default function Page() { + return ; +} diff --git a/examples/nextjs-clerk/src/middleware.ts b/examples/nextjs-clerk/src/middleware.ts new file mode 100644 index 000000000..126a58657 --- /dev/null +++ b/examples/nextjs-clerk/src/middleware.ts @@ -0,0 +1,7 @@ +import { authMiddleware } from "@clerk/nextjs"; + +export default authMiddleware(); + +export const config = { + matcher: ["/((?!.*\\..*|_next).*)", "/", "/(api|trpc)(.*)"], +}; diff --git a/examples/nextjs-clerk/tailwind.config.js b/examples/nextjs-clerk/tailwind.config.js new file mode 100644 index 000000000..d53b2eaa0 --- /dev/null +++ b/examples/nextjs-clerk/tailwind.config.js @@ -0,0 +1,18 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + './src/components/**/*.{js,ts,jsx,tsx,mdx}', + './src/app/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: { + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + 'gradient-conic': + 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', + }, + }, + }, + plugins: [], +} diff --git a/examples/nextjs-clerk/tsconfig.json b/examples/nextjs-clerk/tsconfig.json new file mode 100644 index 000000000..0c7555fa7 --- /dev/null +++ b/examples/nextjs-clerk/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/init-trigger/package.json b/packages/init-trigger/package.json index fcda3b464..7fea9f2a0 100644 --- a/packages/init-trigger/package.json +++ b/packages/init-trigger/package.json @@ -63,8 +63,10 @@ "inquirer": "^9.1.4", "node-fetch": "^3.3.0", "ora": "^6.1.2", + "path-to-regexp": "^6.2.1", "simple-git": "^3.19.0", - "terminal-link": "^3.0.0" + "terminal-link": "^3.0.0", + "zod": "^3.20.2" }, "engines": { "node": ">=18" diff --git a/packages/init-trigger/src/index.ts b/packages/init-trigger/src/index.ts index af4b0aec1..c49210eea 100644 --- a/packages/init-trigger/src/index.ts +++ b/packages/init-trigger/src/index.ts @@ -12,6 +12,7 @@ import { TriggerApi } from "./utils/triggerApi.js"; import { DEFAULT_TRIGGER_URL } from "./consts.js"; import ora from "ora"; import { renderApiKey } from "./utils/renderApiKey.js"; +import { pathToRegexp } from "path-to-regexp"; const main = async () => { renderTitle(); @@ -69,8 +70,8 @@ const main = async () => { } await addDependencies(resolvedPath, [ - { name: "@trigger.dev/sdk", version: "next" }, - { name: "@trigger.dev/nextjs", version: "latest" }, + { name: "@trigger.dev/sdk", tag: "next" }, + { name: "@trigger.dev/nextjs", tag: "latest" }, ]); // Setup environment variables @@ -92,20 +93,22 @@ const main = async () => { await createTriggerAppRoute(routeDir, cliResults, usesSrcDir); } + await detectMiddlewareUsage(resolvedPath, usesSrcDir); + await waitForProjectToBuild(); const api = new TriggerApi(apiKey, cliResults.flags.triggerUrl); - const endpoint = await api.createEndpoint({ + const response = await api.createEndpoint({ id: cliResults.flags.endpointSlug, url: `${cliResults.flags.endpointUrl}${ cliResults.flags.endpointUrl.endsWith("/") ? "" : "/" }api/trigger`, }); - if (!endpoint) { + if (!response.ok) { logger.error( - "Unable to create endpoint, please contact eric@trigger.dev for assistance." + `${response.error}. Please contact eric@trigger.dev for assistance.` ); process.exit(1); @@ -207,6 +210,99 @@ async function detectPagesOrAppDir( } } +async function detectMiddlewareUsage(path: string, usesSrcDir = false) { + const middlewarePath = pathModule.join( + path, + usesSrcDir ? "src" : "", + "middleware.ts" + ); + + const middlewareExists = await pathExists(middlewarePath); + + if (!middlewareExists) { + return; + } + + const matcher = await getMiddlewareConfigMatcher(middlewarePath); + + if (!matcher || matcher.length === 0) { + logger.warn( + `⚠️ ⚠️ ⚠️ It looks like you're using Next.js middleware at ${pathModule.relative( + process.cwd(), + middlewarePath + )}. This can cause problems with Trigger.dev. Please see https://trigger.dev/docs/documentation/guides/platforms/nextjs#middleware for more info.` + ); + + return; + } + + if (matcher.length === 0) { + return; + } + + if (typeof matcher === "string") { + const matcherRegex = pathToRegexp(matcher); + + // Check to see if /api/trigger matches the regex, if it does, then we need to output a warning with a link to the docs to fix it + if (matcherRegex.test("/api/trigger")) { + logger.warn( + `🚨 It looks like you're using Next.js middleware at ${pathModule.relative( + process.cwd(), + middlewarePath + )} that matches the '/api/trigger' path. This can cause problems with Trigger.dev. Please see https://trigger.dev/docs/documentation/guides/platforms/nextjs#middleware for more info.` + ); + } + } else if ( + Array.isArray(matcher) && + matcher.every((m) => typeof m === "string") + ) { + const matcherRegexes = matcher.map((m) => pathToRegexp(m)); + + if (matcherRegexes.some((r) => r.test("/api/trigger"))) { + logger.warn( + `🚨 It looks like you're using Next.js middleware at ${pathModule.relative( + process.cwd(), + middlewarePath + )} that matches the '/api/trigger' path. This can cause problems with Trigger.dev. Please see https://trigger.dev/docs/documentation/guides/platforms/nextjs#middleware for more info.` + ); + } + } +} + +async function getMiddlewareConfigMatcher( + path: string +): Promise> { + const fileContent = await fs.readFile(path, "utf-8"); + + const regex = /matcher:\s*(\[.*\]|".*")/s; + let match = regex.exec(fileContent); + + if (!match) { + return []; + } + + if (match.length < 2) { + return []; + } + + let matcherString: string = match[1] as string; + + // Handle array scenario + if (matcherString.startsWith("[") && matcherString.endsWith("]")) { + matcherString = matcherString.slice(1, -1); // Remove brackets + const arrayRegex = /("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')/g; + let arrayMatch; + const matches: string[] = []; + while ((arrayMatch = arrayRegex.exec(matcherString)) !== null) { + matches.push((arrayMatch[1] as string).slice(1, -1)); // remove quotes + } + return matches; + } else { + // Handle single string scenario + return [matcherString.slice(1, -1)]; // remove quotes + } +} + async function createTriggerPageRoute( path: string, cliResults: CliResults, diff --git a/packages/init-trigger/src/utils/addDependencies.ts b/packages/init-trigger/src/utils/addDependencies.ts index de4ec6bbd..07146dc48 100644 --- a/packages/init-trigger/src/utils/addDependencies.ts +++ b/packages/init-trigger/src/utils/addDependencies.ts @@ -4,8 +4,15 @@ import ora, { type Ora } from "ora"; import pathModule from "path"; import { getUserPkgManager, type PackageManager } from "./getUserPkgManager.js"; import fs from "fs/promises"; +import fetch from "node-fetch"; +import { z } from "zod"; export type InstallPackage = { + name: string; + tag: string; +}; + +export type InstalledPackage = { name: string; version: string; }; @@ -16,37 +23,95 @@ export async function addDependencies( ) { const pkgManager = getUserPkgManager(); - await addDependenciesToPackageJson(projectDir, packages); + const spinner = ora( + "Adding @trigger.dev dependencies to package.json..." + ).start(); + + const installedPackages = await addDependenciesToPackageJson( + projectDir, + packages + ); + + spinner.succeed( + chalk.green( + `Successfully added dependencies to package.json: ${installedPackages + .map((pkg) => `${pkg.name}@${pkg.version}`) + .join(", ")}` + ) + ); const installSpinner = await runInstallCommand(pkgManager, projectDir); - // If the spinner was used to show the progress, use succeed method on it - // If not, use the succeed on a new spinner - (installSpinner || ora()).succeed( - chalk.green( - `Successfully installed ${packages - .map((pkg) => `${pkg.name}@${pkg.version}`) - .join(", ")}}` - ) - ); + (installSpinner || ora()).stop(); } async function addDependenciesToPackageJson( projectDir: string, packages: Array -) { +): Promise> { const pkgJsonPath = pathModule.join(projectDir, "package.json"); const pkgBuffer = await fs.readFile(pkgJsonPath); const pkgJson = JSON.parse(pkgBuffer.toString()); + const packagesToInstall = await getLatestPackageVersions(packages); + // Add the dependencies to the package.json file pkgJson.dependencies = { ...pkgJson.dependencies, - ...Object.fromEntries(packages.map((pkg) => [pkg.name, pkg.version])), + ...Object.fromEntries( + packagesToInstall.map((pkg) => [pkg.name, `^${pkg.version}`]) + ), }; // Write the updated package.json file await fs.writeFile(pkgJsonPath, JSON.stringify(pkgJson, null, 2)); + + return packagesToInstall; +} + +const PackageSchema = z.object({ + name: z.string(), + "dist-tags": z.record(z.string()), +}); + +async function getLatestPackageVersion( + packageName: string, + tag: string +): Promise { + const response = await fetch(`https://registry.npmjs.org/${packageName}`); + + if (!response.ok) { + return; + } + + const body = await response.json(); + + const parsedBody = PackageSchema.safeParse(body); + + if (!parsedBody.success) { + return; + } + + const latestVersion = parsedBody.data["dist-tags"][tag]; + + if (!latestVersion) { + return; + } + + return { + name: packageName, + version: latestVersion, + }; +} + +async function getLatestPackageVersions( + packages: Array +): Promise> { + const latestPackageVersions = await Promise.all( + packages.map((pkg) => getLatestPackageVersion(pkg.name, pkg.tag)) + ); + + return latestPackageVersions.filter(Boolean) as Array; } async function runInstallCommand( diff --git a/packages/init-trigger/src/utils/triggerApi.ts b/packages/init-trigger/src/utils/triggerApi.ts index ad769241d..3e680a719 100644 --- a/packages/init-trigger/src/utils/triggerApi.ts +++ b/packages/init-trigger/src/utils/triggerApi.ts @@ -1,11 +1,12 @@ import fetch from "node-fetch"; +import { z } from "zod"; export type CreateEndpointOptions = { id: string; url: string; }; -export type EndpointResponse = { +export type EndpointData = { id: string; slug: string; url: string; @@ -17,12 +18,19 @@ export type EndpointResponse = { indexingHookIdentifier: string; }; +export type EndpointResponse = + | { + ok: true; + data: EndpointData; + } + | { ok: false; error: string }; + export class TriggerApi { constructor(private apiKey: string, private baseUrl: string) {} async createEndpoint( options: CreateEndpointOptions - ): Promise { + ): Promise { const response = await fetch(`${this.baseUrl}/api/v1/endpoints`, { method: "POST", headers: { @@ -32,10 +40,59 @@ export class TriggerApi { body: JSON.stringify(options), }); - if (response.ok) { - return response.json() as Promise; + if (!response.ok) { + const rawBody = await response.text(); + + if (typeof rawBody === "string") { + const rawJson = safeJsonParse(rawBody); + + if (!rawJson) { + return { + ok: false, + error: + "An unknown issue occurred when registering with Trigger.dev", + }; + } + + const parsedJson = z.object({ message: z.string() }).safeParse(rawJson); + + if (!parsedJson.success) { + return { + ok: false, + error: + "An unknown issue occurred when registering with Trigger.dev", + }; + } + + return { + ok: false, + error: parsedJson.data.message, + }; + } else { + return { + ok: false, + error: "An unknown issue occurred when registering with Trigger.dev", + }; + } } + const data = await response.json(); + + return { + ok: true, + data: data as any as EndpointData, + }; + } +} + +function safeJsonParse(raw: string | null | undefined): unknown { + if (typeof raw !== "string") { + return; + } + + try { + return JSON.parse(raw); + } catch (error) { return; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 384f03869..dfa48c3c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -458,6 +458,39 @@ importers: config-packages/tsconfig: specifiers: {} + examples/nextjs-clerk: + specifiers: + '@clerk/nextjs': ^4.21.12 + '@trigger.dev/init': workspace:* + '@trigger.dev/nextjs': 1.0.0-next.5 + '@trigger.dev/sdk': 2.0.0-next.4 + '@types/node': 20.3.2 + '@types/react': ^18.0.21 + '@types/react-dom': ^18.0.6 + autoprefixer: 10.4.14 + next: 13.4.7 + postcss: 8.4.24 + react: ^18.2.0 + react-dom: ^18.2.0 + tailwindcss: 3.3.2 + typescript: 5.1.6 + dependencies: + '@clerk/nextjs': 4.21.12_5v7kwk6wz2hvmegftnptprfjvm + '@trigger.dev/nextjs': 1.0.0-next.5_2p6duyjdlqfptvv2ohfljlwidy + '@trigger.dev/sdk': 2.0.0-next.4 + '@types/node': 20.3.2 + '@types/react': 18.0.26 + '@types/react-dom': 18.0.10 + autoprefixer: 10.4.14_postcss@8.4.24 + next: 13.4.7_biqbaboplfbrettd7655fr4n2y + postcss: 8.4.24 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tailwindcss: 3.3.2 + typescript: 5.1.6 + devDependencies: + '@trigger.dev/init': link:../../packages/init-trigger + examples/nextjs-example: specifiers: '@trigger.dev/github': workspace:* @@ -668,12 +701,14 @@ importers: inquirer: ^9.1.4 node-fetch: ^3.3.0 ora: ^6.1.2 + path-to-regexp: ^6.2.1 rimraf: ^3.0.2 simple-git: ^3.19.0 terminal-link: ^3.0.0 tsup: ^6.5.0 type-fest: ^3.6.0 typescript: ^4.9.5 + zod: ^3.20.2 dependencies: '@types/degit': 2.8.3 chalk: 5.2.0 @@ -685,8 +720,10 @@ importers: inquirer: 9.1.4 node-fetch: 3.3.0 ora: 6.1.2 + path-to-regexp: 6.2.1 simple-git: 3.19.0 terminal-link: 3.0.0 + zod: 3.21.4 devDependencies: '@types/fs-extra': 11.0.1 '@types/gradient-string': 1.1.2 @@ -5446,6 +5483,84 @@ packages: prettier: 2.8.8 dev: false + /@clerk/backend/0.23.6: + resolution: {integrity: sha512-+JnG9jmqoqPPKCHEtGf7vhFj2G8qNXmkPR8cDycjbUje/rXGNzxYAkgGaOahD9gXj5oZYMTKfGAebPf5i24JuA==} + engines: {node: '>=14'} + dependencies: + '@clerk/types': 3.46.1 + '@peculiar/webcrypto': 1.4.1 + '@types/node': 16.18.6 + deepmerge: 4.2.2 + node-fetch-native: 1.0.1 + snakecase-keys: 5.4.4 + tslib: 2.4.1 + dev: false + + /@clerk/clerk-react/4.21.0_react@18.2.0: + resolution: {integrity: sha512-wd8BDGIh8zMx6R9uTmAQdgtTBzx7B7hlWlWSxZ+oJVcz8MqT7gcmmYGgqnr5RuDtaWK9Z2jzya6CvVodzJi/Wg==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16' + dependencies: + '@clerk/shared': 0.19.1_react@18.2.0 + '@clerk/types': 3.46.1 + react: 18.2.0 + swr: 1.3.0_react@18.2.0 + tslib: 2.4.1 + dev: false + + /@clerk/clerk-sdk-node/4.10.13: + resolution: {integrity: sha512-Yy7N/DT1GdW+oI3/PxYqgjIgHCIEPI97dDUYn1xpG82y9aIQMVI69/W7KRK940559GDl4CmgZm1Taon+SOdDmQ==} + engines: {node: '>=14'} + dependencies: + '@clerk/backend': 0.23.6 + '@clerk/types': 3.46.1 + '@types/cookies': 0.7.7 + '@types/express': 4.17.14 + '@types/node-fetch': 2.6.2 + camelcase-keys: 6.2.2 + cookie: 0.5.0 + snakecase-keys: 3.2.1 + tslib: 2.4.1 + dev: false + + /@clerk/nextjs/4.21.12_5v7kwk6wz2hvmegftnptprfjvm: + resolution: {integrity: sha512-KjdKaDaDAaVFBXnXVoHC/PSycHHmATzLizhvC0BVmpsOKFdcWarnOltd5uXaHekUI79nFYLIAZLGMiOZRgZLPg==} + engines: {node: '>=14'} + peerDependencies: + next: '>=10' + react: ^17.0.2 || ^18.0.0-0 + react-dom: ^17.0.2 || ^18.0.0-0 + dependencies: + '@clerk/backend': 0.23.6 + '@clerk/clerk-react': 4.21.0_react@18.2.0 + '@clerk/clerk-sdk-node': 4.10.13 + '@clerk/types': 3.46.1 + next: 13.4.7_biqbaboplfbrettd7655fr4n2y + path-to-regexp: 6.2.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.1 + dev: false + + /@clerk/shared/0.19.1_react@18.2.0: + resolution: {integrity: sha512-5RwASoff6CPgHcrM3kuvgUwp9qQa02zkjUdV8lNzQYEhojz6dfahLv3xZW3MS1UqDOIGrbrPviqi9pBmjpNKPA==} + peerDependencies: + react: '>=16' + dependencies: + glob-to-regexp: 0.4.1 + js-cookie: 3.0.1 + react: 18.2.0 + swr: 1.3.0_react@18.2.0 + dev: false + + /@clerk/types/3.46.1: + resolution: {integrity: sha512-IA/iSXJJZym4Z6f9OcT9OJayK2opVhxUVJky15aY4iVsJCPScgApBuuzC7N4vfXwA6RI/wGebFbvmsEQ3oI/UA==} + engines: {node: '>=14'} + dependencies: + csstype: 3.1.1 + dev: false + /@codemirror/autocomplete/6.4.0_czcfkg2f66rxeiodoti7r2gulu: resolution: {integrity: sha512-HLF2PnZAm1s4kGs30EiqKMgD7XsYaQ0XJnMR0rofEWQ5t5D60SfqpDIkIh1ze5tiEbyUWm8+VJ6W1/erVvBMIA==} peerDependencies: @@ -6997,6 +7112,10 @@ packages: /@next/env/13.3.1: resolution: {integrity: sha512-EDtCoedIZC7JlUQ3uaQpSc4aVmyhbLHmQVALg7pFfQgOTjgSnn7mKtA0DiCMkYvvsx6aFb5octGMtWrOtGXW9A==} + /@next/env/13.4.7: + resolution: {integrity: sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==} + dev: false + /@next/eslint-plugin-next/13.4.6: resolution: {integrity: sha512-bPigeu0RI7bgy1ucBA2Yqcfg539y0Lzo38P2hIkrRB1GNvFSbYg6RTu8n6tGqPVrH3TTlPTNKLXG01wc+5NuwQ==} dependencies: @@ -7011,6 +7130,15 @@ packages: requiresBuild: true optional: true + /@next/swc-darwin-arm64/13.4.7: + resolution: {integrity: sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-darwin-x64/13.3.1: resolution: {integrity: sha512-lT36yYxosCfLtplFzJWgo0hrPu6/do8+msgM7oQkPeohDNdhjtjFUgOOwdSnPublLR6Mo2Ym4P/wl5OANuD2bw==} engines: {node: '>= 10'} @@ -7019,6 +7147,15 @@ packages: requiresBuild: true optional: true + /@next/swc-darwin-x64/13.4.7: + resolution: {integrity: sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-gnu/13.3.1: resolution: {integrity: sha512-wRb76nLWJhonH8s3kxC/1tFguEkeOPayIwe9mkaz1G/yeS3OrjeyKMJsb4+Kdg0zbTo53bNCOl59NNtDM7yyyw==} engines: {node: '>= 10'} @@ -7027,6 +7164,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-arm64-gnu/13.4.7: + resolution: {integrity: sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-musl/13.3.1: resolution: {integrity: sha512-qz3BzjJRZ16Iq/jrp+pjiYOc0jTjHlfmxQmZk9x/+5uhRP6/eWQSTAPVJ33BMo6oK5O5N4644OgTAbzXzorecg==} engines: {node: '>= 10'} @@ -7035,6 +7181,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-arm64-musl/13.4.7: + resolution: {integrity: sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-gnu/13.3.1: resolution: {integrity: sha512-6mgkLmwlyWlomQmpl21I3hxgqE5INoW4owTlcLpNsd1V4wP+J46BlI/5zV5KWWbzjfncIqzXoeGs5Eg+1GHODA==} engines: {node: '>= 10'} @@ -7043,6 +7198,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-x64-gnu/13.4.7: + resolution: {integrity: sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-musl/13.3.1: resolution: {integrity: sha512-uqm5sielhQmKJM+qayIhgZv1KlS5pqTdQ99b+Z7hMWryXS96qE0DftTmMZowBcUL6x7s2vSXyH5wPtO1ON7LBg==} engines: {node: '>= 10'} @@ -7051,6 +7215,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-x64-musl/13.4.7: + resolution: {integrity: sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-arm64-msvc/13.3.1: resolution: {integrity: sha512-WomIiTj/v3LevltlibNQKmvrOymNRYL+a0dp5R73IwPWN5FvXWwSELN/kiNALig/+T3luc4qHNTyvMCp9L6U5Q==} engines: {node: '>= 10'} @@ -7059,6 +7232,15 @@ packages: requiresBuild: true optional: true + /@next/swc-win32-arm64-msvc/13.4.7: + resolution: {integrity: sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-ia32-msvc/13.3.1: resolution: {integrity: sha512-M+PoH+0+q658wRUbs285RIaSTYnGBSTdweH/0CdzDgA6Q4rBM0sQs4DHmO3BPP0ltCO/vViIoyG7ks66XmCA5g==} engines: {node: '>= 10'} @@ -7067,6 +7249,15 @@ packages: requiresBuild: true optional: true + /@next/swc-win32-ia32-msvc/13.4.7: + resolution: {integrity: sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-x64-msvc/13.3.1: resolution: {integrity: sha512-Sl1F4Vp5Z1rNXWZYqJwMuWRRol4bqOB6+/d7KqkgQ4AcafKPN1PZmpkCoxv4UFHtFNIB7EotnuIhtXu3zScicQ==} engines: {node: '>= 10'} @@ -7075,6 +7266,15 @@ packages: requiresBuild: true optional: true + /@next/swc-win32-x64-msvc/13.4.7: + resolution: {integrity: sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@nicolo-ribaudo/eslint-scope-5-internals/5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} dependencies: @@ -7452,6 +7652,32 @@ packages: resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} dev: true + /@peculiar/asn1-schema/2.3.6: + resolution: {integrity: sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==} + dependencies: + asn1js: 3.0.5 + pvtsutils: 1.3.2 + tslib: 2.5.0 + dev: false + + /@peculiar/json-schema/1.1.12: + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} + engines: {node: '>=8.0.0'} + dependencies: + tslib: 2.5.0 + dev: false + + /@peculiar/webcrypto/1.4.1: + resolution: {integrity: sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==} + engines: {node: '>=10.12.0'} + dependencies: + '@peculiar/asn1-schema': 2.3.6 + '@peculiar/json-schema': 1.1.12 + pvtsutils: 1.3.2 + tslib: 2.5.0 + webcrypto-core: 1.7.7 + dev: false + /@pkgr/utils/2.3.1: resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -10280,6 +10506,12 @@ packages: dependencies: tslib: 2.5.0 + /@swc/helpers/0.5.1: + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + dependencies: + tslib: 2.5.0 + dev: false + /@szmarczak/http-timer/1.1.2: resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} @@ -10456,6 +10688,46 @@ packages: react-dom: 18.2.0_react@18.2.0 dev: false + /@trigger.dev/nextjs/1.0.0-next.5_2p6duyjdlqfptvv2ohfljlwidy: + resolution: {integrity: sha512-41/RvyfuR3cPDCKAAhWOJMNw3KgA9uho7vcg8Q0ri8NCObsvxbStpnb5lpvNsUVOTyB7qy3tHULVJhKANczQqQ==} + engines: {node: '>=18'} + peerDependencies: + '@trigger.dev/sdk': ^2.0.0-next.2 + next: ^13.3.1 + dependencies: + '@trigger.dev/sdk': 2.0.0-next.4 + debug: 4.3.4 + next: 13.4.7_biqbaboplfbrettd7655fr4n2y + transitivePeerDependencies: + - supports-color + dev: false + + /@trigger.dev/sdk/2.0.0-next.4: + resolution: {integrity: sha512-9N2YcM/Tt3Gu4Btf1EiHmRlsTuLyR9M+XLpbzOgli3MbhfHF0d39isE5M4Jz9qY+dQYeh5Rlyx+MEHTJxwvOdw==} + engines: {node: '>=18'} + dependencies: + chalk: 5.2.0 + debug: 4.3.4 + evt: 2.4.13 + get-caller-file: 2.0.5 + git-remote-origin-url: 4.0.0 + git-repo-info: 2.1.1 + node-fetch: 2.6.11 + slug: 6.1.0 + terminal-link: 3.0.0 + ulid: 2.3.0 + uuid: 9.0.0 + ws: 8.12.0 + zod: 3.21.4 + zod-error: 1.1.0 + zod-to-json-schema: 3.20.2_zod@3.21.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@tsconfig/node10/1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} @@ -10541,8 +10813,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.3.1 - dev: true + '@types/node': 20.3.2 /@types/btoa-lite/1.0.0: resolution: {integrity: sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg==} @@ -10582,12 +10853,20 @@ packages: /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.3.1 - dev: true + '@types/node': 20.3.2 /@types/cookie/0.4.1: resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + /@types/cookies/0.7.7: + resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} + dependencies: + '@types/connect': 3.4.35 + '@types/express': 4.17.15 + '@types/keygrip': 1.0.2 + '@types/node': 20.3.2 + dev: false + /@types/debug/4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: @@ -10650,10 +10929,18 @@ packages: /@types/express-serve-static-core/4.17.32: resolution: {integrity: sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==} dependencies: - '@types/node': 20.3.1 + '@types/node': 20.3.2 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 - dev: true + + /@types/express/4.17.14: + resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.32 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.0 + dev: false /@types/express/4.17.15: resolution: {integrity: sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==} @@ -10662,7 +10949,6 @@ packages: '@types/express-serve-static-core': 4.17.32 '@types/qs': 6.9.7 '@types/serve-static': 1.15.0 - dev: true /@types/find-cache-dir/3.2.1: resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} @@ -10797,6 +11083,10 @@ packages: dependencies: '@types/node': 18.15.13 + /@types/keygrip/1.0.2: + resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} + dev: false + /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: @@ -10835,7 +11125,6 @@ packages: /@types/mime/3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - dev: true /@types/minimatch/5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} @@ -10856,9 +11145,8 @@ packages: /@types/node-fetch/2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 20.3.1 + '@types/node': 20.3.2 form-data: 3.0.1 - dev: true /@types/node/10.17.60: resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} @@ -10875,6 +11163,10 @@ packages: resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} dev: true + /@types/node/16.18.6: + resolution: {integrity: sha512-vmYJF0REqDyyU0gviezF/KHq/fYaUbFhkcNbQCuPGFQj6VTbXuHZoxs/Y7mutWe73C8AC6l9fFu8mSYiBAqkGA==} + dev: false + /@types/node/18.11.18: resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} @@ -10888,6 +11180,9 @@ packages: /@types/node/20.3.1: resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} + /@types/node/20.3.2: + resolution: {integrity: sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw==} + /@types/node/8.10.66: resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} dev: true @@ -10923,11 +11218,9 @@ packages: /@types/qs/6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - dev: true /@types/range-parser/1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - dev: true /@types/react-date-range/1.4.4: resolution: {integrity: sha512-9Y9NyNgaCsEVN/+O4HKuxzPbVjRVBGdOKRxMDcsTRWVG62lpYgnxefNckTXDWup8FvczoqPW0+ESZR6R1yymDg==} @@ -10972,8 +11265,7 @@ packages: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 20.3.1 - dev: true + '@types/node': 20.3.2 /@types/set-cookie-parser/2.4.2: resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} @@ -11981,6 +12273,15 @@ packages: safer-buffer: 2.1.2 dev: true + /asn1js/3.0.5: + resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} + engines: {node: '>=12.0.0'} + dependencies: + pvtsutils: 1.3.2 + pvutils: 1.1.3 + tslib: 2.5.0 + dev: false + /assert-plus/1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} @@ -12090,6 +12391,22 @@ packages: postcss-value-parser: 4.2.0 dev: true + /autoprefixer/10.4.14_postcss@8.4.24: + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.9 + caniuse-lite: 1.0.30001504 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: false + /available-typed-arrays/1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} @@ -12551,7 +12868,6 @@ packages: electron-to-chromium: 1.4.433 node-releases: 2.0.12 update-browserslist-db: 1.0.11_browserslist@4.21.9 - dev: true /bser/2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -12789,7 +13105,6 @@ packages: /caniuse-lite/1.0.30001504: resolution: {integrity: sha512-5uo7eoOp2mKbWyfMXnGO9rJWOGU8duvzEiYITW+wivukL7yHH4gX9yuRaobu6El4jPxo6jKZfG+N6fB621GD/Q==} - dev: true /cardinal/2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} @@ -14087,7 +14402,6 @@ packages: dependencies: no-case: 3.0.4 tslib: 2.5.0 - dev: true /dotenv-expand/10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} @@ -14161,7 +14475,6 @@ packages: /electron-to-chromium/1.4.433: resolution: {integrity: sha512-MGO1k0w1RgrfdbLVwmXcDhHHuxCn2qRgR7dYsJvWFKDttvYPx6FNzCGG0c/fBBvzK2LDh3UV7Tt9awnHnvAAUQ==} - dev: true /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -16054,7 +16367,6 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} @@ -16087,7 +16399,6 @@ packages: /fraction.js/4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: true /fragment-cache/0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} @@ -16432,7 +16743,6 @@ packages: /glob-to-regexp/0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true /glob/7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} @@ -17859,6 +18169,11 @@ packages: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} dev: false + /js-cookie/3.0.1: + resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} + engines: {node: '>=12'} + dev: false + /js-levenshtein/1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} @@ -18433,7 +18748,6 @@ packages: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: tslib: 2.5.0 - dev: true /lowercase-keys/1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} @@ -19529,6 +19843,49 @@ packages: - babel-plugin-macros dev: false + /next/13.4.7_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==} + engines: {node: '>=16.8.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + fibers: '>= 3.1.0' + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + fibers: + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.4.7 + '@swc/helpers': 0.5.1 + busboy: 1.6.0 + caniuse-lite: 1.0.30001504 + postcss: 8.4.14 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + styled-jsx: 5.1.1_react@18.2.0 + watchpack: 2.4.0 + zod: 3.21.4 + optionalDependencies: + '@next/swc-darwin-arm64': 13.4.7 + '@next/swc-darwin-x64': 13.4.7 + '@next/swc-linux-arm64-gnu': 13.4.7 + '@next/swc-linux-arm64-musl': 13.4.7 + '@next/swc-linux-x64-gnu': 13.4.7 + '@next/swc-linux-x64-musl': 13.4.7 + '@next/swc-win32-arm64-msvc': 13.4.7 + '@next/swc-win32-ia32-msvc': 13.4.7 + '@next/swc-win32-x64-msvc': 13.4.7 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /nice-try/1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true @@ -19538,7 +19895,6 @@ packages: dependencies: lower-case: 2.0.2 tslib: 2.5.0 - dev: true /node-abort-controller/3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} @@ -19561,6 +19917,10 @@ packages: engines: {node: '>=10.5.0'} dev: false + /node-fetch-native/1.0.1: + resolution: {integrity: sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==} + dev: false + /node-fetch-native/1.1.1: resolution: {integrity: sha512-9VvspTSUp2Sxbl+9vbZTlFGq9lHwE8GDVVekxx6YsNd1YH59sb3Ba8v3Y3cD8PkLNcileGGcA21PFjVl0jzDaw==} dev: true @@ -19602,7 +19962,6 @@ packages: /node-releases/2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} - dev: true /nodemon/2.0.20: resolution: {integrity: sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==} @@ -19651,7 +20010,6 @@ packages: /normalize-range/0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - dev: true /normalize-url/4.5.1: resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} @@ -20296,7 +20654,6 @@ packages: /path-to-regexp/6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: true /path-type/3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} @@ -20598,6 +20955,23 @@ packages: yaml: 2.2.1 dev: true + /postcss-load-config/4.0.1_postcss@8.4.23: + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.23 + yaml: 2.2.1 + dev: false + /postcss-loader/7.3.0_postcss@8.4.21: resolution: {integrity: sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw==} engines: {node: '>= 14.15.0'} @@ -20737,7 +21111,6 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true /postgres-array/2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} @@ -21092,6 +21465,17 @@ packages: - utf-8-validate dev: true + /pvtsutils/1.3.2: + resolution: {integrity: sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ==} + dependencies: + tslib: 2.5.0 + dev: false + + /pvutils/1.1.3: + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} + dev: false + /qs/6.10.4: resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} engines: {node: '>=0.6'} @@ -22459,6 +22843,30 @@ packages: yargs: 15.4.1 dev: false + /snake-case/3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.5.0 + dev: false + + /snakecase-keys/3.2.1: + resolution: {integrity: sha512-CjU5pyRfwOtaOITYv5C8DzpZ8XA/ieRsDpr93HI2r6e3YInC6moZpSQbmUtg8cTk58tq2x3jcG2gv+p1IZGmMA==} + engines: {node: '>=8'} + dependencies: + map-obj: 4.3.0 + to-snake-case: 1.0.0 + dev: false + + /snakecase-keys/5.4.4: + resolution: {integrity: sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA==} + engines: {node: '>=12'} + dependencies: + map-obj: 4.3.0 + snake-case: 3.0.4 + type-fest: 2.19.0 + dev: false + /snapdragon-node/2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} @@ -23074,6 +23482,14 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /swr/1.3.0_react@18.2.0: + resolution: {integrity: sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /sync-request/6.1.0: resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} engines: {node: '>=8.0.0'} @@ -23159,6 +23575,38 @@ packages: - ts-node dev: true + /tailwindcss/3.3.2: + resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.2.12 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.18.2 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.23 + postcss-import: 15.1.0_postcss@8.4.23 + postcss-js: 4.0.1_postcss@8.4.23 + postcss-load-config: 4.0.1_postcss@8.4.23 + postcss-nested: 6.0.1_postcss@8.4.23 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + resolve: 1.22.2 + sucrase: 3.32.0 + transitivePeerDependencies: + - ts-node + dev: false + /tailwindcss/3.3.2_ts-node@10.9.1: resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==} engines: {node: '>=14.0.0'} @@ -23428,6 +23876,10 @@ packages: engines: {node: '>=4'} dev: true + /to-no-case/1.0.2: + resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} + dev: false + /to-object-path/0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} @@ -23464,6 +23916,18 @@ packages: safe-regex: 1.1.0 dev: false + /to-snake-case/1.0.0: + resolution: {integrity: sha512-joRpzBAk1Bhi2eGEYBjukEWHOe/IvclOkiJl3DtA91jV6NwQ3MwXA4FHYeqk8BNp/D8bmi9tcNbRu/SozP0jbQ==} + dependencies: + to-space-case: 1.0.0 + dev: false + + /to-space-case/1.0.0: + resolution: {integrity: sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==} + dependencies: + to-no-case: 1.0.2 + dev: false + /toggle-selection/1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} dev: false @@ -23953,6 +24417,12 @@ packages: engines: {node: '>=12.20'} hasBin: true + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: false + /ufo/1.1.0: resolution: {integrity: sha512-LQc2s/ZDMaCN3QLpa+uzHUOQ7SdV0qgv3VBXOolQGXTaaZpIur6PwUclF5nN2hNkiTRcUugXd1zFOW3FLJ135Q==} dev: true @@ -24210,7 +24680,6 @@ packages: browserslist: 4.21.9 escalade: 3.1.1 picocolors: 1.0.0 - dev: true /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -24802,7 +25271,6 @@ packages: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.10 - dev: true /wcwidth/1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -24820,6 +25288,16 @@ packages: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} + /webcrypto-core/1.7.7: + resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} + dependencies: + '@peculiar/asn1-schema': 2.3.6 + '@peculiar/json-schema': 1.1.12 + asn1js: 3.0.5 + pvtsutils: 1.3.2 + tslib: 2.5.0 + dev: false + /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -25251,6 +25729,14 @@ packages: zod: 3.20.2 dev: false + /zod-to-json-schema/3.20.2_zod@3.21.4: + resolution: {integrity: sha512-qka3UAXmVXD8z5SHkRU89UyHp8JHJW7zc8RQCpt7QloJOn6uijwkjUm8o+M/cF1IysmKc5gxac/QeDikaQMdzQ==} + peerDependencies: + zod: ^3.20.0 + dependencies: + zod: 3.21.4 + dev: false + /zod/3.20.2: resolution: {integrity: sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==} dev: false