diff --git a/.env.local.example b/.env.local.example
index 2af7c641..6a02fa98 100644
--- a/.env.local.example
+++ b/.env.local.example
@@ -1,12 +1,17 @@
-# Update these with your Supabase details from your project settings > API
-NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
+# Update these with the details of your local test instance from the Supabase CLI
+# ("API URL", "anon key", and "service_role key")
+NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
+# Update these with the details of your remote database
+SUPABASE_PROJECT_REF=
+SUPABASE_DB_PASSWORD=
+
# Update these with your Stripe credentials from https://dashboard.stripe.com/apikeys
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_1234
STRIPE_SECRET_KEY=sk_test_1234
STRIPE_WEBHOOK_SECRET=whsec_1234
-# Update this with your stable site URL only for the production environment.
-NEXT_PUBLIC_SITE_URL=https://your-deployment-url.vercel.app
+# Add NEXT_PUBLIC_SITE_URL to your Vercel environmental variables for the production environment following the example below. This defaults to http://localhost:3000 in development.
+# NEXT_PUBLIC_SITE_URL=https://your-deployment-url.vercel.app
diff --git a/.gitignore b/.gitignore
index a0b0f82d..182915c8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,3 +35,6 @@ yarn-error.log*
# editors
.vscode
+
+# certificates
+certificates
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 00000000..51c5789f
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,13 @@
+# Build artifacts
+.next/
+.turbo/
+_next/
+__tmp__/
+dist/
+node_modules/
+target/
+compiled/
+
+pnpm-lock.yaml
+
+types_db.ts
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 00000000..d8290ed7
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,6 @@
+{
+ "arrowParens": "always",
+ "singleQuote": true,
+ "tabWidth": 2,
+ "trailingComma": "none"
+}
diff --git a/README.md b/README.md
index 8600f2af..f926f689 100644
--- a/README.md
+++ b/README.md
@@ -29,12 +29,14 @@ When deploying this template, the sequence of steps is important. Follow the ste
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fnextjs-subscription-payments&env=NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY,STRIPE_SECRET_KEY&envDescription=Enter%20your%20Stripe%20API%20keys.&envLink=https%3A%2F%2Fdashboard.stripe.com%2Fapikeys&project-name=nextjs-subscription-payments&repository-name=nextjs-subscription-payments&integration-ids=oac_VqOgBHqhEoFTPzGkPd7L0iH6&external-id=https%3A%2F%2Fgithub.com%2Fvercel%2Fnextjs-subscription-payments%2Ftree%2Fmain)
-The Vercel Deployment will create a new repository with this template on your GitHub account and guide your through a new Supabase project creation. The [Supabase Vercel Deploy Integration](https://vercel.com/integrations/supabase-v2) will set up the necessary Supabase environment variables and run the [SQL migrations](./supabase/migrations/20230530034630_init.sql) to set up the Database schema on your account. You can inspect the created tables in your project's [Table editor](https://app.supabase.com/project/_/editor).
+The Vercel Deployment will create a new repository with this template on your GitHub account and guide you through a new Supabase project creation. The [Supabase Vercel Deploy Integration](https://vercel.com/integrations/supabase-v2) will set up the necessary Supabase environment variables and run the [SQL migrations](./supabase/migrations/20230530034630_init.sql) to set up the Database schema on your account. You can inspect the created tables in your project's [Table editor](https://app.supabase.com/project/_/editor).
Should the automatic setup fail, please [create a Supabase account](https://app.supabase.com/projects), and a new project if needed. In your project, navigate to the [SQL editor](https://app.supabase.com/project/_/sql) and select the "Stripe Subscriptions" starter template from the Quick start section.
### Configure Auth
+Follow [this guide](https://supabase.com/docs/guides/auth/social-login/auth-github) to set up an OAuth app with GitHub and configure Supabase to use it as an auth provider.
+
In your Supabase project, navigate to [auth > URL configuration](https://app.supabase.com/project/_/auth/url-configuration) and set your main production URL (e.g. https://your-deployment-url.vercel.app) as the site url.
Next, in your Vercel deployment settings, add a new **Production** environment variable called `NEXT_PUBLIC_SITE_URL` and set it to the same URL. Make sure to deselect preview and development environments to make sure that preview branches and local development work correctly.
@@ -45,9 +47,9 @@ If you've deployed this template via the "Deploy to Vercel" button above, you ca
Otherwise, for auth redirects (email confirmations, magic links, OAuth providers) to work correctly in deploy previews, navigate to the [auth settings](https://app.supabase.com/project/_/auth/url-configuration) and add the following wildcard URL to "Redirect URLs": `https://*-username.vercel.app/**`. You can read more about redirect wildcard patterns in the [docs](https://supabase.com/docs/guides/auth#redirect-urls-and-wildcards).
-#### [Optional] - Set up OAuth providers
+If you've deployed this template via the "Deploy to Vercel" button above, you can skip this step. The Supabase Vercel Integration will have run database migrations for you. You can check this by going to [the Table Editor for your Supabase project](https://supabase.com/dashboard/project/_/editor), and confirming there are tables with seed data.
-You can use third-party login providers like GitHub or Google. Refer to the [docs](https://supabase.io/docs/guides/auth#third-party-logins) to learn how to configure these. Once configured, you can add them to the `provider` array of the [`Auth` component](./app/signin/AuthUI.tsx) page.
+Otherwise, navigate to the [SQL Editor](https://supabase.com/dashboard/project/_/sql/new), paste the contents of [the Supabase `schema.sql` file](./schema.sql), and click RUN to initialize the database.
#### [Maybe Optional] - Set up Supabase environment variables (not needed if you installed via the Deploy Button)
@@ -122,15 +124,51 @@ vercel login
vercel link
```
-### Setting up the env vars locally
-
-Use the Vercel CLI to download the development env vars:
+If you don't intend to use a local Supabase instance for development and testing, you can use the Vercel CLI to download the development env vars:
```bash
vercel env pull .env.local
```
-Running this command will create a new `.env.local` file in your project folder. For security purposes, you will need to set the `SUPABASE_SERVICE_ROLE_KEY` manually from your [Supabase dashboard](https://app.supabase.io/) (`Settings > API`).
+Running this command will create a new `.env.local` file in your project folder. For security purposes, you will need to set the `SUPABASE_SERVICE_ROLE_KEY` manually from your [Supabase dashboard](https://app.supabase.io/) (`Settings > API`). If you are not using a local Supabase instance, you should also change the `--local` flag to `--remote` in the `supabase:generate-types` script in `package.json`.
+
+### Local development with Supabase
+
+It's highly recommended to use a local Supabase instance for development and testing. We have provided a set of custom commands for this in `package.json`.
+
+First, you will need to install [Docker](https://www.docker.com/get-started/). You should also copy `.env.local.example` to `.env.local`.
+
+Next, run the following command to start a local Supabase instance and run the migrations to set up the database schema:
+
+```bash
+# or `npm` or `yarn` instead of `pnpm`
+pnpm run supabase:start
+```
+
+The terminal output will provide you with values for the environment variables `NEXT_PUBLIC_SUPABASE_URL`, `NEXT_PUBLIC_SUPABASE_ANON_KEY`, and `SUPABASE_SERVICE_ROLE_KEY`. Copy these into your `.env.local` file.
+
+The terminal output will also provide you with a URL to access the local Supabase Studio, where you can make changes to your local database instance. (You can always find the Supabase Studio later by opening up a Docker window, navigating to `Containers` tab, and clicking the link in the `Ports` column for the corresponding container.)
+
+To link your local Supabase instance to your project, you will need to set `SUPABASE_PROJECT_REF` and `SUPABASE_DB_PASSWORD` for your remote database in your `.env.local` file. You can find these values in the [Supabase dashboard](https://supabase.com/dashboard/projects) for your project. Then, run the following command to link your local Supabase instance to your project:
+
+```bash
+pnpm run supabase:link
+```
+
+Once you've linked your project, you can make changes to the database schema in your local Supabase Studio and run the following command to generate TypeScript types to match your schema:
+
+```bash
+pnpm run supabase:generate-types
+```
+
+You can also automatically generate a migration file with all the changes you've made to your local database schema and then push the migration to your remote database with the following commands:
+
+```bash
+pnpm run supabase:generate-migration
+pnpm run supabase:migrate
+```
+
+Remember to test your changes thoroughly in your local environment before deploying them to production!
### Use the Stripe CLI to test webhooks
@@ -142,13 +180,16 @@ Next, start local webhook forwarding:
stripe listen --forward-to=localhost:3000/api/webhooks
```
-Running this Stripe command will print a webhook secret (such as, `whsec_***`) to the console. Set `STRIPE_WEBHOOK_SECRET` to this value in your `.env.local` file.
+Running this Stripe command will print a webhook secret (such as, `whsec_***`) to the console. Set `STRIPE_WEBHOOK_SECRET` to this value in your `.env.local` file. If you haven't already, you should also set `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY` and `STRIPE_SECRET_KEY` in your `.env.local` file using the **test mode**(!) keys from your Stripe dashboard.
### Install dependencies and run the Next.js client
In a separate terminal, run the following commands to install dependencies and start the development server:
```bash
+pnpm install
+pnpm run dev
+# or
npm install
npm run dev
# or
@@ -175,7 +216,3 @@ To run the project in live mode and process payments with Stripe, switch Stripe
Afterward, you will need to rebuild your production deployment for the changes to take effect. Within your project Dashboard, navigate to the "Deployments" tab, select the most recent deployment, click the overflow menu button (next to the "Visit" button) and select "Redeploy" (do NOT enable the "Use existing Build Cache" option).
To verify you are running in production mode, test checking out with the [Stripe test card](https://stripe.com/docs/testing). The test card should not work.
-
-## A note on reliability
-
-This template mirrors completed Stripe transactions to the Supabase database. This means that if the Supabase database is unavailable, the Stripe transaction will still succeed, but the Supabase database will not be updated, and the application will pass an error code back to Stripe. [By default](https://stripe.com/docs/webhooks/best-practices), Stripe will retry sending its response to the webhook for up to three days, or until the database update succeeds. This means that the Stripe transaction will eventually be reflected in the Supabase database as long as the database comes back online within three days. You may want to implement a process to automatically reconcile the Supabase database with Stripe in case of a prolonged outage.
diff --git a/app/account/ManageSubscriptionButton.tsx b/app/account/ManageSubscriptionButton.tsx
deleted file mode 100644
index 15a5a445..00000000
--- a/app/account/ManageSubscriptionButton.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-'use client';
-
-import Button from '@/components/ui/Button';
-import { postData } from '@/utils/helpers';
-
-import { Session } from '@supabase/supabase-js';
-import { useRouter } from 'next/navigation';
-
-interface Props {
- session: Session;
-}
-
-export default function ManageSubscriptionButton({ session }: Props) {
- const router = useRouter();
- const redirectToCustomerPortal = async () => {
- try {
- const { url } = await postData({
- url: '/api/create-portal-link'
- });
- router.push(url);
- } catch (error) {
- if (error) return alert((error as Error).message);
- }
- };
-
- return (
-
-
Manage your subscription on Stripe.
-
- Open customer portal
-
-
- );
-}
diff --git a/app/account/page.tsx b/app/account/page.tsx
index 3fcffaa0..7fcd819f 100644
--- a/app/account/page.tsx
+++ b/app/account/page.tsx
@@ -1,67 +1,36 @@
-import ManageSubscriptionButton from './ManageSubscriptionButton';
-import {
- getSession,
- getUserDetails,
- getSubscription
-} from '@/app/supabase-server';
-import Button from '@/components/ui/Button';
-import { Database } from '@/types_db';
-import { createServerActionClient } from '@supabase/auth-helpers-nextjs';
-import { revalidatePath } from 'next/cache';
-import { cookies } from 'next/headers';
-import Link from 'next/link';
+'use server';
+
+import CustomerPortalForm from '@/components/ui/AccountForms/CustomerPortalForm';
+import EmailForm from '@/components/ui/AccountForms/EmailForm';
+import NameForm from '@/components/ui/AccountForms/NameForm';
+import { createClient } from '@/utils/supabase/server';
import { redirect } from 'next/navigation';
-import { ReactNode } from 'react';
export default async function Account() {
- const [session, userDetails, subscription] = await Promise.all([
- getSession(),
- getUserDetails(),
- getSubscription()
- ]);
-
- const user = session?.user;
-
- if (!session) {
- return redirect('/signin');
- }
+ const supabase = createClient();
- const subscriptionPrice =
- subscription &&
- new Intl.NumberFormat('en-US', {
- style: 'currency',
- currency: subscription?.prices?.currency!,
- minimumFractionDigits: 0
- }).format((subscription?.prices?.unit_amount || 0) / 100);
+ const {
+ data: { user }
+ } = await supabase.auth.getUser();
- const updateName = async (formData: FormData) => {
- 'use server';
+ const { data: userDetails } = await supabase
+ .from('users')
+ .select('*')
+ .single();
- const newName = formData.get('name') as string;
- const supabase = createServerActionClient({ cookies });
- const session = await getSession();
- const user = session?.user;
- const { error } = await supabase
- .from('users')
- .update({ full_name: newName })
- .eq('id', user?.id);
- if (error) {
- console.log(error);
- }
- revalidatePath('/account');
- };
+ const { data: subscription, error } = await supabase
+ .from('subscriptions')
+ .select('*, prices(*, products(*))')
+ .in('status', ['trialing', 'active'])
+ .maybeSingle();
- const updateEmail = async (formData: FormData) => {
- 'use server';
+ if (error) {
+ console.log(error);
+ }
- const newEmail = formData.get('email') as string;
- const supabase = createServerActionClient({ cookies });
- const { error } = await supabase.auth.updateUser({ email: newEmail });
- if (error) {
- console.log(error);
- }
- revalidatePath('/account');
- };
+ if (!user) {
+ return redirect('/signin');
+ }
return (
@@ -76,110 +45,10 @@ export default async function Account() {
-
}
- >
-
- {subscription ? (
- `${subscriptionPrice}/${subscription?.prices?.interval}`
- ) : (
- Choose your plan
- )}
-
-
-
- 64 characters maximum
-
- {/* WARNING - In Next.js 13.4.x server actions are in alpha and should not be used in production code! */}
- Update Name
-
-
- }
- >
-
-
-
-
-
-
- We will email you to verify the change.
-
-
- {/* WARNING - In Next.js 13.4.x server actions are in alpha and should not be used in production code! */}
- Update Email
-
-
- }
- >
-
-
-
-
+
+
+
);
}
-
-interface Props {
- title: string;
- description?: string;
- footer?: ReactNode;
- children: ReactNode;
-}
-
-function Card({ title, description, footer, children }: Props) {
- return (
-
-
-
{title}
-
{description}
- {children}
-
-
- {footer}
-
-
- );
-}
diff --git a/app/api/create-checkout-session/route.ts b/app/api/create-checkout-session/route.ts
deleted file mode 100644
index 6267e527..00000000
--- a/app/api/create-checkout-session/route.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-import { cookies, headers } from 'next/headers';
-import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs';
-import { stripe } from '@/utils/stripe';
-import { createOrRetrieveCustomer } from '@/utils/supabase-admin';
-import { getURL } from '@/utils/helpers';
-import { Database } from '@/types_db';
-
-export async function POST(req: Request) {
- if (req.method === 'POST') {
- // 1. Destructure the price and quantity from the POST body
- const { price, quantity = 1, metadata = {} } = await req.json();
-
- try {
- // 2. Get the user from Supabase auth
- const supabase = createRouteHandlerClient({cookies});
- const {
- data: { user }
- } = await supabase.auth.getUser();
-
- // 3. Retrieve or create the customer in Stripe
- const customer = await createOrRetrieveCustomer({
- uuid: user?.id || '',
- email: user?.email || ''
- });
-
- // 4. Create a checkout session in Stripe
- let session;
- if (price.type === 'recurring') {
- session = await stripe.checkout.sessions.create({
- payment_method_types: ['card'],
- billing_address_collection: 'required',
- customer,
- customer_update: {
- address: 'auto'
- },
- line_items: [
- {
- price: price.id,
- quantity
- }
- ],
- mode: 'subscription',
- allow_promotion_codes: true,
- subscription_data: {
- trial_from_plan: true,
- metadata
- },
- success_url: `${getURL()}/account`,
- cancel_url: `${getURL()}/`
- });
- } else if (price.type === 'one_time') {
- session = await stripe.checkout.sessions.create({
- payment_method_types: ['card'],
- billing_address_collection: 'required',
- customer,
- customer_update: {
- address: 'auto'
- },
- line_items: [
- {
- price: price.id,
- quantity
- }
- ],
- mode: 'payment',
- allow_promotion_codes: true,
- success_url: `${getURL()}/account`,
- cancel_url: `${getURL()}/`
- });
- }
-
- if (session) {
- return new Response(JSON.stringify({ sessionId: session.id }), {
- status: 200
- });
- } else {
- return new Response(
- JSON.stringify({
- error: { statusCode: 500, message: 'Session is not defined' }
- }),
- { status: 500 }
- );
- }
- } catch (err: any) {
- console.log(err);
- return new Response(JSON.stringify(err), { status: 500 });
- }
- } else {
- return new Response('Method Not Allowed', {
- headers: { Allow: 'POST' },
- status: 405
- });
- }
-}
diff --git a/app/api/create-portal-link/route.ts b/app/api/create-portal-link/route.ts
deleted file mode 100644
index 07c41e09..00000000
--- a/app/api/create-portal-link/route.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { cookies } from 'next/headers';
-import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs';
-import { stripe } from '@/utils/stripe';
-import { createOrRetrieveCustomer } from '@/utils/supabase-admin';
-import { getURL } from '@/utils/helpers';
-import { Database } from '@/types_db';
-
-export async function POST(req: Request) {
- if (req.method === 'POST') {
- try {
- const supabase = createRouteHandlerClient({cookies});
- const {
- data: { user }
- } = await supabase.auth.getUser();
-
- if (!user) throw Error('Could not get user');
- const customer = await createOrRetrieveCustomer({
- uuid: user.id || '',
- email: user.email || ''
- });
-
- if (!customer) throw Error('Could not get customer');
- const { url } = await stripe.billingPortal.sessions.create({
- customer,
- return_url: `${getURL()}/account`
- });
- return new Response(JSON.stringify({ url }), {
- status: 200
- });
- } catch (err: any) {
- console.log(err);
- return new Response(
- JSON.stringify({ error: { statusCode: 500, message: err.message } }),
- {
- status: 500
- }
- );
- }
- } else {
- return new Response('Method Not Allowed', {
- headers: { Allow: 'POST' },
- status: 405
- });
- }
-}
diff --git a/app/api/webhooks/route.ts b/app/api/webhooks/route.ts
index a5bdb963..8371d42e 100644
--- a/app/api/webhooks/route.ts
+++ b/app/api/webhooks/route.ts
@@ -1,16 +1,20 @@
import Stripe from 'stripe';
-import { stripe } from '@/utils/stripe';
+import { stripe } from '@/utils/stripe/config';
import {
upsertProductRecord,
upsertPriceRecord,
- manageSubscriptionStatusChange
-} from '@/utils/supabase-admin';
+ manageSubscriptionStatusChange,
+ deleteProductRecord,
+ deletePriceRecord
+} from '@/utils/supabase/admin';
const relevantEvents = new Set([
'product.created',
'product.updated',
+ 'product.deleted',
'price.created',
'price.updated',
+ 'price.deleted',
'checkout.session.completed',
'customer.subscription.created',
'customer.subscription.updated',
@@ -24,8 +28,10 @@ export async function POST(req: Request) {
let event: Stripe.Event;
try {
- if (!sig || !webhookSecret) return;
+ if (!sig || !webhookSecret)
+ return new Response('Webhook secret not found.', { status: 400 });
event = stripe.webhooks.constructEvent(body, sig, webhookSecret);
+ console.log(`🔔 Webhook received: ${event.type}`);
} catch (err: any) {
console.log(`❌ Error message: ${err.message}`);
return new Response(`Webhook Error: ${err.message}`, { status: 400 });
@@ -42,6 +48,12 @@ export async function POST(req: Request) {
case 'price.updated':
await upsertPriceRecord(event.data.object as Stripe.Price);
break;
+ case 'price.deleted':
+ await deletePriceRecord(event.data.object as Stripe.Price);
+ break;
+ case 'product.deleted':
+ await deleteProductRecord(event.data.object as Stripe.Product);
+ break;
case 'customer.subscription.created':
case 'customer.subscription.updated':
case 'customer.subscription.deleted':
@@ -69,12 +81,16 @@ export async function POST(req: Request) {
} catch (error) {
console.log(error);
return new Response(
- 'Webhook handler failed. View your nextjs function logs.',
+ 'Webhook handler failed. View your Next.js function logs.',
{
status: 400
}
);
}
+ } else {
+ return new Response(`Unsupported event type: ${event.type}`, {
+ status: 400
+ });
}
return new Response(JSON.stringify({ received: true }));
}
diff --git a/app/auth/callback/route.ts b/app/auth/callback/route.ts
index 8f6ff5fa..8f4c9822 100644
--- a/app/auth/callback/route.ts
+++ b/app/auth/callback/route.ts
@@ -1,19 +1,36 @@
-import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs'
-import { cookies } from 'next/headers'
-import { NextResponse } from 'next/server'
-
-import type { NextRequest } from 'next/server'
-import type { Database } from '@/types_db'
+import { createClient } from '@/utils/supabase/server';
+import { NextResponse } from 'next/server';
+import { NextRequest } from 'next/server';
+import { getErrorRedirect, getStatusRedirect } from '@/utils/helpers';
export async function GET(request: NextRequest) {
- const requestUrl = new URL(request.url)
- const code = requestUrl.searchParams.get('code')
+ // The `/auth/callback` route is required for the server-side auth flow implemented
+ // by the `@supabase/ssr` package. It exchanges an auth code for the user's session.
+ const requestUrl = new URL(request.url);
+ const code = requestUrl.searchParams.get('code');
if (code) {
- const supabase = createRouteHandlerClient({ cookies })
- await supabase.auth.exchangeCodeForSession(code)
+ const supabase = createClient();
+
+ const { error } = await supabase.auth.exchangeCodeForSession(code);
+
+ if (error) {
+ return NextResponse.redirect(
+ getErrorRedirect(
+ `${requestUrl.origin}/signin`,
+ error.name,
+ "Sorry, we weren't able to log you in. Please try again."
+ )
+ );
+ }
}
// URL to redirect to after sign in process completes
- return NextResponse.redirect(requestUrl.origin)
-}
\ No newline at end of file
+ return NextResponse.redirect(
+ getStatusRedirect(
+ `${requestUrl.origin}/account`,
+ 'Success!',
+ 'You are now signed in.'
+ )
+ );
+}
diff --git a/app/auth/reset_password/route.ts b/app/auth/reset_password/route.ts
new file mode 100644
index 00000000..f1b0147a
--- /dev/null
+++ b/app/auth/reset_password/route.ts
@@ -0,0 +1,36 @@
+import { createClient } from '@/utils/supabase/server';
+import { NextResponse } from 'next/server';
+import { NextRequest } from 'next/server';
+import { getErrorRedirect, getStatusRedirect } from '@/utils/helpers';
+
+export async function GET(request: NextRequest) {
+ // The `/auth/callback` route is required for the server-side auth flow implemented
+ // by the `@supabase/ssr` package. It exchanges an auth code for the user's session.
+ const requestUrl = new URL(request.url);
+ const code = requestUrl.searchParams.get('code');
+
+ if (code) {
+ const supabase = createClient();
+
+ const { error } = await supabase.auth.exchangeCodeForSession(code);
+
+ if (error) {
+ return NextResponse.redirect(
+ getErrorRedirect(
+ `${requestUrl.origin}/signin/forgot_password`,
+ error.name,
+ "Sorry, we weren't able to log you in. Please try again."
+ )
+ );
+ }
+ }
+
+ // URL to redirect to after sign in process completes
+ return NextResponse.redirect(
+ getStatusRedirect(
+ `${requestUrl.origin}/signin/update_password`,
+ 'You are now signed in.',
+ 'Please enter a new password for your account.'
+ )
+ );
+}
diff --git a/app/layout.tsx b/app/layout.tsx
index c793313b..e5f55716 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,7 +1,11 @@
-import SupabaseProvider from './supabase-provider';
+'use server';
+
+import { Metadata } from 'next';
import Footer from '@/components/ui/Footer';
import Navbar from '@/components/ui/Navbar';
-import { PropsWithChildren } from 'react';
+import { Toaster } from '@/components/ui/Toasts/toaster';
+import { PropsWithChildren, Suspense } from 'react';
+import { getURL } from '@/utils/helpers';
import 'styles/main.css';
const meta = {
@@ -10,36 +14,41 @@ const meta = {
cardImage: '/og.png',
robots: 'follow, index',
favicon: '/favicon.ico',
- url: 'https://subscription-starter.vercel.app',
- type: 'website'
+ url: getURL()
};
-export const metadata = {
- title: meta.title,
- description: meta.description,
- cardImage: meta.cardImage,
- robots: meta.robots,
- favicon: meta.favicon,
- url: meta.url,
- type: meta.type,
- openGraph: {
- url: meta.url,
- title: meta.title,
- description: meta.description,
- cardImage: meta.cardImage,
- type: meta.type,
- site_name: meta.title
- },
- twitter: {
- card: 'summary_large_image',
- site: '@vercel',
+export async function generateMetadata(): Promise {
+ return {
title: meta.title,
description: meta.description,
- cardImage: meta.cardImage
- }
-};
+ referrer: 'origin-when-cross-origin',
+ keywords: ['Vercel', 'Supabase', 'Next.js', 'Stripe', 'Subscription'],
+ authors: [{ name: 'Vercel', url: 'https://vercel.com/' }],
+ creator: 'Vercel',
+ publisher: 'Vercel',
+ robots: meta.robots,
+ icons: { icon: meta.favicon },
+ metadataBase: new URL(meta.url),
+ openGraph: {
+ url: meta.url,
+ title: meta.title,
+ description: meta.description,
+ images: [meta.cardImage],
+ type: 'website',
+ siteName: meta.title
+ },
+ twitter: {
+ card: 'summary_large_image',
+ site: '@Vercel',
+ creator: '@Vercel',
+ title: meta.title,
+ description: meta.description,
+ images: [meta.cardImage]
+ }
+ };
+}
-export default function RootLayout({
+export default async function RootLayout({
// Layouts must accept a children prop.
// This will be populated with nested layouts or pages
children
@@ -47,17 +56,17 @@ export default function RootLayout({
return (
-
- {/* @ts-expect-error */}
-
-
- {children}
-
-
-
+
+
+ {children}
+
+
+
+
+
);
diff --git a/app/page.tsx b/app/page.tsx
index f1b2dd22..936dbd6e 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,22 +1,35 @@
-import Pricing from '@/components/Pricing';
-import {
- getSession,
- getSubscription,
- getActiveProductsWithPrices
-} from '@/app/supabase-server';
+import Pricing from '@/components/ui/Pricing/Pricing';
+import { createClient } from '@/utils/supabase/server';
export default async function PricingPage() {
- const [session, products, subscription] = await Promise.all([
- getSession(),
- getActiveProductsWithPrices(),
- getSubscription()
- ]);
+ const supabase = createClient();
+
+ const {
+ data: { user }
+ } = await supabase.auth.getUser();
+
+ const { data: subscription, error } = await supabase
+ .from('subscriptions')
+ .select('*, prices(*, products(*))')
+ .in('status', ['trialing', 'active'])
+ .maybeSingle();
+
+ if (error) {
+ console.log(error);
+ }
+
+ const { data: products } = await supabase
+ .from('products')
+ .select('*, prices(*)')
+ .eq('active', true)
+ .eq('prices.active', true)
+ .order('metadata->index')
+ .order('unit_amount', { referencedTable: 'prices' });
return (
);
diff --git a/app/signin/AuthUI.tsx b/app/signin/AuthUI.tsx
deleted file mode 100644
index f0337618..00000000
--- a/app/signin/AuthUI.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-'use client';
-
-import { useSupabase } from '@/app/supabase-provider';
-import { getURL } from '@/utils/helpers';
-import { Auth } from '@supabase/auth-ui-react';
-import { ThemeSupa } from '@supabase/auth-ui-shared';
-
-export default function AuthUI() {
- const { supabase } = useSupabase();
- return (
-
- );
-}
diff --git a/app/signin/[id]/page.tsx b/app/signin/[id]/page.tsx
new file mode 100644
index 00000000..f9a4e8ba
--- /dev/null
+++ b/app/signin/[id]/page.tsx
@@ -0,0 +1,113 @@
+'use server';
+
+import Logo from '@/components/icons/Logo';
+import { createClient } from '@/utils/supabase/server';
+import { cookies } from 'next/headers';
+import { redirect } from 'next/navigation';
+import {
+ getAuthTypes,
+ getViewTypes,
+ getDefaultSignInView,
+ getRedirectMethod
+} from '@/utils/auth-helpers/settings';
+import Card from '@/components/ui/Card';
+import PasswordSignIn from '@/components/ui/AuthForms/PasswordSignIn';
+import EmailSignIn from '@/components/ui/AuthForms/EmailSignIn';
+import Separator from '@/components/ui/AuthForms/Separator';
+import OauthSignIn from '@/components/ui/AuthForms/OauthSignIn';
+import ForgotPassword from '@/components/ui/AuthForms/ForgotPassword';
+import UpdatePassword from '@/components/ui/AuthForms/UpdatePassword';
+import SignUp from '@/components/ui/AuthForms/Signup';
+
+export default async function SignIn({
+ params,
+ searchParams
+}: {
+ params: { id: string };
+ searchParams: { disable_button: boolean };
+}) {
+ const { allowOauth, allowEmail, allowPassword } = getAuthTypes();
+ const viewTypes = getViewTypes();
+ const redirectMethod = getRedirectMethod();
+
+ // Declare 'viewProp' and initialize with the default value
+ let viewProp: string;
+
+ // Assign url id to 'viewProp' if it's a valid string and ViewTypes includes it
+ if (typeof params.id === 'string' && viewTypes.includes(params.id)) {
+ viewProp = params.id;
+ } else {
+ const preferredSignInView =
+ cookies().get('preferredSignInView')?.value || null;
+ viewProp = getDefaultSignInView(preferredSignInView);
+ return redirect(`/signin/${viewProp}`);
+ }
+
+ // Check if the user is already logged in and redirect to the account page if so
+ const supabase = createClient();
+ const {
+ data: { session }
+ } = await supabase.auth.getSession();
+
+ if (session && viewProp !== 'update_password') {
+ return redirect('/');
+ } else if (!session && viewProp === 'update_password') {
+ return redirect('/signin');
+ }
+
+ return (
+
+
+
+
+
+
+ {viewProp === 'password_signin' && (
+
+ )}
+ {viewProp === 'email_signin' && (
+
+ )}
+ {viewProp === 'forgot_password' && (
+
+ )}
+ {viewProp === 'update_password' && (
+
+ )}
+ {viewProp === 'signup' && (
+
+ )}
+ {viewProp !== 'update_password' &&
+ viewProp !== 'signup' &&
+ allowOauth && (
+ <>
+
+
+ >
+ )}
+
+
+
+ );
+}
diff --git a/app/signin/page.tsx b/app/signin/page.tsx
index 2ecac81b..98d7a384 100644
--- a/app/signin/page.tsx
+++ b/app/signin/page.tsx
@@ -1,24 +1,11 @@
-import { getSession } from '@/app/supabase-server';
-import AuthUI from './AuthUI';
-
import { redirect } from 'next/navigation';
-import Logo from '@/components/icons/Logo';
-
-export default async function SignIn() {
- const session = await getSession();
+import { getDefaultSignInView } from '@/utils/auth-helpers/settings';
+import { cookies } from 'next/headers';
- if (session) {
- return redirect('/account');
- }
+export default function SignIn() {
+ const preferredSignInView =
+ cookies().get('preferredSignInView')?.value || null;
+ const defaultView = getDefaultSignInView(preferredSignInView);
- return (
-
- );
+ return redirect(`/signin/${defaultView}`);
}
diff --git a/app/supabase-provider.tsx b/app/supabase-provider.tsx
deleted file mode 100644
index 84feff27..00000000
--- a/app/supabase-provider.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-'use client';
-
-import type { Database } from '@/types_db';
-import { createPagesBrowserClient } from '@supabase/auth-helpers-nextjs';
-import type { SupabaseClient } from '@supabase/auth-helpers-nextjs';
-import { useRouter } from 'next/navigation';
-import { createContext, useContext, useEffect, useState } from 'react';
-
-type SupabaseContext = {
- supabase: SupabaseClient;
-};
-
-const Context = createContext(undefined);
-
-export default function SupabaseProvider({
- children
-}: {
- children: React.ReactNode;
-}) {
- const [supabase] = useState(() => createPagesBrowserClient());
- const router = useRouter();
-
- useEffect(() => {
- const {
- data: { subscription }
- } = supabase.auth.onAuthStateChange((event) => {
- if (event === 'SIGNED_IN') router.refresh();
- });
-
- return () => {
- subscription.unsubscribe();
- };
- }, [router, supabase]);
-
- return (
-
- <>{children}>
-
- );
-}
-
-export const useSupabase = () => {
- const context = useContext(Context);
-
- if (context === undefined) {
- throw new Error('useSupabase must be used inside SupabaseProvider');
- }
-
- return context;
-};
diff --git a/app/supabase-server.ts b/app/supabase-server.ts
deleted file mode 100644
index 444f6ddd..00000000
--- a/app/supabase-server.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { Database } from '@/types_db';
-import { createServerComponentClient } from '@supabase/auth-helpers-nextjs';
-import { cookies } from 'next/headers';
-import { cache } from 'react';
-
-export const createServerSupabaseClient = cache(() =>
- createServerComponentClient({ cookies })
-);
-
-export async function getSession() {
- const supabase = createServerSupabaseClient();
- try {
- const {
- data: { session }
- } = await supabase.auth.getSession();
- return session;
- } catch (error) {
- console.error('Error:', error);
- return null;
- }
-}
-
-export async function getUserDetails() {
- const supabase = createServerSupabaseClient();
- try {
- const { data: userDetails } = await supabase
- .from('users')
- .select('*')
- .single();
- return userDetails;
- } catch (error) {
- console.error('Error:', error);
- return null;
- }
-}
-
-export async function getSubscription() {
- const supabase = createServerSupabaseClient();
- try {
- const { data: subscription } = await supabase
- .from('subscriptions')
- .select('*, prices(*, products(*))')
- .in('status', ['trialing', 'active'])
- .maybeSingle()
- .throwOnError();
- return subscription;
- } catch (error) {
- console.error('Error:', error);
- return null;
- }
-}
-
-export const getActiveProductsWithPrices = async () => {
- const supabase = createServerSupabaseClient();
- const { data, error } = await supabase
- .from('products')
- .select('*, prices(*)')
- .eq('active', true)
- .eq('prices.active', true)
- .order('metadata->index')
- .order('unit_amount', { foreignTable: 'prices' });
-
- if (error) {
- console.log(error.message);
- }
- return data ?? [];
-};
diff --git a/components.json b/components.json
new file mode 100644
index 00000000..ba2a62e5
--- /dev/null
+++ b/components.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "default",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.js",
+ "css": "styles/main.css",
+ "baseColor": "zinc",
+ "cssVariables": false
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/utils/cn"
+ }
+}
diff --git a/components/Pricing.tsx b/components/Pricing.tsx
deleted file mode 100644
index 56bf65a4..00000000
--- a/components/Pricing.tsx
+++ /dev/null
@@ -1,317 +0,0 @@
-'use client';
-
-import Button from '@/components/ui/Button';
-import { Database } from '@/types_db';
-import { postData } from '@/utils/helpers';
-import { getStripe } from '@/utils/stripe-client';
-import { Session, User } from '@supabase/supabase-js';
-import cn from 'classnames';
-import { useRouter } from 'next/navigation';
-import { useState } from 'react';
-
-type Subscription = Database['public']['Tables']['subscriptions']['Row'];
-type Product = Database['public']['Tables']['products']['Row'];
-type Price = Database['public']['Tables']['prices']['Row'];
-interface ProductWithPrices extends Product {
- prices: Price[];
-}
-interface PriceWithProduct extends Price {
- products: Product | null;
-}
-interface SubscriptionWithProduct extends Subscription {
- prices: PriceWithProduct | null;
-}
-
-interface Props {
- session: Session | null;
- user: User | null | undefined;
- products: ProductWithPrices[];
- subscription: SubscriptionWithProduct | null;
-}
-
-type BillingInterval = 'lifetime' | 'year' | 'month';
-
-export default function Pricing({
- session,
- user,
- products,
- subscription
-}: Props) {
- const intervals = Array.from(
- new Set(
- products.flatMap((product) =>
- product?.prices?.map((price) => price?.interval)
- )
- )
- );
- const router = useRouter();
- const [billingInterval, setBillingInterval] =
- useState('month');
- const [priceIdLoading, setPriceIdLoading] = useState();
-
- const handleCheckout = async (price: Price) => {
- setPriceIdLoading(price.id);
- if (!user) {
- return router.push('/signin');
- }
- if (subscription) {
- return router.push('/account');
- }
- try {
- const { sessionId } = await postData({
- url: '/api/create-checkout-session',
- data: { price }
- });
-
- const stripe = await getStripe();
- stripe?.redirectToCheckout({ sessionId });
- } catch (error) {
- return alert((error as Error)?.message);
- } finally {
- setPriceIdLoading(undefined);
- }
- };
-
- if (!products.length)
- return (
-
- );
-
- if (products.length === 1)
- return (
-
-
-
-
- Pricing Plans
-
-
- Start building for free, then add a site plan to go live. Account
- plans unlock additional features.
-
-
-
-
- {products[0].name}
-
-
-
-
- {products[0].prices?.map((price) => {
- const priceString =
- price.unit_amount &&
- new Intl.NumberFormat('en-US', {
- style: 'currency',
- currency: price.currency!,
- minimumFractionDigits: 0
- }).format(price.unit_amount / 100);
-
- return (
-
-
-
-
- {priceString}
-
-
- /{price.interval}
-
-
-
{price.description}
-
handleCheckout(price)}
- className="block w-full py-2 mt-12 text-sm font-semibold text-center text-white rounded-md hover:bg-zinc-900 "
- >
- {products[0].name ===
- subscription?.prices?.products?.name
- ? 'Manage'
- : 'Subscribe'}
-
-
-
- );
- })}
-
-
-
-
-
- );
-
- return (
-
-
-
-
- Pricing Plans
-
-
- Start building for free, then add a site plan to go live. Account
- plans unlock additional features.
-
-
- {intervals.includes('month') && (
- setBillingInterval('month')}
- type="button"
- className={`${
- billingInterval === 'month'
- ? 'relative w-1/2 bg-zinc-700 border-zinc-800 shadow-sm text-white'
- : 'ml-0.5 relative w-1/2 border border-transparent text-zinc-400'
- } rounded-md m-1 py-2 text-sm font-medium whitespace-nowrap focus:outline-none focus:ring-2 focus:ring-pink-500 focus:ring-opacity-50 focus:z-10 sm:w-auto sm:px-8`}
- >
- Monthly billing
-
- )}
- {intervals.includes('year') && (
- setBillingInterval('year')}
- type="button"
- className={`${
- billingInterval === 'year'
- ? 'relative w-1/2 bg-zinc-700 border-zinc-800 shadow-sm text-white'
- : 'ml-0.5 relative w-1/2 border border-transparent text-zinc-400'
- } rounded-md m-1 py-2 text-sm font-medium whitespace-nowrap focus:outline-none focus:ring-2 focus:ring-pink-500 focus:ring-opacity-50 focus:z-10 sm:w-auto sm:px-8`}
- >
- Yearly billing
-
- )}
-
-
-
- {products.map((product) => {
- const price = product?.prices?.find(
- (price) => price.interval === billingInterval
- );
- if (!price) return null;
- const priceString = new Intl.NumberFormat('en-US', {
- style: 'currency',
- currency: price.currency!,
- minimumFractionDigits: 0
- }).format((price?.unit_amount || 0) / 100);
- return (
-
-
-
- {product.name}
-
-
{product.description}
-
-
- {priceString}
-
-
- /{billingInterval}
-
-
-
handleCheckout(price)}
- className="block w-full py-2 mt-8 text-sm font-semibold text-center text-white rounded-md hover:bg-zinc-900"
- >
- {subscription ? 'Manage' : 'Subscribe'}
-
-
-
- );
- })}
-
-
-
-
- );
-}
-
-function LogoCloud() {
- return (
-
-
- Brought to you by
-
-
-
- );
-}
diff --git a/components/icons/GitHub.tsx b/components/icons/GitHub.tsx
index b933c6a2..b872841e 100644
--- a/components/icons/GitHub.tsx
+++ b/components/icons/GitHub.tsx
@@ -6,6 +6,7 @@ const GitHub = ({ ...props }) => {
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
+ {...props}
>
(
+const Logo = ({ ...props }) => (
diff --git a/components/ui/AccountForms/CustomerPortalForm.tsx b/components/ui/AccountForms/CustomerPortalForm.tsx
new file mode 100644
index 00000000..2fc1d7c4
--- /dev/null
+++ b/components/ui/AccountForms/CustomerPortalForm.tsx
@@ -0,0 +1,77 @@
+'use client';
+
+import Button from '@/components/ui/Button';
+import { useRouter, usePathname } from 'next/navigation';
+import { useState } from 'react';
+import { createStripePortal } from '@/utils/stripe/server';
+import Link from 'next/link';
+import Card from '@/components/ui/Card';
+import { Tables } from '@/types_db';
+
+type Subscription = Tables<'subscriptions'>;
+type Price = Tables<'prices'>;
+type Product = Tables<'products'>;
+
+type SubscriptionWithPriceAndProduct = Subscription & {
+ prices:
+ | (Price & {
+ products: Product | null;
+ })
+ | null;
+};
+
+interface Props {
+ subscription: SubscriptionWithPriceAndProduct | null;
+}
+
+export default function CustomerPortalForm({ subscription }: Props) {
+ const router = useRouter();
+ const currentPath = usePathname();
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ const subscriptionPrice =
+ subscription &&
+ new Intl.NumberFormat('en-US', {
+ style: 'currency',
+ currency: subscription?.prices?.currency!,
+ minimumFractionDigits: 0
+ }).format((subscription?.prices?.unit_amount || 0) / 100);
+
+ const handleStripePortalRequest = async () => {
+ setIsSubmitting(true);
+ const redirectUrl = await createStripePortal(currentPath);
+ setIsSubmitting(false);
+ return router.push(redirectUrl);
+ };
+
+ return (
+
+ Manage your subscription on Stripe.
+
+ Open customer portal
+
+
+ }
+ >
+
+ {subscription ? (
+ `${subscriptionPrice}/${subscription?.prices?.interval}`
+ ) : (
+ Choose your plan
+ )}
+
+
+ );
+}
diff --git a/components/ui/AccountForms/EmailForm.tsx b/components/ui/AccountForms/EmailForm.tsx
new file mode 100644
index 00000000..b7e05aa3
--- /dev/null
+++ b/components/ui/AccountForms/EmailForm.tsx
@@ -0,0 +1,64 @@
+'use client';
+
+import Button from '@/components/ui/Button';
+import Card from '@/components/ui/Card';
+import { updateEmail } from '@/utils/auth-helpers/server';
+import { handleRequest } from '@/utils/auth-helpers/client';
+import { useRouter } from 'next/navigation';
+import { useState } from 'react';
+
+export default function EmailForm({
+ userEmail
+}: {
+ userEmail: string | undefined;
+}) {
+ const router = useRouter();
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ setIsSubmitting(true);
+ // Check if the new email is the same as the old email
+ if (e.currentTarget.newEmail.value === userEmail) {
+ e.preventDefault();
+ setIsSubmitting(false);
+ return;
+ }
+ handleRequest(e, updateEmail, router);
+ setIsSubmitting(false);
+ };
+
+ return (
+
+
+ We will email you to verify the change.
+
+
+ Update Email
+
+
+ }
+ >
+
+
+
+
+ );
+}
diff --git a/components/ui/AccountForms/NameForm.tsx b/components/ui/AccountForms/NameForm.tsx
new file mode 100644
index 00000000..269fac55
--- /dev/null
+++ b/components/ui/AccountForms/NameForm.tsx
@@ -0,0 +1,58 @@
+'use client';
+
+import Button from '@/components/ui/Button';
+import Card from '@/components/ui/Card';
+import { updateName } from '@/utils/auth-helpers/server';
+import { handleRequest } from '@/utils/auth-helpers/client';
+import { useRouter } from 'next/navigation';
+import { useState } from 'react';
+
+export default function NameForm({ userName }: { userName: string }) {
+ const router = useRouter();
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ setIsSubmitting(true);
+ // Check if the new name is the same as the old name
+ if (e.currentTarget.fullName.value === userName) {
+ e.preventDefault();
+ setIsSubmitting(false);
+ return;
+ }
+ handleRequest(e, updateName, router);
+ setIsSubmitting(false);
+ };
+
+ return (
+
+ 64 characters maximum
+
+ Update Name
+
+
+ }
+ >
+
+
+
+
+ );
+}
diff --git a/components/ui/AuthForms/EmailSignIn.tsx b/components/ui/AuthForms/EmailSignIn.tsx
new file mode 100644
index 00000000..1860f729
--- /dev/null
+++ b/components/ui/AuthForms/EmailSignIn.tsx
@@ -0,0 +1,79 @@
+'use client';
+
+import Button from '@/components/ui/Button';
+import Link from 'next/link';
+import { signInWithEmail } from '@/utils/auth-helpers/server';
+import { handleRequest } from '@/utils/auth-helpers/client';
+import { useRouter } from 'next/navigation';
+import { useState } from 'react';
+
+// Define prop type with allowPassword boolean
+interface EmailSignInProps {
+ allowPassword: boolean;
+ redirectMethod: string;
+ disableButton?: boolean;
+}
+
+export default function EmailSignIn({
+ allowPassword,
+ redirectMethod,
+ disableButton
+}: EmailSignInProps) {
+ const router = redirectMethod === 'client' ? useRouter() : null;
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ setIsSubmitting(true); // Disable the button while the request is being handled
+ await handleRequest(e, signInWithEmail, router);
+ setIsSubmitting(false);
+ };
+
+ return (
+
+
+ {allowPassword && (
+ <>
+
+
+ Sign in with email and password
+
+
+
+
+ Don't have an account? Sign up
+
+
+ >
+ )}
+
+ );
+}
diff --git a/components/ui/AuthForms/ForgotPassword.tsx b/components/ui/AuthForms/ForgotPassword.tsx
new file mode 100644
index 00000000..bdf8f6b7
--- /dev/null
+++ b/components/ui/AuthForms/ForgotPassword.tsx
@@ -0,0 +1,82 @@
+'use client';
+
+import Button from '@/components/ui/Button';
+import Link from 'next/link';
+import { requestPasswordUpdate } from '@/utils/auth-helpers/server';
+import { handleRequest } from '@/utils/auth-helpers/client';
+import { useRouter } from 'next/navigation';
+import { useState } from 'react';
+
+// Define prop type with allowEmail boolean
+interface ForgotPasswordProps {
+ allowEmail: boolean;
+ redirectMethod: string;
+ disableButton?: boolean;
+}
+
+export default function ForgotPassword({
+ allowEmail,
+ redirectMethod,
+ disableButton
+}: ForgotPasswordProps) {
+ const router = redirectMethod === 'client' ? useRouter() : null;
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ setIsSubmitting(true); // Disable the button while the request is being handled
+ await handleRequest(e, requestPasswordUpdate, router);
+ setIsSubmitting(false);
+ };
+
+ return (
+
+
+
+
+ Sign in with email and password
+
+
+ {allowEmail && (
+
+
+ Sign in via magic link
+
+
+ )}
+
+
+ Don't have an account? Sign up
+
+
+
+ );
+}
diff --git a/components/ui/AuthForms/OauthSignIn.tsx b/components/ui/AuthForms/OauthSignIn.tsx
new file mode 100644
index 00000000..8e5e2d54
--- /dev/null
+++ b/components/ui/AuthForms/OauthSignIn.tsx
@@ -0,0 +1,49 @@
+'use client';
+
+import Button from '@/components/ui/Button';
+import { signInWithOAuth } from '@/utils/auth-helpers/client';
+import { type Provider } from '@supabase/supabase-js';
+import { Github } from 'lucide-react';
+import { useState } from 'react';
+
+type OAuthProviders = {
+ name: Provider;
+ icon: JSX.Element;
+};
+
+export default function OauthSignIn() {
+ const oAuthProviders: OAuthProviders[] = [
+ { name: 'github', icon: }
+ /* Add desired OAuth providers here */
+ ];
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ setIsSubmitting(true); // Disable the button while the request is being handled
+ await signInWithOAuth(e);
+ setIsSubmitting(false);
+ };
+
+ return (
+
+ {oAuthProviders.map((provider) => (
+
+ ))}
+
+ );
+}
diff --git a/components/ui/AuthForms/PasswordSignIn.tsx b/components/ui/AuthForms/PasswordSignIn.tsx
new file mode 100644
index 00000000..3ec8297d
--- /dev/null
+++ b/components/ui/AuthForms/PasswordSignIn.tsx
@@ -0,0 +1,88 @@
+'use client';
+
+import Button from '@/components/ui/Button';
+import Link from 'next/link';
+import { signInWithPassword } from '@/utils/auth-helpers/server';
+import { handleRequest } from '@/utils/auth-helpers/client';
+import { useRouter } from 'next/navigation';
+import React, { useState } from 'react';
+
+// Define prop type with allowEmail boolean
+interface PasswordSignInProps {
+ allowEmail: boolean;
+ redirectMethod: string;
+}
+
+export default function PasswordSignIn({
+ allowEmail,
+ redirectMethod
+}: PasswordSignInProps) {
+ const router = redirectMethod === 'client' ? useRouter() : null;
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ setIsSubmitting(true); // Disable the button while the request is being handled
+ await handleRequest(e, signInWithPassword, router);
+ setIsSubmitting(false);
+ };
+
+ return (
+
+
+
+
+ Forgot your password?
+
+
+ {allowEmail && (
+
+
+ Sign in via magic link
+
+
+ )}
+
+
+ Don't have an account? Sign up
+
+
+
+ );
+}
diff --git a/components/ui/AuthForms/Separator.tsx b/components/ui/AuthForms/Separator.tsx
new file mode 100644
index 00000000..d9c7cfc6
--- /dev/null
+++ b/components/ui/AuthForms/Separator.tsx
@@ -0,0 +1,17 @@
+interface SeparatorProps {
+ text: string;
+}
+
+export default function Separator({ text }: SeparatorProps) {
+ return (
+
+ );
+}
diff --git a/components/ui/AuthForms/Signup.tsx b/components/ui/AuthForms/Signup.tsx
new file mode 100644
index 00000000..cd98f040
--- /dev/null
+++ b/components/ui/AuthForms/Signup.tsx
@@ -0,0 +1,82 @@
+'use client';
+
+import Button from '@/components/ui/Button';
+import React from 'react';
+import Link from 'next/link';
+import { signUp } from '@/utils/auth-helpers/server';
+import { handleRequest } from '@/utils/auth-helpers/client';
+import { useRouter } from 'next/navigation';
+import { useState } from 'react';
+
+// Define prop type with allowEmail boolean
+interface SignUpProps {
+ allowEmail: boolean;
+ redirectMethod: string;
+}
+
+export default function SignUp({ allowEmail, redirectMethod }: SignUpProps) {
+ const router = redirectMethod === 'client' ? useRouter() : null;
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ setIsSubmitting(true); // Disable the button while the request is being handled
+ await handleRequest(e, signUp, router);
+ setIsSubmitting(false);
+ };
+
+ return (
+
+
+
Already have an account?
+
+
+ Sign in with email and password
+
+
+ {allowEmail && (
+
+
+ Sign in via magic link
+
+
+ )}
+
+ );
+}
diff --git a/components/ui/AuthForms/UpdatePassword.tsx b/components/ui/AuthForms/UpdatePassword.tsx
new file mode 100644
index 00000000..cd51488e
--- /dev/null
+++ b/components/ui/AuthForms/UpdatePassword.tsx
@@ -0,0 +1,65 @@
+'use client';
+
+import Button from '@/components/ui/Button';
+import { updatePassword } from '@/utils/auth-helpers/server';
+import { handleRequest } from '@/utils/auth-helpers/client';
+import { useRouter } from 'next/navigation';
+import React, { useState } from 'react';
+
+interface UpdatePasswordProps {
+ redirectMethod: string;
+}
+
+export default function UpdatePassword({
+ redirectMethod
+}: UpdatePasswordProps) {
+ const router = redirectMethod === 'client' ? useRouter() : null;
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ setIsSubmitting(true); // Disable the button while the request is being handled
+ await handleRequest(e, updatePassword, router);
+ setIsSubmitting(false);
+ };
+
+ return (
+
+ );
+}
diff --git a/components/ui/Button/Button.tsx b/components/ui/Button/Button.tsx
index 8a0a98fd..cb914853 100644
--- a/components/ui/Button/Button.tsx
+++ b/components/ui/Button/Button.tsx
@@ -61,5 +61,6 @@ const Button = forwardRef((props, buttonRef) => {
);
});
+Button.displayName = 'Button';
export default Button;
diff --git a/components/ui/Card/Card.tsx b/components/ui/Card/Card.tsx
new file mode 100644
index 00000000..f78a2861
--- /dev/null
+++ b/components/ui/Card/Card.tsx
@@ -0,0 +1,25 @@
+import { ReactNode } from 'react';
+
+interface Props {
+ title: string;
+ description?: string;
+ footer?: ReactNode;
+ children: ReactNode;
+}
+
+export default function Card({ title, description, footer, children }: Props) {
+ return (
+
+
+
{title}
+
{description}
+ {children}
+
+ {footer && (
+
+ {footer}
+
+ )}
+
+ );
+}
diff --git a/components/ui/Card/index.ts b/components/ui/Card/index.ts
new file mode 100644
index 00000000..c68311df
--- /dev/null
+++ b/components/ui/Card/index.ts
@@ -0,0 +1 @@
+export { default } from './Card';
diff --git a/components/ui/LogoCloud/LogoCloud.tsx b/components/ui/LogoCloud/LogoCloud.tsx
new file mode 100644
index 00000000..3dd84202
--- /dev/null
+++ b/components/ui/LogoCloud/LogoCloud.tsx
@@ -0,0 +1,56 @@
+export default function LogoCloud() {
+ return (
+
+
+ Brought to you by
+
+
+
+ );
+}
diff --git a/components/ui/LogoCloud/index.ts b/components/ui/LogoCloud/index.ts
new file mode 100644
index 00000000..1388865a
--- /dev/null
+++ b/components/ui/LogoCloud/index.ts
@@ -0,0 +1 @@
+export { default } from './LogoCloud';
diff --git a/components/ui/Navbar/Navbar.tsx b/components/ui/Navbar/Navbar.tsx
index 2afc1c16..49ec62d4 100644
--- a/components/ui/Navbar/Navbar.tsx
+++ b/components/ui/Navbar/Navbar.tsx
@@ -1,13 +1,12 @@
-import Link from 'next/link';
-import { createServerSupabaseClient } from '@/app/supabase-server';
-
-import Logo from '@/components/icons/Logo';
-import SignOutButton from './SignOutButton';
+'use server';
+import { createClient } from '@/utils/supabase/server';
import s from './Navbar.module.css';
+import Navlinks from './Navlinks';
export default async function Navbar() {
- const supabase = createServerSupabaseClient();
+ const supabase = createClient();
+
const {
data: { user }
} = await supabase.auth.getUser();
@@ -18,32 +17,7 @@ export default async function Navbar() {
Skip to content
-
-
-
-
-
-
-
- Pricing
-
- {user && (
-
- Account
-
- )}
-
-
-
- {user ? (
-
- ) : (
-
- Sign in
-
- )}
-
-
+
);
diff --git a/components/ui/Navbar/Navlinks.tsx b/components/ui/Navbar/Navlinks.tsx
new file mode 100644
index 00000000..6608cd0a
--- /dev/null
+++ b/components/ui/Navbar/Navlinks.tsx
@@ -0,0 +1,51 @@
+'use client';
+
+import Link from 'next/link';
+import { SignOut } from '@/utils/auth-helpers/server';
+import { handleRequest } from '@/utils/auth-helpers/client';
+import Logo from '@/components/icons/Logo';
+import { usePathname, useRouter } from 'next/navigation';
+import { getRedirectMethod } from '@/utils/auth-helpers/settings';
+import s from './Navbar.module.css';
+
+interface NavlinksProps {
+ user?: any;
+}
+
+export default function Navlinks({ user }: NavlinksProps) {
+ const router = getRedirectMethod() === 'client' ? useRouter() : null;
+
+ return (
+
+
+
+
+
+
+
+ Pricing
+
+ {user && (
+
+ Account
+
+ )}
+
+
+
+ {user ? (
+
+ ) : (
+
+ Sign In
+
+ )}
+
+
+ );
+}
diff --git a/components/ui/Navbar/SignOutButton.tsx b/components/ui/Navbar/SignOutButton.tsx
deleted file mode 100644
index 8c487dca..00000000
--- a/components/ui/Navbar/SignOutButton.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-'use client';
-
-import { useSupabase } from '@/app/supabase-provider';
-import { useRouter } from 'next/navigation';
-
-import s from './Navbar.module.css';
-
-export default function SignOutButton() {
- const router = useRouter();
- const { supabase } = useSupabase();
- const handleSignOut = async () => {
- await supabase.auth.signOut()
- router.refresh()
- }
- return (
-
- Sign out
-
- );
-}
diff --git a/components/ui/Navbar/index.ts b/components/ui/Navbar/index.ts
index e6400ae4..86d1b79b 100644
--- a/components/ui/Navbar/index.ts
+++ b/components/ui/Navbar/index.ts
@@ -1 +1 @@
-export { default } from './Navbar'
+export { default } from './Navbar';
diff --git a/components/ui/Pricing/Pricing.tsx b/components/ui/Pricing/Pricing.tsx
new file mode 100644
index 00000000..b0114647
--- /dev/null
+++ b/components/ui/Pricing/Pricing.tsx
@@ -0,0 +1,204 @@
+'use client';
+
+import Button from '@/components/ui/Button';
+import LogoCloud from '@/components/ui/LogoCloud';
+import type { Tables } from '@/types_db';
+import { getStripe } from '@/utils/stripe/client';
+import { checkoutWithStripe } from '@/utils/stripe/server';
+import { getErrorRedirect } from '@/utils/helpers';
+import { User } from '@supabase/supabase-js';
+import cn from 'classnames';
+import { useRouter, usePathname } from 'next/navigation';
+import { useState } from 'react';
+
+type Subscription = Tables<'subscriptions'>;
+type Product = Tables<'products'>;
+type Price = Tables<'prices'>;
+interface ProductWithPrices extends Product {
+ prices: Price[];
+}
+interface PriceWithProduct extends Price {
+ products: Product | null;
+}
+interface SubscriptionWithProduct extends Subscription {
+ prices: PriceWithProduct | null;
+}
+
+interface Props {
+ user: User | null | undefined;
+ products: ProductWithPrices[];
+ subscription: SubscriptionWithProduct | null;
+}
+
+type BillingInterval = 'lifetime' | 'year' | 'month';
+
+export default function Pricing({ user, products, subscription }: Props) {
+ const intervals = Array.from(
+ new Set(
+ products.flatMap((product) =>
+ product?.prices?.map((price) => price?.interval)
+ )
+ )
+ );
+ const router = useRouter();
+ const [billingInterval, setBillingInterval] =
+ useState('month');
+ const [priceIdLoading, setPriceIdLoading] = useState();
+ const currentPath = usePathname();
+
+ const handleStripeCheckout = async (price: Price) => {
+ setPriceIdLoading(price.id);
+
+ if (!user) {
+ setPriceIdLoading(undefined);
+ return router.push('/signin/signup');
+ }
+
+ const { errorRedirect, sessionId } = await checkoutWithStripe(
+ price,
+ currentPath
+ );
+
+ if (errorRedirect) {
+ setPriceIdLoading(undefined);
+ return router.push(errorRedirect);
+ }
+
+ if (!sessionId) {
+ setPriceIdLoading(undefined);
+ return router.push(
+ getErrorRedirect(
+ currentPath,
+ 'An unknown error occurred.',
+ 'Please try again later or contact a system administrator.'
+ )
+ );
+ }
+
+ const stripe = await getStripe();
+ stripe?.redirectToCheckout({ sessionId });
+
+ setPriceIdLoading(undefined);
+ };
+
+ if (!products.length) {
+ return (
+
+ );
+ } else {
+ return (
+
+
+
+
+ Pricing Plans
+
+
+ Start building for free, then add a site plan to go live. Account
+ plans unlock additional features.
+
+
+ {intervals.includes('month') && (
+ setBillingInterval('month')}
+ type="button"
+ className={`${
+ billingInterval === 'month'
+ ? 'relative w-1/2 bg-zinc-700 border-zinc-800 shadow-sm text-white'
+ : 'ml-0.5 relative w-1/2 border border-transparent text-zinc-400'
+ } rounded-md m-1 py-2 text-sm font-medium whitespace-nowrap focus:outline-none focus:ring-2 focus:ring-pink-500 focus:ring-opacity-50 focus:z-10 sm:w-auto sm:px-8`}
+ >
+ Monthly billing
+
+ )}
+ {intervals.includes('year') && (
+ setBillingInterval('year')}
+ type="button"
+ className={`${
+ billingInterval === 'year'
+ ? 'relative w-1/2 bg-zinc-700 border-zinc-800 shadow-sm text-white'
+ : 'ml-0.5 relative w-1/2 border border-transparent text-zinc-400'
+ } rounded-md m-1 py-2 text-sm font-medium whitespace-nowrap focus:outline-none focus:ring-2 focus:ring-pink-500 focus:ring-opacity-50 focus:z-10 sm:w-auto sm:px-8`}
+ >
+ Yearly billing
+
+ )}
+
+
+
+ {products.map((product) => {
+ const price = product?.prices?.find(
+ (price) => price.interval === billingInterval
+ );
+ if (!price) return null;
+ const priceString = new Intl.NumberFormat('en-US', {
+ style: 'currency',
+ currency: price.currency!,
+ minimumFractionDigits: 0
+ }).format((price?.unit_amount || 0) / 100);
+ return (
+
+
+
+ {product.name}
+
+
{product.description}
+
+
+ {priceString}
+
+
+ /{billingInterval}
+
+
+
handleStripeCheckout(price)}
+ className="block w-full py-2 mt-8 text-sm font-semibold text-center text-white rounded-md hover:bg-zinc-900"
+ >
+ {subscription ? 'Manage' : 'Subscribe'}
+
+
+
+ );
+ })}
+
+
+
+
+ );
+ }
+}
diff --git a/components/ui/Toasts/toast.tsx b/components/ui/Toasts/toast.tsx
new file mode 100644
index 00000000..ae55541c
--- /dev/null
+++ b/components/ui/Toasts/toast.tsx
@@ -0,0 +1,128 @@
+import * as React from 'react';
+import * as ToastPrimitives from '@radix-ui/react-toast';
+import { cva, type VariantProps } from 'class-variance-authority';
+import { X } from 'lucide-react';
+
+import { cn } from '@/utils/cn';
+
+const ToastProvider = ToastPrimitives.Provider;
+
+const ToastViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
+
+const toastVariants = cva(
+ 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border border-zinc-200 p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full dark:border-zinc-800',
+ {
+ variants: {
+ variant: {
+ default:
+ 'border bg-white text-zinc-950 dark:bg-zinc-950 dark:text-zinc-50',
+ destructive:
+ 'destructive group border-red-500 bg-red-500 text-zinc-50 dark:border-red-900 dark:bg-red-900 dark:text-zinc-50'
+ }
+ },
+ defaultVariants: {
+ variant: 'default'
+ }
+ }
+);
+
+const Toast = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, variant, ...props }, ref) => {
+ return (
+
+ );
+});
+Toast.displayName = ToastPrimitives.Root.displayName;
+
+const ToastAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastAction.displayName = ToastPrimitives.Action.displayName;
+
+const ToastClose = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+ToastClose.displayName = ToastPrimitives.Close.displayName;
+
+const ToastTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastTitle.displayName = ToastPrimitives.Title.displayName;
+
+const ToastDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastDescription.displayName = ToastPrimitives.Description.displayName;
+
+type ToastProps = React.ComponentPropsWithoutRef;
+
+type ToastActionElement = React.ReactElement;
+
+export {
+ type ToastProps,
+ type ToastActionElement,
+ ToastProvider,
+ ToastViewport,
+ Toast,
+ ToastTitle,
+ ToastDescription,
+ ToastClose,
+ ToastAction
+};
diff --git a/components/ui/Toasts/toaster.tsx b/components/ui/Toasts/toaster.tsx
new file mode 100644
index 00000000..f21abe19
--- /dev/null
+++ b/components/ui/Toasts/toaster.tsx
@@ -0,0 +1,69 @@
+'use client';
+
+import {
+ Toast,
+ ToastClose,
+ ToastDescription,
+ ToastProvider,
+ ToastTitle,
+ ToastViewport
+} from '@/components/ui/Toasts/toast';
+import { useToast } from '@/components/ui/Toasts/use-toast';
+import { usePathname, useRouter, useSearchParams } from 'next/navigation';
+import { useEffect } from 'react';
+
+export function Toaster() {
+ const { toast, toasts } = useToast();
+ const searchParams = useSearchParams();
+ const pathname = usePathname();
+ const router = useRouter();
+
+ useEffect(() => {
+ const status = searchParams.get('status');
+ const status_description = searchParams.get('status_description');
+ const error = searchParams.get('error');
+ const error_description = searchParams.get('error_description');
+ if (error || status) {
+ toast({
+ title: error
+ ? error ?? 'Hmm... Something went wrong.'
+ : status ?? 'Alright!',
+ description: error ? error_description : status_description,
+ variant: error ? 'destructive' : undefined
+ });
+ // Clear any 'error', 'status', 'status_description', and 'error_description' search params
+ // so that the toast doesn't show up again on refresh, but leave any other search params
+ // intact.
+ const newSearchParams = new URLSearchParams(searchParams.toString());
+ const paramsToRemove = [
+ 'error',
+ 'status',
+ 'status_description',
+ 'error_description'
+ ];
+ paramsToRemove.forEach((param) => newSearchParams.delete(param));
+ const redirectPath = `${pathname}?${newSearchParams.toString()}`;
+ router.replace(redirectPath, { scroll: false });
+ }
+ }, [searchParams]);
+
+ return (
+
+ {toasts.map(function ({ id, title, description, action, ...props }) {
+ return (
+
+
+ {title && {title} }
+ {description && (
+ {description}
+ )}
+
+ {action}
+
+
+ );
+ })}
+
+
+ );
+}
diff --git a/components/ui/Toasts/use-toast.ts b/components/ui/Toasts/use-toast.ts
new file mode 100644
index 00000000..3377bb43
--- /dev/null
+++ b/components/ui/Toasts/use-toast.ts
@@ -0,0 +1,192 @@
+// Inspired by react-hot-toast library
+import * as React from 'react';
+
+import type {
+ ToastActionElement,
+ ToastProps
+} from '@/components/ui/Toasts/toast';
+
+const TOAST_LIMIT = 1;
+const TOAST_REMOVE_DELAY = 1000000;
+
+type ToasterToast = ToastProps & {
+ id: string;
+ title?: React.ReactNode;
+ description?: React.ReactNode;
+ action?: ToastActionElement;
+};
+
+const actionTypes = {
+ ADD_TOAST: 'ADD_TOAST',
+ UPDATE_TOAST: 'UPDATE_TOAST',
+ DISMISS_TOAST: 'DISMISS_TOAST',
+ REMOVE_TOAST: 'REMOVE_TOAST'
+} as const;
+
+let count = 0;
+
+function genId() {
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
+ return count.toString();
+}
+
+type ActionType = typeof actionTypes;
+
+type Action =
+ | {
+ type: ActionType['ADD_TOAST'];
+ toast: ToasterToast;
+ }
+ | {
+ type: ActionType['UPDATE_TOAST'];
+ toast: Partial;
+ }
+ | {
+ type: ActionType['DISMISS_TOAST'];
+ toastId?: ToasterToast['id'];
+ }
+ | {
+ type: ActionType['REMOVE_TOAST'];
+ toastId?: ToasterToast['id'];
+ };
+
+interface State {
+ toasts: ToasterToast[];
+}
+
+const toastTimeouts = new Map>();
+
+const addToRemoveQueue = (toastId: string) => {
+ if (toastTimeouts.has(toastId)) {
+ return;
+ }
+
+ const timeout = setTimeout(() => {
+ toastTimeouts.delete(toastId);
+ dispatch({
+ type: 'REMOVE_TOAST',
+ toastId: toastId
+ });
+ }, TOAST_REMOVE_DELAY);
+
+ toastTimeouts.set(toastId, timeout);
+};
+
+export const reducer = (state: State, action: Action): State => {
+ switch (action.type) {
+ case 'ADD_TOAST':
+ return {
+ ...state,
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT)
+ };
+
+ case 'UPDATE_TOAST':
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
+ )
+ };
+
+ case 'DISMISS_TOAST': {
+ const { toastId } = action;
+
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
+ // but I'll keep it here for simplicity
+ if (toastId) {
+ addToRemoveQueue(toastId);
+ } else {
+ state.toasts.forEach((toast) => {
+ addToRemoveQueue(toast.id);
+ });
+ }
+
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === toastId || toastId === undefined
+ ? {
+ ...t,
+ open: false
+ }
+ : t
+ )
+ };
+ }
+ case 'REMOVE_TOAST':
+ if (action.toastId === undefined) {
+ return {
+ ...state,
+ toasts: []
+ };
+ }
+ return {
+ ...state,
+ toasts: state.toasts.filter((t) => t.id !== action.toastId)
+ };
+ }
+};
+
+const listeners: Array<(state: State) => void> = [];
+
+let memoryState: State = { toasts: [] };
+
+function dispatch(action: Action) {
+ memoryState = reducer(memoryState, action);
+ listeners.forEach((listener) => {
+ listener(memoryState);
+ });
+}
+
+type Toast = Omit;
+
+function toast({ ...props }: Toast) {
+ const id = genId();
+
+ const update = (props: ToasterToast) =>
+ dispatch({
+ type: 'UPDATE_TOAST',
+ toast: { ...props, id }
+ });
+ const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id });
+
+ dispatch({
+ type: 'ADD_TOAST',
+ toast: {
+ ...props,
+ id,
+ open: true,
+ onOpenChange: (open) => {
+ if (!open) dismiss();
+ }
+ }
+ });
+
+ return {
+ id: id,
+ dismiss,
+ update
+ };
+}
+
+function useToast() {
+ const [state, setState] = React.useState(memoryState);
+
+ React.useEffect(() => {
+ listeners.push(setState);
+ return () => {
+ const index = listeners.indexOf(setState);
+ if (index > -1) {
+ listeners.splice(index, 1);
+ }
+ };
+ }, [state]);
+
+ return {
+ ...state,
+ toast,
+ dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId })
+ };
+}
+
+export { useToast, toast };
diff --git a/fixtures/stripe-fixtures.json b/fixtures/stripe-fixtures.json
index df641537..38f10c1c 100644
--- a/fixtures/stripe-fixtures.json
+++ b/fixtures/stripe-fixtures.json
@@ -1,85 +1,91 @@
{
- "_meta": {
- "template_version": 0
+ "_meta": {
+ "template_version": 0
+ },
+ "fixtures": [
+ {
+ "name": "prod_hobby",
+ "path": "/v1/products",
+ "method": "post",
+ "params": {
+ "name": "Hobby",
+ "description": "Hobby product description",
+ "metadata": {
+ "index": 0
+ }
+ }
+ },
+ {
+ "name": "price_hobby_month",
+ "path": "/v1/prices",
+ "method": "post",
+ "params": {
+ "product": "${prod_hobby:id}",
+ "currency": "usd",
+ "billing_scheme": "per_unit",
+ "unit_amount": 1000,
+ "recurring": {
+ "interval": "month",
+ "interval_count": 1
+ }
+ }
+ },
+ {
+ "name": "price_hobby_year",
+ "path": "/v1/prices",
+ "method": "post",
+ "params": {
+ "product": "${prod_hobby:id}",
+ "currency": "usd",
+ "billing_scheme": "per_unit",
+ "unit_amount": 10000,
+ "recurring": {
+ "interval": "year",
+ "interval_count": 1
+ }
+ }
+ },
+ {
+ "name": "prod_freelancer",
+ "path": "/v1/products",
+ "method": "post",
+ "params": {
+ "name": "Freelancer",
+ "description": "Freelancer product description",
+ "metadata": {
+ "index": 1
+ }
+ }
+ },
+ {
+ "name": "price_freelancer_month",
+ "path": "/v1/prices",
+ "method": "post",
+ "params": {
+ "product": "${prod_freelancer:id}",
+ "currency": "usd",
+ "billing_scheme": "per_unit",
+ "unit_amount": 2000,
+ "recurring": {
+ "interval": "month",
+ "interval_count": 1
+ }
+ }
},
- "fixtures": [
- {
- "name": "prod_hobby",
- "path": "/v1/products",
- "method": "post",
- "params": {
- "name": "Hobby",
- "description": "Hobby product description"
- }
- },
- {
- "name": "price_hobby_month",
- "path": "/v1/prices",
- "method": "post",
- "params": {
- "product": "${prod_hobby:id}",
- "currency": "usd",
- "billing_scheme": "per_unit",
- "unit_amount": 1000,
- "recurring": {
- "interval": "month",
- "interval_count": 1
- }
- }
- },
- {
- "name": "price_hobby_year",
- "path": "/v1/prices",
- "method": "post",
- "params": {
- "product": "${prod_hobby:id}",
- "currency": "usd",
- "billing_scheme": "per_unit",
- "unit_amount": 10000,
- "recurring": {
- "interval": "year",
- "interval_count": 1
- }
- }
- },
- {
- "name": "prod_freelancer",
- "path": "/v1/products",
- "method": "post",
- "params": {
- "name": "Freelancer",
- "description": "Freelancer product description"
- }
- },
- {
- "name": "price_freelancer_month",
- "path": "/v1/prices",
- "method": "post",
- "params": {
- "product": "${prod_freelancer:id}",
- "currency": "usd",
- "billing_scheme": "per_unit",
- "unit_amount": 2000,
- "recurring": {
- "interval": "month",
- "interval_count": 1
- }
- }
- },
- {
- "name": "price_freelancer_year",
- "path": "/v1/prices",
- "method": "post",
- "params": {
- "product": "${prod_freelancer:id}",
- "currency": "usd",
- "billing_scheme": "per_unit",
- "unit_amount": 20000,
- "recurring": {
- "interval": "year",
- "interval_count": 1
- }
- }
+ {
+ "name": "price_freelancer_year",
+ "path": "/v1/prices",
+ "method": "post",
+ "params": {
+ "product": "${prod_freelancer:id}",
+ "currency": "usd",
+ "billing_scheme": "per_unit",
+ "unit_amount": 20000,
+ "recurring": {
+ "interval": "year",
+ "interval_count": 1
}
- ]
+ }
+ }
+ ]
}
diff --git a/middleware.ts b/middleware.ts
index 8c722014..c14013af 100644
--- a/middleware.ts
+++ b/middleware.ts
@@ -1,12 +1,20 @@
-import { createMiddlewareClient } from '@supabase/auth-helpers-nextjs'
-import { NextResponse } from 'next/server'
+import { type NextRequest } from 'next/server';
+import { updateSession } from '@/utils/supabase/middleware';
-import type { NextRequest } from 'next/server'
-import type { Database } from '@/types_db'
+export async function middleware(request: NextRequest) {
+ return await updateSession(request);
+}
-export async function middleware(req: NextRequest) {
- const res = NextResponse.next()
- const supabase = createMiddlewareClient({ req, res })
- await supabase.auth.getSession()
- return res
-}
\ No newline at end of file
+export const config = {
+ matcher: [
+ /*
+ * Match all request paths except:
+ * - _next/static (static files)
+ * - _next/image (image optimization files)
+ * - favicon.ico (favicon file)
+ * - images - .svg, .png, .jpg, .jpeg, .gif, .webp
+ * Feel free to modify this pattern to include more paths.
+ */
+ '/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)'
+ ]
+};
diff --git a/next.config.js b/next.config.js
deleted file mode 100644
index 6e49dd62..00000000
--- a/next.config.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/** @type {import('next').NextConfig} */
-const nextConfig = {
- reactStrictMode: true,
- experimental: {
- appDir: true,
- serverActions: true
- }
-};
-
-module.exports = nextConfig;
diff --git a/package.json b/package.json
index d26694a1..92e074f9 100644
--- a/package.json
+++ b/package.json
@@ -3,47 +3,50 @@
"version": "0.0.0",
"license": "MIT",
"scripts": {
- "dev": "next dev",
+ "dev": "next dev --turbo",
"build": "next build",
"start": "next start",
"lint": "next lint",
+ "prettier-fix": "prettier --write .",
"stripe:listen": "stripe listen --forward-to=localhost:3000/api/webhooks --project-name=saas-starter",
- "generate-types": "npx supabase gen types typescript --project-id YOUR_PROJECT_ID --schema public > types_db.ts"
+ "stripe:fixtures": "stripe fixtures fixtures/stripe-fixtures.json --project-name=saas-starter",
+ "supabase:start": "npx supabase start",
+ "supabase:link": "node supabase/link.js",
+ "supabase:generate-types": "npx supabase gen types typescript --local --schema public > types_db.ts",
+ "supabase:generate-migration": "npx supabase db diff | npx supabase migration new update",
+ "supabase:migrate": "npx supabase migration up --linked"
},
"dependencies": {
- "@stripe/stripe-js": "^1.53.0",
- "@supabase/auth-helpers-nextjs": "^0.7.0",
- "@supabase/auth-ui-react": "^0.4.2",
- "@supabase/auth-ui-shared": "^0.1.6",
- "@supabase/supabase-js": "^2.23.0",
- "classnames": "^2.3.2",
- "next": "13.4.3",
+ "@radix-ui/react-toast": "^1.1.5",
+ "@stripe/stripe-js": "^2.4.0",
+ "@supabase/ssr": "^0.1.0",
+ "@supabase/supabase-js": "^2.39.3",
+ "class-variance-authority": "^0.7.0",
+ "classnames": "^2.5.1",
+ "clsx": "^2.1.0",
+ "lucide-react": "0.323.0",
+ "next": "14.1.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
- "react-merge-refs": "^2.0.2",
- "stripe": "^12.6.0",
- "tailwindcss": "^3.3.2"
+ "react-merge-refs": "^2.1.1",
+ "stripe": "^14.15.0",
+ "tailwind-merge": "^2.2.1",
+ "tailwindcss": "^3.4.1",
+ "tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
- "@ianvs/prettier-plugin-sort-imports": "^3.7.2",
- "@types/node": "^20.2.3",
- "@types/react": "^18.2.7",
- "autoprefixer": "^10.4.14",
- "eslint": "^8.41.0",
- "eslint-config-next": "13.4.3",
- "eslint-config-prettier": "^8.8.0",
- "eslint-plugin-react": "^7.32.2",
- "eslint-plugin-tailwindcss": "^3.12.0",
- "postcss": "^8.4.23",
- "prettier": "^2.8.8",
- "prettier-plugin-tailwindcss": "^0.3.0",
- "supabase": "^1.63.1",
- "typescript": "^5.0.4"
- },
- "prettier": {
- "arrowParens": "always",
- "singleQuote": true,
- "tabWidth": 2,
- "trailingComma": "none"
+ "@types/node": "^20.11.16",
+ "@types/react": "^18.2.55",
+ "autoprefixer": "^10.4.17",
+ "eslint": "^8.56.0",
+ "eslint-config-next": "14.1.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-react": "^7.33.2",
+ "eslint-plugin-tailwindcss": "^3.14.2",
+ "postcss": "^8.4.35",
+ "prettier": "^3.2.5",
+ "prettier-plugin-tailwindcss": "^0.5.11",
+ "supabase": "^1.142.2",
+ "typescript": "^5.3.3"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3c9b4143..a27eba1b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,27 +5,33 @@ settings:
excludeLinksFromLockfile: false
dependencies:
+ '@radix-ui/react-toast':
+ specifier: ^1.1.5
+ version: 1.1.5(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
'@stripe/stripe-js':
- specifier: ^1.53.0
- version: 1.54.0
- '@supabase/auth-helpers-nextjs':
- specifier: ^0.7.0
- version: 0.7.0(@supabase/supabase-js@2.24.0)
- '@supabase/auth-ui-react':
- specifier: ^0.4.2
- version: 0.4.2(@supabase/supabase-js@2.24.0)
- '@supabase/auth-ui-shared':
- specifier: ^0.1.6
- version: 0.1.6(@supabase/supabase-js@2.24.0)
+ specifier: ^2.4.0
+ version: 2.4.0
+ '@supabase/ssr':
+ specifier: ^0.1.0
+ version: 0.1.0(@supabase/supabase-js@2.39.3)
'@supabase/supabase-js':
- specifier: ^2.23.0
- version: 2.24.0
+ specifier: ^2.39.3
+ version: 2.39.3
+ class-variance-authority:
+ specifier: ^0.7.0
+ version: 0.7.0
classnames:
- specifier: ^2.3.2
- version: 2.3.2
+ specifier: ^2.5.1
+ version: 2.5.1
+ clsx:
+ specifier: ^2.1.0
+ version: 2.1.0
+ lucide-react:
+ specifier: 0.321.0
+ version: 0.321.0(react@18.2.0)
next:
- specifier: 13.4.3
- version: 13.4.3(@babel/core@7.22.1)(react-dom@18.2.0)(react@18.2.0)
+ specifier: 14.1.0
+ version: 14.1.0(react-dom@18.2.0)(react@18.2.0)
react:
specifier: ^18.2.0
version: 18.2.0
@@ -33,277 +39,120 @@ dependencies:
specifier: ^18.2.0
version: 18.2.0(react@18.2.0)
react-merge-refs:
- specifier: ^2.0.2
- version: 2.0.2
+ specifier: ^2.1.1
+ version: 2.1.1
stripe:
- specifier: ^12.6.0
- version: 12.7.0
+ specifier: ^14.15.0
+ version: 14.15.0
+ tailwind-merge:
+ specifier: ^2.2.1
+ version: 2.2.1
tailwindcss:
- specifier: ^3.3.2
- version: 3.3.2
+ specifier: ^3.4.1
+ version: 3.4.1
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@3.4.1)
devDependencies:
- '@ianvs/prettier-plugin-sort-imports':
- specifier: ^3.7.2
- version: 3.7.2(prettier@2.8.8)
'@types/node':
- specifier: ^20.2.3
- version: 20.2.5
+ specifier: ^20.11.16
+ version: 20.11.16
'@types/react':
- specifier: ^18.2.7
- version: 18.2.7
+ specifier: ^18.2.54
+ version: 18.2.55
autoprefixer:
- specifier: ^10.4.14
- version: 10.4.14(postcss@8.4.24)
+ specifier: ^10.4.17
+ version: 10.4.17(postcss@8.4.35)
eslint:
- specifier: ^8.41.0
- version: 8.41.0
+ specifier: ^8.56.0
+ version: 8.56.0
eslint-config-next:
- specifier: 13.4.3
- version: 13.4.3(eslint@8.41.0)(typescript@5.0.4)
+ specifier: 14.1.0
+ version: 14.1.0(eslint@8.56.0)(typescript@5.3.3)
eslint-config-prettier:
- specifier: ^8.8.0
- version: 8.8.0(eslint@8.41.0)
+ specifier: ^9.1.0
+ version: 9.1.0(eslint@8.56.0)
eslint-plugin-react:
- specifier: ^7.32.2
- version: 7.32.2(eslint@8.41.0)
+ specifier: ^7.33.2
+ version: 7.33.2(eslint@8.56.0)
eslint-plugin-tailwindcss:
- specifier: ^3.12.0
- version: 3.12.0(tailwindcss@3.3.2)
+ specifier: ^3.14.1
+ version: 3.14.2(tailwindcss@3.4.1)
postcss:
- specifier: ^8.4.23
- version: 8.4.24
+ specifier: ^8.4.34
+ version: 8.4.35
prettier:
- specifier: ^2.8.8
- version: 2.8.8
+ specifier: ^3.2.5
+ version: 3.2.5
prettier-plugin-tailwindcss:
- specifier: ^0.3.0
- version: 0.3.0(@ianvs/prettier-plugin-sort-imports@3.7.2)(prettier@2.8.8)
+ specifier: ^0.5.11
+ version: 0.5.11(prettier@3.2.5)
supabase:
- specifier: ^1.63.1
- version: 1.64.8
+ specifier: ^1.136.3
+ version: 1.142.2
typescript:
- specifier: ^5.0.4
- version: 5.0.4
+ specifier: ^5.3.3
+ version: 5.3.3
packages:
-
- /@alloc/quick-lru@5.2.0:
- resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
- engines: {node: '>=10'}
-
- /@ampproject/remapping@2.2.1:
- resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
- engines: {node: '>=6.0.0'}
- dependencies:
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.18
-
- /@babel/code-frame@7.21.4:
- resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/highlight': 7.18.6
-
- /@babel/compat-data@7.22.3:
- resolution: {integrity: sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==}
- engines: {node: '>=6.9.0'}
-
- /@babel/core@7.22.1:
- resolution: {integrity: sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@ampproject/remapping': 2.2.1
- '@babel/code-frame': 7.21.4
- '@babel/generator': 7.22.3
- '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1)
- '@babel/helper-module-transforms': 7.22.1
- '@babel/helpers': 7.22.3
- '@babel/parser': 7.22.4
- '@babel/template': 7.21.9
- '@babel/traverse': 7.22.4
- '@babel/types': 7.22.4
- convert-source-map: 1.9.0
- debug: 4.3.4
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.0
- transitivePeerDependencies:
- - supports-color
-
- /@babel/generator@7.22.3:
- resolution: {integrity: sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.22.4
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.18
- jsesc: 2.5.2
-
- /@babel/helper-compilation-targets@7.22.1(@babel/core@7.22.1):
- resolution: {integrity: sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/compat-data': 7.22.3
- '@babel/core': 7.22.1
- '@babel/helper-validator-option': 7.21.0
- browserslist: 4.21.7
- lru-cache: 5.1.1
- semver: 6.3.0
-
- /@babel/helper-environment-visitor@7.22.1:
- resolution: {integrity: sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==}
- engines: {node: '>=6.9.0'}
-
- /@babel/helper-function-name@7.21.0:
- resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/template': 7.21.9
- '@babel/types': 7.22.4
-
- /@babel/helper-hoist-variables@7.18.6:
- resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.22.4
-
- /@babel/helper-module-imports@7.21.4:
- resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.22.4
-
- /@babel/helper-module-transforms@7.22.1:
- resolution: {integrity: sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-environment-visitor': 7.22.1
- '@babel/helper-module-imports': 7.21.4
- '@babel/helper-simple-access': 7.21.5
- '@babel/helper-split-export-declaration': 7.18.6
- '@babel/helper-validator-identifier': 7.19.1
- '@babel/template': 7.21.9
- '@babel/traverse': 7.22.4
- '@babel/types': 7.22.4
- transitivePeerDependencies:
- - supports-color
-
- /@babel/helper-simple-access@7.21.5:
- resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.22.4
-
- /@babel/helper-split-export-declaration@7.18.6:
- resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.22.4
-
- /@babel/helper-string-parser@7.21.5:
- resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==}
- engines: {node: '>=6.9.0'}
-
- /@babel/helper-validator-identifier@7.19.1:
- resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
- engines: {node: '>=6.9.0'}
-
- /@babel/helper-validator-option@7.21.0:
- resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==}
- engines: {node: '>=6.9.0'}
-
- /@babel/helpers@7.22.3:
- resolution: {integrity: sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/template': 7.21.9
- '@babel/traverse': 7.22.4
- '@babel/types': 7.22.4
- transitivePeerDependencies:
- - supports-color
-
- /@babel/highlight@7.18.6:
- resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-validator-identifier': 7.19.1
- chalk: 2.4.2
- js-tokens: 4.0.0
-
- /@babel/parser@7.22.4:
- resolution: {integrity: sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==}
- engines: {node: '>=6.0.0'}
- hasBin: true
- dependencies:
- '@babel/types': 7.22.4
-
- /@babel/runtime@7.22.3:
- resolution: {integrity: sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- regenerator-runtime: 0.13.11
+ /@aashutoshrathi/word-wrap@1.2.6:
+ resolution:
+ {
+ integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
+ }
+ engines: { node: '>=0.10.0' }
dev: true
- /@babel/template@7.21.9:
- resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.21.4
- '@babel/parser': 7.22.4
- '@babel/types': 7.22.4
-
- /@babel/traverse@7.22.4:
- resolution: {integrity: sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.21.4
- '@babel/generator': 7.22.3
- '@babel/helper-environment-visitor': 7.22.1
- '@babel/helper-function-name': 7.21.0
- '@babel/helper-hoist-variables': 7.18.6
- '@babel/helper-split-export-declaration': 7.18.6
- '@babel/parser': 7.22.4
- '@babel/types': 7.22.4
- debug: 4.3.4
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
-
- /@babel/types@7.22.4:
- resolution: {integrity: sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-string-parser': 7.21.5
- '@babel/helper-validator-identifier': 7.19.1
- to-fast-properties: 2.0.0
-
- /@eslint-community/eslint-utils@4.4.0(eslint@8.41.0):
- resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /@alloc/quick-lru@5.2.0:
+ resolution:
+ {
+ integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
+ }
+ engines: { node: '>=10' }
+
+ /@babel/runtime@7.23.9:
+ resolution:
+ {
+ integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==
+ }
+ engines: { node: '>=6.9.0' }
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0):
+ resolution:
+ {
+ integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ }
+ engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
dependencies:
- eslint: 8.41.0
- eslint-visitor-keys: 3.4.1
+ eslint: 8.56.0
+ eslint-visitor-keys: 3.4.3
dev: true
- /@eslint-community/regexpp@4.5.1:
- resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==}
- engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ /@eslint-community/regexpp@4.10.0:
+ resolution:
+ {
+ integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
+ }
+ engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 }
dev: true
- /@eslint/eslintrc@2.0.3:
- resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /@eslint/eslintrc@2.1.4:
+ resolution:
+ {
+ integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
+ }
+ engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
dependencies:
ajv: 6.12.6
debug: 4.3.4
- espree: 9.5.2
- globals: 13.20.0
- ignore: 5.2.4
+ espree: 9.6.1
+ globals: 13.24.0
+ ignore: 5.3.1
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
@@ -312,16 +161,22 @@ packages:
- supports-color
dev: true
- /@eslint/js@8.41.0:
- resolution: {integrity: sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /@eslint/js@8.56.0:
+ resolution:
+ {
+ integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==
+ }
+ engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
dev: true
- /@humanwhocodes/config-array@0.11.8:
- resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
- engines: {node: '>=10.10.0'}
+ /@humanwhocodes/config-array@0.11.14:
+ resolution:
+ {
+ integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
+ }
+ engines: { node: '>=10.10.0' }
dependencies:
- '@humanwhocodes/object-schema': 1.2.1
+ '@humanwhocodes/object-schema': 2.0.2
debug: 4.3.4
minimatch: 3.1.2
transitivePeerDependencies:
@@ -329,149 +184,192 @@ packages:
dev: true
/@humanwhocodes/module-importer@1.0.1:
- resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
- engines: {node: '>=12.22'}
- dev: true
-
- /@humanwhocodes/object-schema@1.2.1:
- resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
- dev: true
-
- /@ianvs/prettier-plugin-sort-imports@3.7.2(prettier@2.8.8):
- resolution: {integrity: sha512-bVckKToJM8XV2wTOG1VpeXrSmfAG49esVrikbxeFbY51RJdNke9AdMANJtGuACB59uo+pGlz0wBdWFrRzWyO1A==}
- peerDependencies:
- '@vue/compiler-sfc': '>=3.0.0'
- prettier: 2.x
- peerDependenciesMeta:
- '@vue/compiler-sfc':
- optional: true
- dependencies:
- '@babel/core': 7.22.1
- '@babel/generator': 7.22.3
- '@babel/parser': 7.22.4
- '@babel/traverse': 7.22.4
- '@babel/types': 7.22.4
- javascript-natural-sort: 0.7.1
- lodash.clone: 4.5.0
- lodash.isequal: 4.5.0
- prettier: 2.8.8
- transitivePeerDependencies:
- - supports-color
- dev: true
+ resolution:
+ {
+ integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+ }
+ engines: { node: '>=12.22' }
+ dev: true
+
+ /@humanwhocodes/object-schema@2.0.2:
+ resolution:
+ {
+ integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==
+ }
+ dev: true
+
+ /@isaacs/cliui@8.0.2:
+ resolution:
+ {
+ integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+ }
+ engines: { node: '>=12' }
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: /string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: /strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: /wrap-ansi@7.0.0
/@jridgewell/gen-mapping@0.3.3:
- resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
- engines: {node: '>=6.0.0'}
+ resolution:
+ {
+ integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
+ }
+ engines: { node: '>=6.0.0' }
dependencies:
'@jridgewell/set-array': 1.1.2
'@jridgewell/sourcemap-codec': 1.4.15
- '@jridgewell/trace-mapping': 0.3.18
+ '@jridgewell/trace-mapping': 0.3.22
- /@jridgewell/resolve-uri@3.1.0:
- resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
- engines: {node: '>=6.0.0'}
+ /@jridgewell/resolve-uri@3.1.1:
+ resolution:
+ {
+ integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
+ }
+ engines: { node: '>=6.0.0' }
/@jridgewell/set-array@1.1.2:
- resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
- engines: {node: '>=6.0.0'}
-
- /@jridgewell/sourcemap-codec@1.4.14:
- resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+ resolution:
+ {
+ integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+ }
+ engines: { node: '>=6.0.0' }
/@jridgewell/sourcemap-codec@1.4.15:
- resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
-
- /@jridgewell/trace-mapping@0.3.18:
- resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
- dependencies:
- '@jridgewell/resolve-uri': 3.1.0
- '@jridgewell/sourcemap-codec': 1.4.14
+ resolution:
+ {
+ integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+ }
+
+ /@jridgewell/trace-mapping@0.3.22:
+ resolution:
+ {
+ integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==
+ }
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/sourcemap-codec': 1.4.15
- /@next/env@13.4.3:
- resolution: {integrity: sha512-pa1ErjyFensznttAk3EIv77vFbfSYT6cLzVRK5jx4uiRuCQo+m2wCFAREaHKIy63dlgvOyMlzh6R8Inu8H3KrQ==}
+ /@next/env@14.1.0:
+ resolution:
+ {
+ integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==
+ }
dev: false
- /@next/eslint-plugin-next@13.4.3:
- resolution: {integrity: sha512-5B0uOnh7wyUY9vNNdIA6NUvWozhrZaTMZOzdirYAefqD0ZBK5C/h3+KMYdCKrR7JrXGvVpWnHtv54b3dCzwICA==}
+ /@next/eslint-plugin-next@14.1.0:
+ resolution:
+ {
+ integrity: sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q==
+ }
dependencies:
- glob: 7.1.7
+ glob: 10.3.10
dev: true
- /@next/swc-darwin-arm64@13.4.3:
- resolution: {integrity: sha512-yx18udH/ZmR4Bw4M6lIIPE3JxsAZwo04iaucEfA2GMt1unXr2iodHUX/LAKNyi6xoLP2ghi0E+Xi1f4Qb8f1LQ==}
- engines: {node: '>= 10'}
+ /@next/swc-darwin-arm64@14.1.0:
+ resolution:
+ {
+ integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==
+ }
+ engines: { node: '>= 10' }
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: false
optional: true
- /@next/swc-darwin-x64@13.4.3:
- resolution: {integrity: sha512-Mi8xJWh2IOjryAM1mx18vwmal9eokJ2njY4nDh04scy37F0LEGJ/diL6JL6kTXi0UfUCGbMsOItf7vpReNiD2A==}
- engines: {node: '>= 10'}
+ /@next/swc-darwin-x64@14.1.0:
+ resolution:
+ {
+ integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==
+ }
+ engines: { node: '>= 10' }
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: false
optional: true
- /@next/swc-linux-arm64-gnu@13.4.3:
- resolution: {integrity: sha512-aBvtry4bxJ1xwKZ/LVPeBGBwWVwxa4bTnNkRRw6YffJnn/f4Tv4EGDPaVeYHZGQVA56wsGbtA6nZMuWs/EIk4Q==}
- engines: {node: '>= 10'}
+ /@next/swc-linux-arm64-gnu@14.1.0:
+ resolution:
+ {
+ integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==
+ }
+ engines: { node: '>= 10' }
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: false
optional: true
- /@next/swc-linux-arm64-musl@13.4.3:
- resolution: {integrity: sha512-krT+2G3kEsEUvZoYte3/2IscscDraYPc2B+fDJFipPktJmrv088Pei/RjrhWm5TMIy5URYjZUoDZdh5k940Dyw==}
- engines: {node: '>= 10'}
+ /@next/swc-linux-arm64-musl@14.1.0:
+ resolution:
+ {
+ integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==
+ }
+ engines: { node: '>= 10' }
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: false
optional: true
- /@next/swc-linux-x64-gnu@13.4.3:
- resolution: {integrity: sha512-AMdFX6EKJjC0G/CM6hJvkY8wUjCcbdj3Qg7uAQJ7PVejRWaVt0sDTMavbRfgMchx8h8KsAudUCtdFkG9hlEClw==}
- engines: {node: '>= 10'}
+ /@next/swc-linux-x64-gnu@14.1.0:
+ resolution:
+ {
+ integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==
+ }
+ engines: { node: '>= 10' }
cpu: [x64]
os: [linux]
requiresBuild: true
dev: false
optional: true
- /@next/swc-linux-x64-musl@13.4.3:
- resolution: {integrity: sha512-jySgSXE48shaLtcQbiFO9ajE9mqz7pcAVLnVLvRIlUHyQYR/WyZdK8ehLs65Mz6j9cLrJM+YdmdJPyV4WDaz2g==}
- engines: {node: '>= 10'}
+ /@next/swc-linux-x64-musl@14.1.0:
+ resolution:
+ {
+ integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==
+ }
+ engines: { node: '>= 10' }
cpu: [x64]
os: [linux]
requiresBuild: true
dev: false
optional: true
- /@next/swc-win32-arm64-msvc@13.4.3:
- resolution: {integrity: sha512-5DxHo8uYcaADiE9pHrg8o28VMt/1kR8voDehmfs9AqS0qSClxAAl+CchjdboUvbCjdNWL1MISCvEfKY2InJ3JA==}
- engines: {node: '>= 10'}
+ /@next/swc-win32-arm64-msvc@14.1.0:
+ resolution:
+ {
+ integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==
+ }
+ engines: { node: '>= 10' }
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: false
optional: true
- /@next/swc-win32-ia32-msvc@13.4.3:
- resolution: {integrity: sha512-LaqkF3d+GXRA5X6zrUjQUrXm2MN/3E2arXBtn5C7avBCNYfm9G3Xc646AmmmpN3DJZVaMYliMyCIQCMDEzk80w==}
- engines: {node: '>= 10'}
+ /@next/swc-win32-ia32-msvc@14.1.0:
+ resolution:
+ {
+ integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==
+ }
+ engines: { node: '>= 10' }
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: false
optional: true
- /@next/swc-win32-x64-msvc@13.4.3:
- resolution: {integrity: sha512-jglUk/x7ZWeOJWlVoKyIAkHLTI+qEkOriOOV+3hr1GyiywzcqfI7TpFSiwC7kk1scOiH7NTFKp8mA3XPNO9bDw==}
- engines: {node: '>= 10'}
+ /@next/swc-win32-x64-msvc@14.1.0:
+ resolution:
+ {
+ integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==
+ }
+ engines: { node: '>= 10' }
cpu: [x64]
os: [win32]
requiresBuild: true
@@ -479,260 +377,642 @@ packages:
optional: true
/@nodelib/fs.scandir@2.1.5:
- resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
- engines: {node: '>= 8'}
+ resolution:
+ {
+ integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ }
+ engines: { node: '>= 8' }
dependencies:
'@nodelib/fs.stat': 2.0.5
run-parallel: 1.2.0
/@nodelib/fs.stat@2.0.5:
- resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
- engines: {node: '>= 8'}
+ resolution:
+ {
+ integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+ }
+ engines: { node: '>= 8' }
/@nodelib/fs.walk@1.2.8:
- resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
- engines: {node: '>= 8'}
+ resolution:
+ {
+ integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ }
+ engines: { node: '>= 8' }
dependencies:
'@nodelib/fs.scandir': 2.1.5
- fastq: 1.15.0
+ fastq: 1.17.1
+
+ /@pkgjs/parseargs@0.11.0:
+ resolution:
+ {
+ integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+ }
+ engines: { node: '>=14' }
+ requiresBuild: true
+ optional: true
- /@pkgr/utils@2.4.1:
- resolution: {integrity: sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==}
- engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ /@radix-ui/primitive@1.0.1:
+ resolution:
+ {
+ integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==
+ }
dependencies:
- cross-spawn: 7.0.3
- fast-glob: 3.2.12
- is-glob: 4.0.3
- open: 9.1.0
- picocolors: 1.0.0
- tslib: 2.5.2
- dev: true
+ '@babel/runtime': 7.23.9
+ dev: false
- /@rushstack/eslint-patch@1.3.0:
- resolution: {integrity: sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==}
- dev: true
+ /@radix-ui/react-collection@1.0.3(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==
+ }
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.23.9
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.55)(react@18.2.0)
+ '@types/react': 18.2.55
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
- /@stitches/core@1.2.8:
- resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==}
+ /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.55)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==
+ }
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.23.9
+ '@types/react': 18.2.55
+ react: 18.2.0
dev: false
- /@stripe/stripe-js@1.54.0:
- resolution: {integrity: sha512-nElTXkS+nMfDNMkWfLmyeqHQfMGJ1JjrjAVMibV61Oc/rYdUv0cKRYCi1l4ivZ5SySB3vQLcLolxbKBkbNznZA==}
+ /@radix-ui/react-context@1.0.1(@types/react@18.2.55)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==
+ }
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.23.9
+ '@types/react': 18.2.55
+ react: 18.2.0
dev: false
- /@supabase/auth-helpers-nextjs@0.7.0(@supabase/supabase-js@2.24.0):
- resolution: {integrity: sha512-FvQflNstWjBXEr0oBux1xqalrpZatCAmnWXROs5HJyCGP7hb+iSWqlwBQtyAllvw2baUufHkXyP+vr1PI3myKA==}
+ /@radix-ui/react-dismissable-layer@1.0.5(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==
+ }
peerDependencies:
- '@supabase/supabase-js': ^2.19.0
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
dependencies:
- '@supabase/auth-helpers-shared': 0.4.0(@supabase/supabase-js@2.24.0)
- '@supabase/supabase-js': 2.24.0
- set-cookie-parser: 2.6.0
+ '@babel/runtime': 7.23.9
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.55)(react@18.2.0)
+ '@types/react': 18.2.55
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
dev: false
- /@supabase/auth-helpers-shared@0.4.0(@supabase/supabase-js@2.24.0):
- resolution: {integrity: sha512-5wlCGb4HZ46W2fg8tdi22ZU1GAIOe3YxXrTgvAjWVapNFN+PiH5cFIbz51ZgZRK1TokRZ01pB1GEFy4e+NZE+A==}
+ /@radix-ui/react-portal@1.0.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==
+ }
peerDependencies:
- '@supabase/supabase-js': ^2.19.0
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
dependencies:
- '@supabase/supabase-js': 2.24.0
- jose: 4.14.4
+ '@babel/runtime': 7.23.9
+ '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.55
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
dev: false
- /@supabase/auth-ui-react@0.4.2(@supabase/supabase-js@2.24.0):
- resolution: {integrity: sha512-NLP1udNtbteWDZYUoJKD/sDzi1BeZpS+CvUk1D0FwHevlVDT1fUf27sVLtrAgchSIQxHwZHTiUPJC9auCF3Zyw==}
+ /@radix-ui/react-presence@1.0.1(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==
+ }
peerDependencies:
- '@supabase/supabase-js': ^2.21.0
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
dependencies:
- '@stitches/core': 1.2.8
- '@supabase/auth-ui-shared': 0.1.6(@supabase/supabase-js@2.24.0)
- '@supabase/supabase-js': 2.24.0
- prop-types: 15.8.1
+ '@babel/runtime': 7.23.9
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@types/react': 18.2.55
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@supabase/auth-ui-shared@0.1.6(@supabase/supabase-js@2.24.0):
- resolution: {integrity: sha512-dBlP2XR5KSSCBMgkWJMkc2UVA21V5AobKmekwIiHVvyVtzAiFqE5XWJiPV+kMlnRLzFXDeA0Z/CqdKTL/Kbs4A==}
+ /@radix-ui/react-primitive@1.0.3(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==
+ }
peerDependencies:
- '@supabase/supabase-js': ^2.21.0
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
dependencies:
- '@supabase/supabase-js': 2.24.0
+ '@babel/runtime': 7.23.9
+ '@radix-ui/react-slot': 1.0.2(@types/react@18.2.55)(react@18.2.0)
+ '@types/react': 18.2.55
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
dev: false
- /@supabase/functions-js@2.1.1:
- resolution: {integrity: sha512-bIR1Puae6W+1/MzPfYBWOG/SCWGo4B5CB7c0ZZksvliNEAzhxNBJ0UFKYINcGdGtxG8ZC+1xr3utWpNZNwnoRw==}
+ /@radix-ui/react-slot@1.0.2(@types/react@18.2.55)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==
+ }
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
dependencies:
- cross-fetch: 3.1.6
- transitivePeerDependencies:
- - encoding
+ '@babel/runtime': 7.23.9
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@types/react': 18.2.55
+ react: 18.2.0
dev: false
- /@supabase/gotrue-js@2.28.0:
- resolution: {integrity: sha512-uHDMnivhsarcS70fm4zj5+Kp2aqQjKnM0+DvzU0djv1vaVOzeB00B+mZ+KjrOkY3j1wM65joLX6kuIDbYdx6MA==}
+ /@radix-ui/react-toast@1.1.5(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==
+ }
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
dependencies:
- cross-fetch: 3.1.6
- transitivePeerDependencies:
- - encoding
+ '@babel/runtime': 7.23.9
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-collection': 1.0.3(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@radix-ui/react-dismissable-layer': 1.0.5(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-portal': 1.0.4(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@radix-ui/react-visually-hidden': 1.0.3(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.55
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
dev: false
- /@supabase/postgrest-js@1.7.0:
- resolution: {integrity: sha512-wLADHZ5jm7LljF4GigK0H2vc1wGupBY2hGYfb4fVo0UuyMftmA6tOYy+ZpMH/vPq01CUFwXGwvIke6kyqh/QDg==}
+ /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.55)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==
+ }
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
dependencies:
- cross-fetch: 3.1.6
- transitivePeerDependencies:
- - encoding
+ '@babel/runtime': 7.23.9
+ '@types/react': 18.2.55
+ react: 18.2.0
dev: false
- /@supabase/realtime-js@2.7.2:
- resolution: {integrity: sha512-Fi6xAl5PUkqnjl3wo4rdcQIbMG3+yTRX1aUZe/yfvTG84RMvmCXJ1yN6MmafVLeZpU1xkaz5Vx4L0tnHcLiy6w==}
+ /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.55)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==
+ }
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
dependencies:
- '@types/phoenix': 1.5.6
- '@types/websocket': 1.0.5
- websocket: 1.0.34
- transitivePeerDependencies:
- - supports-color
+ '@babel/runtime': 7.23.9
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@types/react': 18.2.55
+ react: 18.2.0
dev: false
- /@supabase/storage-js@2.5.1:
- resolution: {integrity: sha512-nkR0fQA9ScAtIKA3vNoPEqbZv1k5B5HVRYEvRWdlP6mUpFphM9TwPL2jZ/ztNGMTG5xT6SrHr+H7Ykz8qzbhjw==}
+ /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.55)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==
+ }
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
dependencies:
- cross-fetch: 3.1.6
- transitivePeerDependencies:
- - encoding
+ '@babel/runtime': 7.23.9
+ '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.55)(react@18.2.0)
+ '@types/react': 18.2.55
+ react: 18.2.0
dev: false
- /@supabase/supabase-js@2.24.0:
- resolution: {integrity: sha512-zrAm+hp6DBICqZ7xVPk+KofmlfjJWQzXuf2sHAyPz8XVjpha84z2OVWcow2aI10YkMOrPwhRtBBQYJOnh/fx2w==}
+ /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.55)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==
+ }
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
dependencies:
- '@supabase/functions-js': 2.1.1
- '@supabase/gotrue-js': 2.28.0
- '@supabase/postgrest-js': 1.7.0
- '@supabase/realtime-js': 2.7.2
- '@supabase/storage-js': 2.5.1
- cross-fetch: 3.1.6
- transitivePeerDependencies:
- - encoding
- - supports-color
+ '@babel/runtime': 7.23.9
+ '@types/react': 18.2.55
+ react: 18.2.0
dev: false
- /@swc/helpers@0.5.1:
- resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==}
+ /@radix-ui/react-visually-hidden@1.0.3(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==
+ }
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
dependencies:
- tslib: 2.5.2
+ '@babel/runtime': 7.23.9
+ '@radix-ui/react-primitive': 1.0.3(@types/react@18.2.55)(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.55
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
dev: false
- /@types/json5@0.0.29:
- resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ /@rushstack/eslint-patch@1.7.2:
+ resolution:
+ {
+ integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==
+ }
dev: true
- /@types/node@20.2.5:
- resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==}
+ /@stripe/stripe-js@2.4.0:
+ resolution:
+ {
+ integrity: sha512-WFkQx1mbs2b5+7looI9IV1BLa3bIApuN3ehp9FP58xGg7KL9hCHDECgW3BwO9l9L+xBPVAD7Yjn1EhGe6EDTeA==
+ }
+ dev: false
- /@types/phoenix@1.5.6:
- resolution: {integrity: sha512-e7jZ6I9uyRGsg7MNwQcarmBvRlbGb9DibbocE9crVnxqsy6C23RMxLWbJ2CQ3vgCW7taoL1L+F02EcjA6ld7XA==}
+ /@supabase/functions-js@2.2.0:
+ resolution:
+ {
+ integrity: sha512-lAmxD/mZ8vk2mg1CmXQWzK5mOHk7kDxAnxoyqUj2BVPvacEZ52P8nFkInEuSMqx6P6FKy64selW1Vyhui9racA==
+ }
+ dependencies:
+ '@supabase/node-fetch': 2.6.15
dev: false
- /@types/prop-types@15.7.5:
- resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
- dev: true
+ /@supabase/gotrue-js@2.62.2:
+ resolution:
+ {
+ integrity: sha512-AP6e6W9rQXFTEJ7sTTNYQrNf0LCcnt1hUW+RIgUK+Uh3jbWvcIST7wAlYyNZiMlS9+PYyymWQ+Ykz/rOYSO0+A==
+ }
+ dependencies:
+ '@supabase/node-fetch': 2.6.15
+ dev: false
- /@types/react@18.2.7:
- resolution: {integrity: sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==}
+ /@supabase/node-fetch@2.6.15:
+ resolution:
+ {
+ integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==
+ }
+ engines: { node: 4.x || >=6.0.0 }
dependencies:
- '@types/prop-types': 15.7.5
- '@types/scheduler': 0.16.3
- csstype: 3.1.2
- dev: true
+ whatwg-url: 5.0.0
+ dev: false
+
+ /@supabase/postgrest-js@1.11.0:
+ resolution:
+ {
+ integrity: sha512-Q2WwEid0I2rZfSZ0hDjmI20Fhu31Hzl4bwYTGJjLNMGbUOLoAQSaw0Hv/yHLZnl6OmOrH/trZqDiE5WocHN0oQ==
+ }
+ dependencies:
+ '@supabase/node-fetch': 2.6.15
+ dev: false
+
+ /@supabase/realtime-js@2.9.3:
+ resolution:
+ {
+ integrity: sha512-lAp50s2n3FhGJFq+wTSXLNIDPw5Y0Wxrgt44eM5nLSA3jZNUUP3Oq2Ccd1CbZdVntPCWLZvJaU//pAd2NE+QnQ==
+ }
+ dependencies:
+ '@supabase/node-fetch': 2.6.15
+ '@types/phoenix': 1.6.4
+ '@types/ws': 8.5.10
+ ws: 8.16.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: false
+
+ /@supabase/ssr@0.1.0(@supabase/supabase-js@2.39.3):
+ resolution:
+ {
+ integrity: sha512-bIVrkqjAK5G3KjkIMKYKtAOlCgRRplEWjrlyRyXSOYtgDieiOhk2ZyNAPsEOa1By9OZVxuX5eAW1fitdnuxayw==
+ }
+ peerDependencies:
+ '@supabase/supabase-js': ^2.33.1
+ dependencies:
+ '@supabase/supabase-js': 2.39.3
+ cookie: 0.5.0
+ ramda: 0.29.1
+ dev: false
+
+ /@supabase/storage-js@2.5.5:
+ resolution:
+ {
+ integrity: sha512-OpLoDRjFwClwc2cjTJZG8XviTiQH4Ik8sCiMK5v7et0MDu2QlXjCAW3ljxJB5+z/KazdMOTnySi+hysxWUPu3w==
+ }
+ dependencies:
+ '@supabase/node-fetch': 2.6.15
+ dev: false
- /@types/scheduler@0.16.3:
- resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==}
+ /@supabase/supabase-js@2.39.3:
+ resolution:
+ {
+ integrity: sha512-NoltJSaJNKDJNutO5sJPAAi5RIWrn1z2XH+ig1+cHDojT6BTN7TvZPNa3Kq3gFQWfO5H1N9El/bCTZJ3iFW2kQ==
+ }
+ dependencies:
+ '@supabase/functions-js': 2.2.0
+ '@supabase/gotrue-js': 2.62.2
+ '@supabase/node-fetch': 2.6.15
+ '@supabase/postgrest-js': 1.11.0
+ '@supabase/realtime-js': 2.9.3
+ '@supabase/storage-js': 2.5.5
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: false
+
+ /@swc/helpers@0.5.2:
+ resolution:
+ {
+ integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==
+ }
+ dependencies:
+ tslib: 2.6.2
+ dev: false
+
+ /@types/json5@0.0.29:
+ resolution:
+ {
+ integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+ }
dev: true
- /@types/websocket@1.0.5:
- resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==}
+ /@types/node@20.11.16:
+ resolution:
+ {
+ integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==
+ }
dependencies:
- '@types/node': 20.2.5
+ undici-types: 5.26.5
+
+ /@types/phoenix@1.6.4:
+ resolution:
+ {
+ integrity: sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA==
+ }
+ dev: false
+
+ /@types/prop-types@15.7.11:
+ resolution:
+ {
+ integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==
+ }
+
+ /@types/react@18.2.55:
+ resolution:
+ {
+ integrity: sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==
+ }
+ dependencies:
+ '@types/prop-types': 15.7.11
+ '@types/scheduler': 0.16.8
+ csstype: 3.1.3
+
+ /@types/scheduler@0.16.8:
+ resolution:
+ {
+ integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==
+ }
+
+ /@types/ws@8.5.10:
+ resolution:
+ {
+ integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==
+ }
+ dependencies:
+ '@types/node': 20.11.16
dev: false
- /@typescript-eslint/parser@5.59.8(eslint@8.41.0)(typescript@5.0.4):
- resolution: {integrity: sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3):
+ resolution:
+ {
+ integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==
+ }
+ engines: { node: ^16.0.0 || >=18.0.0 }
peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ eslint: ^7.0.0 || ^8.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
- '@typescript-eslint/scope-manager': 5.59.8
- '@typescript-eslint/types': 5.59.8
- '@typescript-eslint/typescript-estree': 5.59.8(typescript@5.0.4)
+ '@typescript-eslint/scope-manager': 6.21.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3)
+ '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4
- eslint: 8.41.0
- typescript: 5.0.4
+ eslint: 8.56.0
+ typescript: 5.3.3
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/scope-manager@5.59.8:
- resolution: {integrity: sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /@typescript-eslint/scope-manager@6.21.0:
+ resolution:
+ {
+ integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==
+ }
+ engines: { node: ^16.0.0 || >=18.0.0 }
dependencies:
- '@typescript-eslint/types': 5.59.8
- '@typescript-eslint/visitor-keys': 5.59.8
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/visitor-keys': 6.21.0
dev: true
- /@typescript-eslint/types@5.59.8:
- resolution: {integrity: sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /@typescript-eslint/types@6.21.0:
+ resolution:
+ {
+ integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==
+ }
+ engines: { node: ^16.0.0 || >=18.0.0 }
dev: true
- /@typescript-eslint/typescript-estree@5.59.8(typescript@5.0.4):
- resolution: {integrity: sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3):
+ resolution:
+ {
+ integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==
+ }
+ engines: { node: ^16.0.0 || >=18.0.0 }
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
- '@typescript-eslint/types': 5.59.8
- '@typescript-eslint/visitor-keys': 5.59.8
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
- semver: 7.5.1
- tsutils: 3.21.0(typescript@5.0.4)
- typescript: 5.0.4
+ minimatch: 9.0.3
+ semver: 7.6.0
+ ts-api-utils: 1.2.1(typescript@5.3.3)
+ typescript: 5.3.3
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/visitor-keys@5.59.8:
- resolution: {integrity: sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /@typescript-eslint/visitor-keys@6.21.0:
+ resolution:
+ {
+ integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==
+ }
+ engines: { node: ^16.0.0 || >=18.0.0 }
dependencies:
- '@typescript-eslint/types': 5.59.8
- eslint-visitor-keys: 3.4.1
+ '@typescript-eslint/types': 6.21.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@ungap/structured-clone@1.2.0:
+ resolution:
+ {
+ integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+ }
dev: true
- /acorn-jsx@5.3.2(acorn@8.8.2):
- resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ /acorn-jsx@5.3.2(acorn@8.11.3):
+ resolution:
+ {
+ integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+ }
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
- acorn: 8.8.2
+ acorn: 8.11.3
dev: true
- /acorn@8.8.2:
- resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
- engines: {node: '>=0.4.0'}
+ /acorn@8.11.3:
+ resolution:
+ {
+ integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
+ }
+ engines: { node: '>=0.4.0' }
hasBin: true
dev: true
+ /agent-base@7.1.0:
+ resolution:
+ {
+ integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==
+ }
+ engines: { node: '>= 14' }
+ dependencies:
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/ajv@6.12.6:
- resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ resolution:
+ {
+ integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ }
dependencies:
fast-deep-equal: 3.1.3
fast-json-stable-stringify: 2.1.0
@@ -741,245 +1021,377 @@ packages:
dev: true
/ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
- dev: true
-
- /ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
- dependencies:
- color-convert: 1.9.3
+ resolution:
+ {
+ integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+ }
+ engines: { node: '>=8' }
+
+ /ansi-regex@6.0.1:
+ resolution:
+ {
+ integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+ }
+ engines: { node: '>=12' }
/ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ }
+ engines: { node: '>=8' }
dependencies:
color-convert: 2.0.1
- dev: true
+
+ /ansi-styles@6.2.1:
+ resolution:
+ {
+ integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+ }
+ engines: { node: '>=12' }
/any-promise@1.3.0:
- resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+ resolution:
+ {
+ integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==
+ }
/anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
+ resolution:
+ {
+ integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ }
+ engines: { node: '>= 8' }
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
/arg@5.0.2:
- resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ resolution:
+ {
+ integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
+ }
/argparse@2.0.1:
- resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ resolution:
+ {
+ integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+ }
dev: true
- /aria-query@5.1.3:
- resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
+ /aria-query@5.3.0:
+ resolution:
+ {
+ integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==
+ }
dependencies:
- deep-equal: 2.2.1
+ dequal: 2.0.3
dev: true
- /array-buffer-byte-length@1.0.0:
- resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
+ /array-buffer-byte-length@1.0.1:
+ resolution:
+ {
+ integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- is-array-buffer: 3.0.2
+ call-bind: 1.0.6
+ is-array-buffer: 3.0.4
dev: true
- /array-includes@3.1.6:
- resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
- engines: {node: '>= 0.4'}
+ /array-includes@3.1.7:
+ resolution:
+ {
+ integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ get-intrinsic: 1.2.4
is-string: 1.0.7
dev: true
/array-union@2.1.0:
- resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+ }
+ engines: { node: '>=8' }
+ dev: true
+
+ /array.prototype.filter@1.0.3:
+ resolution:
+ {
+ integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-array-method-boxes-properly: 1.0.0
+ is-string: 1.0.7
dev: true
- /array.prototype.flat@1.3.1:
- resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- es-shim-unscopables: 1.0.0
+ /array.prototype.findlastindex@1.2.4:
+ resolution:
+ {
+ integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.0.2
+ dev: true
+
+ /array.prototype.flat@1.3.2:
+ resolution:
+ {
+ integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-shim-unscopables: 1.0.2
+ dev: true
+
+ /array.prototype.flatmap@1.3.2:
+ resolution:
+ {
+ integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-shim-unscopables: 1.0.2
+ dev: true
+
+ /array.prototype.tosorted@1.1.3:
+ resolution:
+ {
+ integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==
+ }
+ dependencies:
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.0.2
+ dev: true
+
+ /arraybuffer.prototype.slice@1.0.3:
+ resolution:
+ {
+ integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ array-buffer-byte-length: 1.0.1
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ is-array-buffer: 3.0.4
+ is-shared-array-buffer: 1.0.2
dev: true
- /array.prototype.flatmap@1.3.1:
- resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- es-shim-unscopables: 1.0.0
+ /ast-types-flow@0.0.8:
+ resolution:
+ {
+ integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==
+ }
dev: true
- /array.prototype.tosorted@1.1.1:
- resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==}
+ /asynciterator.prototype@1.0.0:
+ resolution:
+ {
+ integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==
+ }
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- es-shim-unscopables: 1.0.0
- get-intrinsic: 1.2.1
- dev: true
-
- /ast-types-flow@0.0.7:
- resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
+ has-symbols: 1.0.3
dev: true
- /autoprefixer@10.4.14(postcss@8.4.24):
- resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
- engines: {node: ^10 || ^12 || >=14}
+ /autoprefixer@10.4.17(postcss@8.4.35):
+ resolution:
+ {
+ integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==
+ }
+ engines: { node: ^10 || ^12 || >=14 }
hasBin: true
peerDependencies:
postcss: ^8.1.0
dependencies:
- browserslist: 4.21.7
- caniuse-lite: 1.0.30001491
- fraction.js: 4.2.0
+ browserslist: 4.22.3
+ caniuse-lite: 1.0.30001585
+ fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.0.0
- postcss: 8.4.24
+ postcss: 8.4.35
postcss-value-parser: 4.2.0
dev: true
- /available-typed-arrays@1.0.5:
- resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
- engines: {node: '>= 0.4'}
+ /available-typed-arrays@1.0.6:
+ resolution:
+ {
+ integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==
+ }
+ engines: { node: '>= 0.4' }
dev: true
- /axe-core@4.7.2:
- resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==}
- engines: {node: '>=4'}
+ /axe-core@4.7.0:
+ resolution:
+ {
+ integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==
+ }
+ engines: { node: '>=4' }
dev: true
- /axobject-query@3.1.1:
- resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==}
+ /axobject-query@3.2.1:
+ resolution:
+ {
+ integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==
+ }
dependencies:
- deep-equal: 2.2.1
+ dequal: 2.0.3
dev: true
/balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-
- /big-integer@1.6.51:
- resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
- engines: {node: '>=0.6'}
- dev: true
-
- /bin-links@4.0.1:
- resolution: {integrity: sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- dependencies:
- cmd-shim: 6.0.1
+ resolution:
+ {
+ integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+ }
+
+ /bin-links@4.0.3:
+ resolution:
+ {
+ integrity: sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA==
+ }
+ engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 }
+ dependencies:
+ cmd-shim: 6.0.2
npm-normalize-package-bin: 3.0.1
read-cmd-shim: 4.0.0
write-file-atomic: 5.0.1
dev: true
/binary-extensions@2.2.0:
- resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+ }
+ engines: { node: '>=8' }
- /bplist-parser@0.2.0:
- resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
- engines: {node: '>= 5.10.0'}
+ /brace-expansion@1.1.11:
+ resolution:
+ {
+ integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ }
dependencies:
- big-integer: 1.6.51
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
dev: true
- /brace-expansion@1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ /brace-expansion@2.0.1:
+ resolution:
+ {
+ integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ }
dependencies:
balanced-match: 1.0.2
- concat-map: 0.0.1
/braces@3.0.2:
- resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ }
+ engines: { node: '>=8' }
dependencies:
fill-range: 7.0.1
- /browserslist@4.21.7:
- resolution: {integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ /browserslist@4.22.3:
+ resolution:
+ {
+ integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==
+ }
+ engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 }
hasBin: true
dependencies:
- caniuse-lite: 1.0.30001491
- electron-to-chromium: 1.4.414
- node-releases: 2.0.12
- update-browserslist-db: 1.0.11(browserslist@4.21.7)
-
- /bufferutil@4.0.7:
- resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==}
- engines: {node: '>=6.14.2'}
- requiresBuild: true
- dependencies:
- node-gyp-build: 4.6.0
- dev: false
-
- /bundle-name@3.0.0:
- resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==}
- engines: {node: '>=12'}
- dependencies:
- run-applescript: 5.0.0
+ caniuse-lite: 1.0.30001585
+ electron-to-chromium: 1.4.661
+ node-releases: 2.0.14
+ update-browserslist-db: 1.0.13(browserslist@4.22.3)
dev: true
/busboy@1.6.0:
- resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
- engines: {node: '>=10.16.0'}
+ resolution:
+ {
+ integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==
+ }
+ engines: { node: '>=10.16.0' }
dependencies:
streamsearch: 1.1.0
dev: false
- /call-bind@1.0.2:
- resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ /call-bind@1.0.6:
+ resolution:
+ {
+ integrity: sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- function-bind: 1.1.1
- get-intrinsic: 1.2.1
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ set-function-length: 1.2.1
/callsites@3.1.0:
- resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
- engines: {node: '>=6'}
+ resolution:
+ {
+ integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+ }
+ engines: { node: '>=6' }
dev: true
/camelcase-css@2.0.1:
- resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
- engines: {node: '>= 6'}
-
- /caniuse-lite@1.0.30001491:
- resolution: {integrity: sha512-17EYIi4TLnPiTzVKMveIxU5ETlxbSO3B6iPvMbprqnKh4qJsQGk5Nh1Lp4jIMAE0XfrujsJuWZAM3oJdMHaKBA==}
-
- /chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
+ resolution:
+ {
+ integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
+ }
+ engines: { node: '>= 6' }
+
+ /caniuse-lite@1.0.30001585:
+ resolution:
+ {
+ integrity: sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==
+ }
/chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ }
+ engines: { node: '>=10' }
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
dev: true
- /chokidar@3.5.3:
- resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
- engines: {node: '>= 8.10.0'}
+ /chokidar@3.6.0:
+ resolution:
+ {
+ integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ }
+ engines: { node: '>= 8.10.0' }
dependencies:
anymatch: 3.1.3
braces: 3.0.2
@@ -989,110 +1401,145 @@ packages:
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
- fsevents: 2.3.2
+ fsevents: 2.3.3
/chownr@2.0.0:
- resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+ }
+ engines: { node: '>=10' }
dev: true
- /classnames@2.3.2:
- resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==}
+ /class-variance-authority@0.7.0:
+ resolution:
+ {
+ integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==
+ }
+ dependencies:
+ clsx: 2.0.0
+ dev: false
+
+ /classnames@2.5.1:
+ resolution:
+ {
+ integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
+ }
dev: false
/client-only@0.0.1:
- resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+ resolution:
+ {
+ integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
+ }
dev: false
- /cmd-shim@6.0.1:
- resolution: {integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- dev: true
+ /clsx@2.0.0:
+ resolution:
+ {
+ integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==
+ }
+ engines: { node: '>=6' }
+ dev: false
- /color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
- dependencies:
- color-name: 1.1.3
+ /clsx@2.1.0:
+ resolution:
+ {
+ integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==
+ }
+ engines: { node: '>=6' }
+ dev: false
+
+ /cmd-shim@6.0.2:
+ resolution:
+ {
+ integrity: sha512-+FFYbB0YLaAkhkcrjkyNLYDiOsFSfRjwjY19LXk/psmMx1z00xlCv7hhQoTGXXIKi+YXHL/iiFo8NqMVQX9nOw==
+ }
+ engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 }
+ dev: true
/color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
+ resolution:
+ {
+ integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ }
+ engines: { node: '>=7.0.0' }
dependencies:
color-name: 1.1.4
- dev: true
-
- /color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
/color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
- dev: true
+ resolution:
+ {
+ integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+ }
/commander@4.1.1:
- resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
- engines: {node: '>= 6'}
+ resolution:
+ {
+ integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+ }
+ engines: { node: '>= 6' }
/concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
- /convert-source-map@1.9.0:
- resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
-
- /cross-fetch@3.1.6:
- resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==}
- dependencies:
- node-fetch: 2.6.11
- transitivePeerDependencies:
- - encoding
+ resolution:
+ {
+ integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+ }
+ dev: true
+
+ /cookie@0.5.0:
+ resolution:
+ {
+ integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
+ }
+ engines: { node: '>= 0.6' }
dev: false
/cross-spawn@7.0.3:
- resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
- engines: {node: '>= 8'}
+ resolution:
+ {
+ integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ }
+ engines: { node: '>= 8' }
dependencies:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
- dev: true
/cssesc@3.0.0:
- resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
- engines: {node: '>=4'}
+ resolution:
+ {
+ integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+ }
+ engines: { node: '>=4' }
hasBin: true
- /csstype@3.1.2:
- resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
- dev: true
-
- /d@1.0.1:
- resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==}
- dependencies:
- es5-ext: 0.10.62
- type: 1.2.0
- dev: false
+ /csstype@3.1.3:
+ resolution:
+ {
+ integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+ }
/damerau-levenshtein@1.0.8:
- resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+ resolution:
+ {
+ integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==
+ }
dev: true
/data-uri-to-buffer@4.0.1:
- resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
- engines: {node: '>= 12'}
+ resolution:
+ {
+ integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==
+ }
+ engines: { node: '>= 12' }
dev: true
- /debug@2.6.9:
- resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
- dependencies:
- ms: 2.0.0
- dev: false
-
/debug@3.2.7:
- resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ resolution:
+ {
+ integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ }
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
@@ -1103,8 +1550,11 @@ packages:
dev: true
/debug@4.3.4:
- resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
- engines: {node: '>=6.0'}
+ resolution:
+ {
+ integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ }
+ engines: { node: '>=6.0' }
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
@@ -1112,225 +1562,263 @@ packages:
optional: true
dependencies:
ms: 2.1.2
-
- /deep-equal@2.2.1:
- resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==}
- dependencies:
- array-buffer-byte-length: 1.0.0
- call-bind: 1.0.2
- es-get-iterator: 1.1.3
- get-intrinsic: 1.2.1
- is-arguments: 1.1.1
- is-array-buffer: 3.0.2
- is-date-object: 1.0.5
- is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
- isarray: 2.0.5
- object-is: 1.1.5
- object-keys: 1.1.1
- object.assign: 4.1.4
- regexp.prototype.flags: 1.5.0
- side-channel: 1.0.4
- which-boxed-primitive: 1.0.2
- which-collection: 1.0.1
- which-typed-array: 1.1.9
dev: true
/deep-is@0.1.4:
- resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ resolution:
+ {
+ integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+ }
dev: true
- /default-browser-id@3.0.0:
- resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
- engines: {node: '>=12'}
+ /define-data-property@1.1.2:
+ resolution:
+ {
+ integrity: sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- bplist-parser: 0.2.0
- untildify: 4.0.0
- dev: true
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.1
- /default-browser@4.0.0:
- resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==}
- engines: {node: '>=14.16'}
+ /define-properties@1.2.1:
+ resolution:
+ {
+ integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- bundle-name: 3.0.0
- default-browser-id: 3.0.0
- execa: 7.1.1
- titleize: 3.0.0
- dev: true
-
- /define-lazy-prop@3.0.0:
- resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
- engines: {node: '>=12'}
+ define-data-property: 1.1.2
+ has-property-descriptors: 1.0.1
+ object-keys: 1.1.1
dev: true
- /define-properties@1.2.0:
- resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-property-descriptors: 1.0.0
- object-keys: 1.1.1
+ /dequal@2.0.3:
+ resolution:
+ {
+ integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
+ }
+ engines: { node: '>=6' }
dev: true
/didyoumean@1.2.2:
- resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+ resolution:
+ {
+ integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
+ }
/dir-glob@3.0.1:
- resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ }
+ engines: { node: '>=8' }
dependencies:
path-type: 4.0.0
dev: true
/dlv@1.1.3:
- resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+ resolution:
+ {
+ integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
+ }
/doctrine@2.1.0:
- resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
- engines: {node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ }
+ engines: { node: '>=0.10.0' }
dependencies:
esutils: 2.0.3
dev: true
/doctrine@3.0.0:
- resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
- engines: {node: '>=6.0.0'}
+ resolution:
+ {
+ integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ }
+ engines: { node: '>=6.0.0' }
dependencies:
esutils: 2.0.3
dev: true
- /electron-to-chromium@1.4.414:
- resolution: {integrity: sha512-RRuCvP6ekngVh2SAJaOKT/hxqc9JAsK+Pe0hP5tGQIfonU2Zy9gMGdJ+mBdyl/vNucMG6gkXYtuM4H/1giws5w==}
+ /eastasianwidth@0.2.0:
+ resolution:
+ {
+ integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+ }
- /emoji-regex@9.2.2:
- resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ /electron-to-chromium@1.4.661:
+ resolution:
+ {
+ integrity: sha512-AFg4wDHSOk5F+zA8aR+SVIOabu7m0e7BiJnigCvPXzIGy731XENw/lmNxTySpVFtkFEy+eyt4oHhh5FF3NjQNw==
+ }
dev: true
- /enhanced-resolve@5.14.1:
- resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==}
- engines: {node: '>=10.13.0'}
+ /emoji-regex@8.0.0:
+ resolution:
+ {
+ integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+ }
+
+ /emoji-regex@9.2.2:
+ resolution:
+ {
+ integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+ }
+
+ /enhanced-resolve@5.15.0:
+ resolution:
+ {
+ integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==
+ }
+ engines: { node: '>=10.13.0' }
dependencies:
graceful-fs: 4.2.11
tapable: 2.2.1
dev: true
- /es-abstract@1.21.2:
- resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
- engines: {node: '>= 0.4'}
+ /es-abstract@1.22.3:
+ resolution:
+ {
+ integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- array-buffer-byte-length: 1.0.0
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- es-set-tostringtag: 2.0.1
+ array-buffer-byte-length: 1.0.1
+ arraybuffer.prototype.slice: 1.0.3
+ available-typed-arrays: 1.0.6
+ call-bind: 1.0.6
+ es-set-tostringtag: 2.0.2
es-to-primitive: 1.2.1
- function.prototype.name: 1.1.5
- get-intrinsic: 1.2.1
- get-symbol-description: 1.0.0
+ function.prototype.name: 1.1.6
+ get-intrinsic: 1.2.4
+ get-symbol-description: 1.0.2
globalthis: 1.0.3
gopd: 1.0.1
- has: 1.0.3
- has-property-descriptors: 1.0.0
+ has-property-descriptors: 1.0.1
has-proto: 1.0.1
has-symbols: 1.0.3
- internal-slot: 1.0.5
- is-array-buffer: 3.0.2
+ hasown: 2.0.0
+ internal-slot: 1.0.7
+ is-array-buffer: 3.0.4
is-callable: 1.2.7
is-negative-zero: 2.0.2
is-regex: 1.1.4
is-shared-array-buffer: 1.0.2
is-string: 1.0.7
- is-typed-array: 1.1.10
+ is-typed-array: 1.1.13
is-weakref: 1.0.2
- object-inspect: 1.12.3
+ object-inspect: 1.13.1
object-keys: 1.1.1
- object.assign: 4.1.4
- regexp.prototype.flags: 1.5.0
- safe-regex-test: 1.0.0
- string.prototype.trim: 1.2.7
- string.prototype.trimend: 1.0.6
- string.prototype.trimstart: 1.0.6
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.1
+ safe-array-concat: 1.1.0
+ safe-regex-test: 1.0.3
+ string.prototype.trim: 1.2.8
+ string.prototype.trimend: 1.0.7
+ string.prototype.trimstart: 1.0.7
+ typed-array-buffer: 1.0.1
+ typed-array-byte-length: 1.0.0
+ typed-array-byte-offset: 1.0.0
typed-array-length: 1.0.4
unbox-primitive: 1.0.2
- which-typed-array: 1.1.9
- dev: true
-
- /es-get-iterator@1.1.3:
- resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ which-typed-array: 1.1.14
+ dev: true
+
+ /es-array-method-boxes-properly@1.0.0:
+ resolution:
+ {
+ integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==
+ }
+ dev: true
+
+ /es-errors@1.3.0:
+ resolution:
+ {
+ integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+ }
+ engines: { node: '>= 0.4' }
+
+ /es-iterator-helpers@1.0.15:
+ resolution:
+ {
+ integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==
+ }
+ dependencies:
+ asynciterator.prototype: 1.0.0
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-set-tostringtag: 2.0.2
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ globalthis: 1.0.3
+ has-property-descriptors: 1.0.1
+ has-proto: 1.0.1
has-symbols: 1.0.3
- is-arguments: 1.1.1
- is-map: 2.0.2
- is-set: 2.0.2
- is-string: 1.0.7
- isarray: 2.0.5
- stop-iteration-iterator: 1.0.0
+ internal-slot: 1.0.7
+ iterator.prototype: 1.1.2
+ safe-array-concat: 1.1.0
dev: true
- /es-set-tostringtag@2.0.1:
- resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
- engines: {node: '>= 0.4'}
+ /es-set-tostringtag@2.0.2:
+ resolution:
+ {
+ integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- get-intrinsic: 1.2.1
- has: 1.0.3
- has-tostringtag: 1.0.0
+ get-intrinsic: 1.2.4
+ has-tostringtag: 1.0.2
+ hasown: 2.0.0
dev: true
- /es-shim-unscopables@1.0.0:
- resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
+ /es-shim-unscopables@1.0.2:
+ resolution:
+ {
+ integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
+ }
dependencies:
- has: 1.0.3
+ hasown: 2.0.0
dev: true
/es-to-primitive@1.2.1:
- resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
is-callable: 1.2.7
is-date-object: 1.0.5
is-symbol: 1.0.4
dev: true
- /es5-ext@0.10.62:
- resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==}
- engines: {node: '>=0.10'}
- requiresBuild: true
- dependencies:
- es6-iterator: 2.0.3
- es6-symbol: 3.1.3
- next-tick: 1.1.0
- dev: false
-
- /es6-iterator@2.0.3:
- resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
- dependencies:
- d: 1.0.1
- es5-ext: 0.10.62
- es6-symbol: 3.1.3
- dev: false
-
- /es6-symbol@3.1.3:
- resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==}
- dependencies:
- d: 1.0.1
- ext: 1.7.0
- dev: false
-
- /escalade@3.1.1:
- resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
- engines: {node: '>=6'}
-
- /escape-string-regexp@1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
-
- /escape-string-regexp@4.0.0:
- resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
- engines: {node: '>=10'}
+ /escalade@3.1.2:
+ resolution:
+ {
+ integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+ }
+ engines: { node: '>=6' }
dev: true
- /eslint-config-next@13.4.3(eslint@8.41.0)(typescript@5.0.4):
- resolution: {integrity: sha512-1lXwdFi29fKxzeugof/TUE7lpHyJQt5+U4LaUHyvQfHjvsWO77vFNicJv5sX6k0VDVSbnfz0lw+avxI+CinbMg==}
+ /escape-string-regexp@4.0.0:
+ resolution:
+ {
+ integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+ }
+ engines: { node: '>=10' }
+ dev: true
+
+ /eslint-config-next@14.1.0(eslint@8.56.0)(typescript@5.3.3):
+ resolution:
+ {
+ integrity: sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg==
+ }
peerDependencies:
eslint: ^7.23.0 || ^8.0.0
typescript: '>=3.3.1'
@@ -1338,58 +1826,66 @@ packages:
typescript:
optional: true
dependencies:
- '@next/eslint-plugin-next': 13.4.3
- '@rushstack/eslint-patch': 1.3.0
- '@typescript-eslint/parser': 5.59.8(eslint@8.41.0)(typescript@5.0.4)
- eslint: 8.41.0
- eslint-import-resolver-node: 0.3.7
- eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.8)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.41.0)
- eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.8)(eslint-import-resolver-typescript@3.5.5)(eslint@8.41.0)
- eslint-plugin-jsx-a11y: 6.7.1(eslint@8.41.0)
- eslint-plugin-react: 7.32.2(eslint@8.41.0)
- eslint-plugin-react-hooks: 4.6.0(eslint@8.41.0)
- typescript: 5.0.4
+ '@next/eslint-plugin-next': 14.1.0
+ '@rushstack/eslint-patch': 1.7.2
+ '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
+ eslint: 8.56.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
+ eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0)
+ eslint-plugin-react: 7.33.2(eslint@8.56.0)
+ eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0)
+ typescript: 5.3.3
transitivePeerDependencies:
- eslint-import-resolver-webpack
- supports-color
dev: true
- /eslint-config-prettier@8.8.0(eslint@8.41.0):
- resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==}
+ /eslint-config-prettier@9.1.0(eslint@8.56.0):
+ resolution:
+ {
+ integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
+ }
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
dependencies:
- eslint: 8.41.0
+ eslint: 8.56.0
dev: true
- /eslint-import-resolver-node@0.3.7:
- resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==}
+ /eslint-import-resolver-node@0.3.9:
+ resolution:
+ {
+ integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==
+ }
dependencies:
debug: 3.2.7
- is-core-module: 2.12.1
- resolve: 1.22.2
+ is-core-module: 2.13.1
+ resolve: 1.22.8
transitivePeerDependencies:
- supports-color
dev: true
- /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.8)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.41.0):
- resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==}
- engines: {node: ^14.18.0 || >=16.0.0}
+ /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0):
+ resolution:
+ {
+ integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==
+ }
+ engines: { node: ^14.18.0 || >=16.0.0 }
peerDependencies:
eslint: '*'
eslint-plugin-import: '*'
dependencies:
debug: 4.3.4
- enhanced-resolve: 5.14.1
- eslint: 8.41.0
- eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.8)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.41.0)
- eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.8)(eslint-import-resolver-typescript@3.5.5)(eslint@8.41.0)
- get-tsconfig: 4.6.0
- globby: 13.1.4
- is-core-module: 2.12.1
+ enhanced-resolve: 5.15.0
+ eslint: 8.56.0
+ eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
+ fast-glob: 3.3.2
+ get-tsconfig: 4.7.2
+ is-core-module: 2.13.1
is-glob: 4.0.3
- synckit: 0.8.5
transitivePeerDependencies:
- '@typescript-eslint/parser'
- eslint-import-resolver-node
@@ -1397,9 +1893,12 @@ packages:
- supports-color
dev: true
- /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.8)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.41.0):
- resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
- engines: {node: '>=4'}
+ /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0):
+ resolution:
+ {
+ integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==
+ }
+ engines: { node: '>=4' }
peerDependencies:
'@typescript-eslint/parser': '*'
eslint: '*'
@@ -1418,18 +1917,21 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
- '@typescript-eslint/parser': 5.59.8(eslint@8.41.0)(typescript@5.0.4)
+ '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
debug: 3.2.7
- eslint: 8.41.0
- eslint-import-resolver-node: 0.3.7
- eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.8)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.41.0)
+ eslint: 8.56.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0)
transitivePeerDependencies:
- supports-color
dev: true
- /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.8)(eslint-import-resolver-typescript@3.5.5)(eslint@8.41.0):
- resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==}
- engines: {node: '>=4'}
+ /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0):
+ resolution:
+ {
+ integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==
+ }
+ engines: { node: '>=4' }
peerDependencies:
'@typescript-eslint/parser': '*'
eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
@@ -1437,142 +1939,166 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
- '@typescript-eslint/parser': 5.59.8(eslint@8.41.0)(typescript@5.0.4)
- array-includes: 3.1.6
- array.prototype.flat: 1.3.1
- array.prototype.flatmap: 1.3.1
+ '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
+ array-includes: 3.1.7
+ array.prototype.findlastindex: 1.2.4
+ array.prototype.flat: 1.3.2
+ array.prototype.flatmap: 1.3.2
debug: 3.2.7
doctrine: 2.1.0
- eslint: 8.41.0
- eslint-import-resolver-node: 0.3.7
- eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.8)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.41.0)
- has: 1.0.3
- is-core-module: 2.12.1
+ eslint: 8.56.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)
+ hasown: 2.0.0
+ is-core-module: 2.13.1
is-glob: 4.0.3
minimatch: 3.1.2
- object.values: 1.1.6
- resolve: 1.22.2
- semver: 6.3.0
- tsconfig-paths: 3.14.2
+ object.fromentries: 2.0.7
+ object.groupby: 1.0.2
+ object.values: 1.1.7
+ semver: 6.3.1
+ tsconfig-paths: 3.15.0
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
dev: true
- /eslint-plugin-jsx-a11y@6.7.1(eslint@8.41.0):
- resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==}
- engines: {node: '>=4.0'}
+ /eslint-plugin-jsx-a11y@6.8.0(eslint@8.56.0):
+ resolution:
+ {
+ integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==
+ }
+ engines: { node: '>=4.0' }
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
dependencies:
- '@babel/runtime': 7.22.3
- aria-query: 5.1.3
- array-includes: 3.1.6
- array.prototype.flatmap: 1.3.1
- ast-types-flow: 0.0.7
- axe-core: 4.7.2
- axobject-query: 3.1.1
+ '@babel/runtime': 7.23.9
+ aria-query: 5.3.0
+ array-includes: 3.1.7
+ array.prototype.flatmap: 1.3.2
+ ast-types-flow: 0.0.8
+ axe-core: 4.7.0
+ axobject-query: 3.2.1
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
- eslint: 8.41.0
- has: 1.0.3
- jsx-ast-utils: 3.3.3
- language-tags: 1.0.5
+ es-iterator-helpers: 1.0.15
+ eslint: 8.56.0
+ hasown: 2.0.0
+ jsx-ast-utils: 3.3.5
+ language-tags: 1.0.9
minimatch: 3.1.2
- object.entries: 1.1.6
- object.fromentries: 2.0.6
- semver: 6.3.0
+ object.entries: 1.1.7
+ object.fromentries: 2.0.7
dev: true
- /eslint-plugin-react-hooks@4.6.0(eslint@8.41.0):
- resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
- engines: {node: '>=10'}
+ /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0):
+ resolution:
+ {
+ integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
+ }
+ engines: { node: '>=10' }
peerDependencies:
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
dependencies:
- eslint: 8.41.0
+ eslint: 8.56.0
dev: true
- /eslint-plugin-react@7.32.2(eslint@8.41.0):
- resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==}
- engines: {node: '>=4'}
+ /eslint-plugin-react@7.33.2(eslint@8.56.0):
+ resolution:
+ {
+ integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==
+ }
+ engines: { node: '>=4' }
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
dependencies:
- array-includes: 3.1.6
- array.prototype.flatmap: 1.3.1
- array.prototype.tosorted: 1.1.1
+ array-includes: 3.1.7
+ array.prototype.flatmap: 1.3.2
+ array.prototype.tosorted: 1.1.3
doctrine: 2.1.0
- eslint: 8.41.0
+ es-iterator-helpers: 1.0.15
+ eslint: 8.56.0
estraverse: 5.3.0
- jsx-ast-utils: 3.3.3
+ jsx-ast-utils: 3.3.5
minimatch: 3.1.2
- object.entries: 1.1.6
- object.fromentries: 2.0.6
- object.hasown: 1.1.2
- object.values: 1.1.6
+ object.entries: 1.1.7
+ object.fromentries: 2.0.7
+ object.hasown: 1.1.3
+ object.values: 1.1.7
prop-types: 15.8.1
- resolve: 2.0.0-next.4
- semver: 6.3.0
- string.prototype.matchall: 4.0.8
+ resolve: 2.0.0-next.5
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.10
dev: true
- /eslint-plugin-tailwindcss@3.12.0(tailwindcss@3.3.2):
- resolution: {integrity: sha512-DMfg8NcSV04V1v3iBgJGEhmRuapW36XZXyRV8WHdNFGEXGUkBwM9R8MujguKXeQKBG6VhjiX4t98rhzXdIlUFw==}
- engines: {node: '>=12.13.0'}
+ /eslint-plugin-tailwindcss@3.14.2(tailwindcss@3.4.1):
+ resolution:
+ {
+ integrity: sha512-fNzdf4poZP2yQC0xC2prQxMuArMSb5mnellLQvwb9HC3NcLzxs+0IVKWIg1BqUqyui0c+bbjMmhWcKUWK67SLQ==
+ }
+ engines: { node: '>=12.13.0' }
peerDependencies:
- tailwindcss: ^3.3.2
+ tailwindcss: ^3.4.0
dependencies:
- fast-glob: 3.2.12
- postcss: 8.4.24
- tailwindcss: 3.3.2
+ fast-glob: 3.3.2
+ postcss: 8.4.35
+ tailwindcss: 3.4.1
dev: true
- /eslint-scope@7.2.0:
- resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /eslint-scope@7.2.2:
+ resolution:
+ {
+ integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
+ }
+ engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
dev: true
- /eslint-visitor-keys@3.4.1:
- resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /eslint-visitor-keys@3.4.3:
+ resolution:
+ {
+ integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+ }
+ engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
dev: true
- /eslint@8.41.0:
- resolution: {integrity: sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /eslint@8.56.0:
+ resolution:
+ {
+ integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==
+ }
+ engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
hasBin: true
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0)
- '@eslint-community/regexpp': 4.5.1
- '@eslint/eslintrc': 2.0.3
- '@eslint/js': 8.41.0
- '@humanwhocodes/config-array': 0.11.8
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
+ '@eslint-community/regexpp': 4.10.0
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.56.0
+ '@humanwhocodes/config-array': 0.11.14
'@humanwhocodes/module-importer': 1.0.1
'@nodelib/fs.walk': 1.2.8
+ '@ungap/structured-clone': 1.2.0
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
debug: 4.3.4
doctrine: 3.0.0
escape-string-regexp: 4.0.0
- eslint-scope: 7.2.0
- eslint-visitor-keys: 3.4.1
- espree: 9.5.2
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
esquery: 1.5.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 6.0.1
find-up: 5.0.0
glob-parent: 6.0.2
- globals: 13.20.0
+ globals: 13.24.0
graphemer: 1.4.0
- ignore: 5.2.4
- import-fresh: 3.3.0
+ ignore: 5.3.1
imurmurhash: 0.1.4
is-glob: 4.0.3
is-path-inside: 3.0.3
@@ -1582,90 +2108,74 @@ packages:
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
- optionator: 0.9.1
+ optionator: 0.9.3
strip-ansi: 6.0.1
- strip-json-comments: 3.1.1
text-table: 0.2.0
transitivePeerDependencies:
- supports-color
dev: true
- /espree@9.5.2:
- resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ /espree@9.6.1:
+ resolution:
+ {
+ integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
+ }
+ engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
dependencies:
- acorn: 8.8.2
- acorn-jsx: 5.3.2(acorn@8.8.2)
- eslint-visitor-keys: 3.4.1
+ acorn: 8.11.3
+ acorn-jsx: 5.3.2(acorn@8.11.3)
+ eslint-visitor-keys: 3.4.3
dev: true
/esquery@1.5.0:
- resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
- engines: {node: '>=0.10'}
+ resolution:
+ {
+ integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+ }
+ engines: { node: '>=0.10' }
dependencies:
estraverse: 5.3.0
dev: true
/esrecurse@4.3.0:
- resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
- engines: {node: '>=4.0'}
+ resolution:
+ {
+ integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ }
+ engines: { node: '>=4.0' }
dependencies:
estraverse: 5.3.0
dev: true
/estraverse@5.3.0:
- resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
- engines: {node: '>=4.0'}
+ resolution:
+ {
+ integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+ }
+ engines: { node: '>=4.0' }
dev: true
/esutils@2.0.3:
- resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /execa@5.1.1:
- resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
- engines: {node: '>=10'}
- dependencies:
- cross-spawn: 7.0.3
- get-stream: 6.0.1
- human-signals: 2.1.0
- is-stream: 2.0.1
- merge-stream: 2.0.0
- npm-run-path: 4.0.1
- onetime: 5.1.2
- signal-exit: 3.0.7
- strip-final-newline: 2.0.0
+ resolution:
+ {
+ integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+ }
+ engines: { node: '>=0.10.0' }
dev: true
- /execa@7.1.1:
- resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==}
- engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
- dependencies:
- cross-spawn: 7.0.3
- get-stream: 6.0.1
- human-signals: 4.3.1
- is-stream: 3.0.0
- merge-stream: 2.0.0
- npm-run-path: 5.1.0
- onetime: 6.0.0
- signal-exit: 3.0.7
- strip-final-newline: 3.0.0
- dev: true
-
- /ext@1.7.0:
- resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
- dependencies:
- type: 2.7.2
- dev: false
-
/fast-deep-equal@3.1.3:
- resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ resolution:
+ {
+ integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+ }
dev: true
- /fast-glob@3.2.12:
- resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
- engines: {node: '>=8.6.0'}
+ /fast-glob@3.3.2:
+ resolution:
+ {
+ integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ }
+ engines: { node: '>=8.6.0' }
dependencies:
'@nodelib/fs.stat': 2.0.5
'@nodelib/fs.walk': 1.2.8
@@ -1674,176 +2184,247 @@ packages:
micromatch: 4.0.5
/fast-json-stable-stringify@2.1.0:
- resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ resolution:
+ {
+ integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+ }
dev: true
/fast-levenshtein@2.0.6:
- resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ resolution:
+ {
+ integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+ }
dev: true
- /fastq@1.15.0:
- resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ /fastq@1.17.1:
+ resolution:
+ {
+ integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+ }
dependencies:
reusify: 1.0.4
/fetch-blob@3.2.0:
- resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
- engines: {node: ^12.20 || >= 14.13}
+ resolution:
+ {
+ integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==
+ }
+ engines: { node: ^12.20 || >= 14.13 }
dependencies:
node-domexception: 1.0.0
- web-streams-polyfill: 3.2.1
+ web-streams-polyfill: 3.3.2
dev: true
/file-entry-cache@6.0.1:
- resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
- engines: {node: ^10.12.0 || >=12.0.0}
+ resolution:
+ {
+ integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ }
+ engines: { node: ^10.12.0 || >=12.0.0 }
dependencies:
- flat-cache: 3.0.4
+ flat-cache: 3.2.0
dev: true
/fill-range@7.0.1:
- resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ }
+ engines: { node: '>=8' }
dependencies:
to-regex-range: 5.0.1
/find-up@5.0.0:
- resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ }
+ engines: { node: '>=10' }
dependencies:
locate-path: 6.0.0
path-exists: 4.0.0
dev: true
- /flat-cache@3.0.4:
- resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
- engines: {node: ^10.12.0 || >=12.0.0}
+ /flat-cache@3.2.0:
+ resolution:
+ {
+ integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
+ }
+ engines: { node: ^10.12.0 || >=12.0.0 }
dependencies:
- flatted: 3.2.7
+ flatted: 3.2.9
+ keyv: 4.5.4
rimraf: 3.0.2
dev: true
- /flatted@3.2.7:
- resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
+ /flatted@3.2.9:
+ resolution:
+ {
+ integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==
+ }
dev: true
/for-each@0.3.3:
- resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+ resolution:
+ {
+ integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ }
dependencies:
is-callable: 1.2.7
dev: true
+ /foreground-child@3.1.1:
+ resolution:
+ {
+ integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==
+ }
+ engines: { node: '>=14' }
+ dependencies:
+ cross-spawn: 7.0.3
+ signal-exit: 4.1.0
+
/formdata-polyfill@4.0.10:
- resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
- engines: {node: '>=12.20.0'}
+ resolution:
+ {
+ integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==
+ }
+ engines: { node: '>=12.20.0' }
dependencies:
fetch-blob: 3.2.0
dev: true
- /fraction.js@4.2.0:
- resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
+ /fraction.js@4.3.7:
+ resolution:
+ {
+ integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
+ }
dev: true
/fs-minipass@2.1.0:
- resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
- engines: {node: '>= 8'}
+ resolution:
+ {
+ integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ }
+ engines: { node: '>= 8' }
dependencies:
minipass: 3.3.6
dev: true
/fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-
- /fsevents@2.3.2:
- resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ resolution:
+ {
+ integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+ }
+ dev: true
+
+ /fsevents@2.3.3:
+ resolution:
+ {
+ integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+ }
+ engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 }
os: [darwin]
requiresBuild: true
optional: true
- /function-bind@1.1.1:
- resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
-
- /function.prototype.name@1.1.5:
- resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
+ /function-bind@1.1.2:
+ resolution:
+ {
+ integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+ }
+
+ /function.prototype.name@1.1.6:
+ resolution:
+ {
+ integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
functions-have-names: 1.2.3
dev: true
/functions-have-names@1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ resolution:
+ {
+ integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+ }
dev: true
- /gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
-
- /get-intrinsic@1.2.1:
- resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
+ /get-intrinsic@1.2.4:
+ resolution:
+ {
+ integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- function-bind: 1.1.1
- has: 1.0.3
+ es-errors: 1.3.0
+ function-bind: 1.1.2
has-proto: 1.0.1
has-symbols: 1.0.3
+ hasown: 2.0.0
- /get-stream@6.0.1:
- resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
- engines: {node: '>=10'}
- dev: true
-
- /get-symbol-description@1.0.0:
- resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
- engines: {node: '>= 0.4'}
+ /get-symbol-description@1.0.2:
+ resolution:
+ {
+ integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.6
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
dev: true
- /get-tsconfig@4.6.0:
- resolution: {integrity: sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg==}
+ /get-tsconfig@4.7.2:
+ resolution:
+ {
+ integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==
+ }
dependencies:
resolve-pkg-maps: 1.0.0
dev: true
/glob-parent@5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
+ resolution:
+ {
+ integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ }
+ engines: { node: '>= 6' }
dependencies:
is-glob: 4.0.3
- /glob-parent@6.0.2:
- resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
- engines: {node: '>=10.13.0'}
- dependencies:
- is-glob: 4.0.3
-
- /glob@7.1.6:
- resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
-
- /glob@7.1.7:
- resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
- dev: true
+ /glob-parent@6.0.2:
+ resolution:
+ {
+ integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ }
+ engines: { node: '>=10.13.0' }
+ dependencies:
+ is-glob: 4.0.3
+
+ /glob@10.3.10:
+ resolution:
+ {
+ integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==
+ }
+ engines: { node: '>=16 || 14 >=14.17' }
+ hasBin: true
+ dependencies:
+ foreground-child: 3.1.1
+ jackspeak: 2.3.6
+ minimatch: 9.0.3
+ minipass: 7.0.4
+ path-scurry: 1.10.1
/glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ resolution:
+ {
+ integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ }
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
@@ -1853,854 +2434,1121 @@ packages:
path-is-absolute: 1.0.1
dev: true
- /globals@11.12.0:
- resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
- engines: {node: '>=4'}
-
- /globals@13.20.0:
- resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
- engines: {node: '>=8'}
+ /globals@13.24.0:
+ resolution:
+ {
+ integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
+ }
+ engines: { node: '>=8' }
dependencies:
type-fest: 0.20.2
dev: true
/globalthis@1.0.3:
- resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- define-properties: 1.2.0
+ define-properties: 1.2.1
dev: true
/globby@11.1.0:
- resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ }
+ engines: { node: '>=10' }
dependencies:
array-union: 2.1.0
dir-glob: 3.0.1
- fast-glob: 3.2.12
- ignore: 5.2.4
+ fast-glob: 3.3.2
+ ignore: 5.3.1
merge2: 1.4.1
slash: 3.0.0
dev: true
- /globby@13.1.4:
- resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dependencies:
- dir-glob: 3.0.1
- fast-glob: 3.2.12
- ignore: 5.2.4
- merge2: 1.4.1
- slash: 4.0.0
- dev: true
-
/gopd@1.0.1:
- resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+ resolution:
+ {
+ integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ }
dependencies:
- get-intrinsic: 1.2.1
- dev: true
+ get-intrinsic: 1.2.4
/graceful-fs@4.2.11:
- resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- dev: true
+ resolution:
+ {
+ integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+ }
/graphemer@1.4.0:
- resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ resolution:
+ {
+ integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+ }
dev: true
/has-bigints@1.0.2:
- resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ resolution:
+ {
+ integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+ }
dev: true
- /has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
-
/has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+ }
+ engines: { node: '>=8' }
dev: true
- /has-property-descriptors@1.0.0:
- resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+ /has-property-descriptors@1.0.1:
+ resolution:
+ {
+ integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==
+ }
dependencies:
- get-intrinsic: 1.2.1
- dev: true
+ get-intrinsic: 1.2.4
/has-proto@1.0.1:
- resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+ }
+ engines: { node: '>= 0.4' }
/has-symbols@1.0.3:
- resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
- engines: {node: '>= 0.4'}
-
- /has-tostringtag@1.0.0:
- resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+ }
+ engines: { node: '>= 0.4' }
+
+ /has-tostringtag@1.0.2:
+ resolution:
+ {
+ integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
has-symbols: 1.0.3
dev: true
- /has@1.0.3:
- resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
- engines: {node: '>= 0.4.0'}
+ /hasown@2.0.0:
+ resolution:
+ {
+ integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- function-bind: 1.1.1
-
- /human-signals@2.1.0:
- resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
- engines: {node: '>=10.17.0'}
- dev: true
+ function-bind: 1.1.2
- /human-signals@4.3.1:
- resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
- engines: {node: '>=14.18.0'}
+ /https-proxy-agent@7.0.2:
+ resolution:
+ {
+ integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==
+ }
+ engines: { node: '>= 14' }
+ dependencies:
+ agent-base: 7.1.0
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
dev: true
- /ignore@5.2.4:
- resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
- engines: {node: '>= 4'}
+ /ignore@5.3.1:
+ resolution:
+ {
+ integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
+ }
+ engines: { node: '>= 4' }
dev: true
/import-fresh@3.3.0:
- resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
- engines: {node: '>=6'}
+ resolution:
+ {
+ integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ }
+ engines: { node: '>=6' }
dependencies:
parent-module: 1.0.1
resolve-from: 4.0.0
dev: true
/imurmurhash@0.1.4:
- resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
- engines: {node: '>=0.8.19'}
+ resolution:
+ {
+ integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+ }
+ engines: { node: '>=0.8.19' }
dev: true
/inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ resolution:
+ {
+ integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ }
dependencies:
once: 1.4.0
wrappy: 1.0.2
+ dev: true
/inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ resolution:
+ {
+ integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+ }
+ dev: true
- /internal-slot@1.0.5:
- resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
- engines: {node: '>= 0.4'}
+ /internal-slot@1.0.7:
+ resolution:
+ {
+ integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- get-intrinsic: 1.2.1
- has: 1.0.3
- side-channel: 1.0.4
+ es-errors: 1.3.0
+ hasown: 2.0.0
+ side-channel: 1.0.5
dev: true
- /is-arguments@1.1.1:
- resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
- engines: {node: '>= 0.4'}
+ /is-array-buffer@3.0.4:
+ resolution:
+ {
+ integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
+ call-bind: 1.0.6
+ get-intrinsic: 1.2.4
dev: true
- /is-array-buffer@3.0.2:
- resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
+ /is-async-function@2.0.0:
+ resolution:
+ {
+ integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- is-typed-array: 1.1.10
+ has-tostringtag: 1.0.2
dev: true
/is-bigint@1.0.4:
- resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ resolution:
+ {
+ integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ }
dependencies:
has-bigints: 1.0.2
dev: true
/is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ }
+ engines: { node: '>=8' }
dependencies:
binary-extensions: 2.2.0
/is-boolean-object@1.1.2:
- resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
+ call-bind: 1.0.6
+ has-tostringtag: 1.0.2
dev: true
/is-callable@1.2.7:
- resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+ }
+ engines: { node: '>= 0.4' }
dev: true
- /is-core-module@2.12.1:
- resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
+ /is-core-module@2.13.1:
+ resolution:
+ {
+ integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
+ }
dependencies:
- has: 1.0.3
+ hasown: 2.0.0
/is-date-object@1.0.5:
- resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- has-tostringtag: 1.0.0
+ has-tostringtag: 1.0.2
dev: true
- /is-docker@2.2.1:
- resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
- engines: {node: '>=8'}
- hasBin: true
- dev: true
+ /is-extglob@2.1.1:
+ resolution:
+ {
+ integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+ }
+ engines: { node: '>=0.10.0' }
- /is-docker@3.0.0:
- resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- hasBin: true
+ /is-finalizationregistry@1.0.2:
+ resolution:
+ {
+ integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==
+ }
+ dependencies:
+ call-bind: 1.0.6
dev: true
- /is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
+ /is-fullwidth-code-point@3.0.0:
+ resolution:
+ {
+ integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+ }
+ engines: { node: '>=8' }
- /is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
+ /is-generator-function@1.0.10:
+ resolution:
+ {
+ integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- is-extglob: 2.1.1
+ has-tostringtag: 1.0.2
+ dev: true
- /is-inside-container@1.0.0:
- resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
- engines: {node: '>=14.16'}
- hasBin: true
+ /is-glob@4.0.3:
+ resolution:
+ {
+ integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ }
+ engines: { node: '>=0.10.0' }
dependencies:
- is-docker: 3.0.0
- dev: true
+ is-extglob: 2.1.1
/is-map@2.0.2:
- resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
+ resolution:
+ {
+ integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+ }
dev: true
/is-negative-zero@2.0.2:
- resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+ }
+ engines: { node: '>= 0.4' }
dev: true
/is-number-object@1.0.7:
- resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- has-tostringtag: 1.0.0
+ has-tostringtag: 1.0.2
dev: true
/is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
+ resolution:
+ {
+ integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+ }
+ engines: { node: '>=0.12.0' }
/is-path-inside@3.0.3:
- resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+ }
+ engines: { node: '>=8' }
dev: true
/is-regex@1.1.4:
- resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
+ call-bind: 1.0.6
+ has-tostringtag: 1.0.2
dev: true
/is-set@2.0.2:
- resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
+ resolution:
+ {
+ integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
+ }
dev: true
/is-shared-array-buffer@1.0.2:
- resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+ resolution:
+ {
+ integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ }
dependencies:
- call-bind: 1.0.2
- dev: true
-
- /is-stream@2.0.1:
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
- engines: {node: '>=8'}
- dev: true
-
- /is-stream@3.0.0:
- resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ call-bind: 1.0.6
dev: true
/is-string@1.0.7:
- resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- has-tostringtag: 1.0.0
+ has-tostringtag: 1.0.2
dev: true
/is-symbol@1.0.4:
- resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
has-symbols: 1.0.3
dev: true
- /is-typed-array@1.1.10:
- resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==}
- engines: {node: '>= 0.4'}
+ /is-typed-array@1.1.13:
+ resolution:
+ {
+ integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- for-each: 0.3.3
- gopd: 1.0.1
- has-tostringtag: 1.0.0
+ which-typed-array: 1.1.14
dev: true
- /is-typedarray@1.0.0:
- resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
- dev: false
-
/is-weakmap@2.0.1:
- resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
+ resolution:
+ {
+ integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
+ }
dev: true
/is-weakref@1.0.2:
- resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ resolution:
+ {
+ integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ }
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.6
dev: true
/is-weakset@2.0.2:
- resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- dev: true
-
- /is-wsl@2.2.0:
- resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
+ }
dependencies:
- is-docker: 2.2.1
+ call-bind: 1.0.6
+ get-intrinsic: 1.2.4
dev: true
/isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+ resolution:
+ {
+ integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+ }
dev: true
/isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ resolution:
+ {
+ integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+ }
+
+ /iterator.prototype@1.1.2:
+ resolution:
+ {
+ integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==
+ }
+ dependencies:
+ define-properties: 1.2.1
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ reflect.getprototypeof: 1.0.5
+ set-function-name: 2.0.1
dev: true
- /javascript-natural-sort@0.7.1:
- resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==}
- dev: true
+ /jackspeak@2.3.6:
+ resolution:
+ {
+ integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==
+ }
+ engines: { node: '>=14' }
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
- /jiti@1.18.2:
- resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==}
+ /jiti@1.21.0:
+ resolution:
+ {
+ integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
+ }
hasBin: true
- /jose@4.14.4:
- resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==}
- dev: false
-
/js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ resolution:
+ {
+ integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+ }
/js-yaml@4.1.0:
- resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ resolution:
+ {
+ integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ }
hasBin: true
dependencies:
argparse: 2.0.1
dev: true
- /jsesc@2.5.2:
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
- engines: {node: '>=4'}
- hasBin: true
+ /json-buffer@3.0.1:
+ resolution:
+ {
+ integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+ }
+ dev: true
/json-schema-traverse@0.4.1:
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ resolution:
+ {
+ integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+ }
dev: true
/json-stable-stringify-without-jsonify@1.0.1:
- resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ resolution:
+ {
+ integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+ }
dev: true
/json5@1.0.2:
- resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ resolution:
+ {
+ integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
+ }
hasBin: true
dependencies:
minimist: 1.2.8
dev: true
- /json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
+ /jsx-ast-utils@3.3.5:
+ resolution:
+ {
+ integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==
+ }
+ engines: { node: '>=4.0' }
+ dependencies:
+ array-includes: 3.1.7
+ array.prototype.flat: 1.3.2
+ object.assign: 4.1.5
+ object.values: 1.1.7
+ dev: true
- /jsx-ast-utils@3.3.3:
- resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
- engines: {node: '>=4.0'}
+ /keyv@4.5.4:
+ resolution:
+ {
+ integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ }
dependencies:
- array-includes: 3.1.6
- object.assign: 4.1.4
+ json-buffer: 3.0.1
dev: true
/language-subtag-registry@0.3.22:
- resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
+ resolution:
+ {
+ integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==
+ }
dev: true
- /language-tags@1.0.5:
- resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==}
+ /language-tags@1.0.9:
+ resolution:
+ {
+ integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==
+ }
+ engines: { node: '>=0.10' }
dependencies:
language-subtag-registry: 0.3.22
dev: true
/levn@0.4.1:
- resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
- engines: {node: '>= 0.8.0'}
+ resolution:
+ {
+ integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ }
+ engines: { node: '>= 0.8.0' }
dependencies:
prelude-ls: 1.2.1
type-check: 0.4.0
dev: true
/lilconfig@2.1.0:
- resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
+ }
+ engines: { node: '>=10' }
+
+ /lilconfig@3.0.0:
+ resolution:
+ {
+ integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==
+ }
+ engines: { node: '>=14' }
/lines-and-columns@1.2.4:
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ resolution:
+ {
+ integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+ }
/locate-path@6.0.0:
- resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ }
+ engines: { node: '>=10' }
dependencies:
p-locate: 5.0.0
dev: true
- /lodash.clone@4.5.0:
- resolution: {integrity: sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==}
- dev: true
-
- /lodash.isequal@4.5.0:
- resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
- dev: true
-
/lodash.merge@4.6.2:
- resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ resolution:
+ {
+ integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+ }
dev: true
/loose-envify@1.4.0:
- resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ resolution:
+ {
+ integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ }
hasBin: true
dependencies:
js-tokens: 4.0.0
- /lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- dependencies:
- yallist: 3.1.1
+ /lru-cache@10.2.0:
+ resolution:
+ {
+ integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==
+ }
+ engines: { node: 14 || >=16.14 }
/lru-cache@6.0.0:
- resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ }
+ engines: { node: '>=10' }
dependencies:
yallist: 4.0.0
dev: true
- /merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
- dev: true
+ /lucide-react@0.321.0(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-Fi9VahIna6642U+2nAGSjnXwUBV3WyfFFPQq4yi3w30jtqxDLfSyiYCtCYCYQZ2KWNZc1MDI+rcsa0t+ChdYpw==
+ }
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 18.2.0
+ dev: false
/merge2@1.4.1:
- resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
- engines: {node: '>= 8'}
+ resolution:
+ {
+ integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+ }
+ engines: { node: '>= 8' }
/micromatch@4.0.5:
- resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
- engines: {node: '>=8.6'}
+ resolution:
+ {
+ integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ }
+ engines: { node: '>=8.6' }
dependencies:
braces: 3.0.2
picomatch: 2.3.1
- /mimic-fn@2.1.0:
- resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
- engines: {node: '>=6'}
- dev: true
-
- /mimic-fn@4.0.0:
- resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
- engines: {node: '>=12'}
- dev: true
-
/minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ resolution:
+ {
+ integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ }
dependencies:
brace-expansion: 1.1.11
+ dev: true
+
+ /minimatch@9.0.3:
+ resolution:
+ {
+ integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
+ }
+ engines: { node: '>=16 || 14 >=14.17' }
+ dependencies:
+ brace-expansion: 2.0.1
/minimist@1.2.8:
- resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ resolution:
+ {
+ integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+ }
dev: true
/minipass@3.3.6:
- resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+ }
+ engines: { node: '>=8' }
dependencies:
yallist: 4.0.0
dev: true
/minipass@5.0.0:
- resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
+ }
+ engines: { node: '>=8' }
dev: true
+ /minipass@7.0.4:
+ resolution:
+ {
+ integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==
+ }
+ engines: { node: '>=16 || 14 >=14.17' }
+
/minizlib@2.1.2:
- resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
- engines: {node: '>= 8'}
+ resolution:
+ {
+ integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ }
+ engines: { node: '>= 8' }
dependencies:
minipass: 3.3.6
yallist: 4.0.0
dev: true
/mkdirp@1.0.4:
- resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+ }
+ engines: { node: '>=10' }
hasBin: true
dev: true
- /ms@2.0.0:
- resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
- dev: false
-
/ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ resolution:
+ {
+ integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+ }
+ dev: true
/ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ resolution:
+ {
+ integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+ }
dev: true
/mz@2.7.0:
- resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+ resolution:
+ {
+ integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
+ }
dependencies:
any-promise: 1.3.0
object-assign: 4.1.1
thenify-all: 1.6.0
- /nanoid@3.3.6:
- resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ /nanoid@3.3.7:
+ resolution:
+ {
+ integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+ }
+ engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 }
hasBin: true
/natural-compare@1.4.0:
- resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
- dev: true
-
- /next-tick@1.1.0:
- resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
- dev: false
-
- /next@13.4.3(@babel/core@7.22.1)(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-FV3pBrAAnAIfOclTvncw9dDohyeuEEXPe5KNcva91anT/rdycWbgtu3IjUj4n5yHnWK8YEPo0vrUecHmnmUNbA==}
- engines: {node: '>=16.8.0'}
+ resolution:
+ {
+ integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+ }
+ dev: true
+
+ /next@14.1.0(react-dom@18.2.0)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==
+ }
+ engines: { node: '>=18.17.0' }
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
- fibers: '>= 3.1.0'
- node-sass: ^6.0.0 || ^7.0.0
react: ^18.2.0
react-dom: ^18.2.0
sass: ^1.3.0
peerDependenciesMeta:
'@opentelemetry/api':
optional: true
- fibers:
- optional: true
- node-sass:
- optional: true
sass:
optional: true
dependencies:
- '@next/env': 13.4.3
- '@swc/helpers': 0.5.1
+ '@next/env': 14.1.0
+ '@swc/helpers': 0.5.2
busboy: 1.6.0
- caniuse-lite: 1.0.30001491
- postcss: 8.4.14
+ caniuse-lite: 1.0.30001585
+ graceful-fs: 4.2.11
+ postcss: 8.4.31
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- styled-jsx: 5.1.1(@babel/core@7.22.1)(react@18.2.0)
- zod: 3.21.4
+ styled-jsx: 5.1.1(react@18.2.0)
optionalDependencies:
- '@next/swc-darwin-arm64': 13.4.3
- '@next/swc-darwin-x64': 13.4.3
- '@next/swc-linux-arm64-gnu': 13.4.3
- '@next/swc-linux-arm64-musl': 13.4.3
- '@next/swc-linux-x64-gnu': 13.4.3
- '@next/swc-linux-x64-musl': 13.4.3
- '@next/swc-win32-arm64-msvc': 13.4.3
- '@next/swc-win32-ia32-msvc': 13.4.3
- '@next/swc-win32-x64-msvc': 13.4.3
+ '@next/swc-darwin-arm64': 14.1.0
+ '@next/swc-darwin-x64': 14.1.0
+ '@next/swc-linux-arm64-gnu': 14.1.0
+ '@next/swc-linux-arm64-musl': 14.1.0
+ '@next/swc-linux-x64-gnu': 14.1.0
+ '@next/swc-linux-x64-musl': 14.1.0
+ '@next/swc-win32-arm64-msvc': 14.1.0
+ '@next/swc-win32-ia32-msvc': 14.1.0
+ '@next/swc-win32-x64-msvc': 14.1.0
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
dev: false
/node-domexception@1.0.0:
- resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
- engines: {node: '>=10.5.0'}
+ resolution:
+ {
+ integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
+ }
+ engines: { node: '>=10.5.0' }
dev: true
- /node-fetch@2.6.11:
- resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==}
- engines: {node: 4.x || >=6.0.0}
- peerDependencies:
- encoding: ^0.1.0
- peerDependenciesMeta:
- encoding:
- optional: true
- dependencies:
- whatwg-url: 5.0.0
- dev: false
-
- /node-fetch@3.3.1:
- resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ /node-fetch@3.3.2:
+ resolution:
+ {
+ integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==
+ }
+ engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 }
dependencies:
data-uri-to-buffer: 4.0.1
fetch-blob: 3.2.0
formdata-polyfill: 4.0.10
dev: true
- /node-gyp-build@4.6.0:
- resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==}
- hasBin: true
- dev: false
-
- /node-releases@2.0.12:
- resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==}
+ /node-releases@2.0.14:
+ resolution:
+ {
+ integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+ }
+ dev: true
/normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+ }
+ engines: { node: '>=0.10.0' }
/normalize-range@0.1.2:
- resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
- engines: {node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
+ }
+ engines: { node: '>=0.10.0' }
dev: true
/npm-normalize-package-bin@3.0.1:
- resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- dev: true
-
- /npm-run-path@4.0.1:
- resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
- engines: {node: '>=8'}
- dependencies:
- path-key: 3.1.1
- dev: true
-
- /npm-run-path@5.1.0:
- resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dependencies:
- path-key: 4.0.0
+ resolution:
+ {
+ integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==
+ }
+ engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 }
dev: true
/object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+ }
+ engines: { node: '>=0.10.0' }
/object-hash@3.0.0:
- resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
- engines: {node: '>= 6'}
-
- /object-inspect@1.12.3:
- resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
-
- /object-is@1.1.5:
- resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- dev: true
+ resolution:
+ {
+ integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
+ }
+ engines: { node: '>= 6' }
+
+ /object-inspect@1.13.1:
+ resolution:
+ {
+ integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+ }
/object-keys@1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /object.assign@4.1.4:
- resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
+ resolution:
+ {
+ integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+ }
+ engines: { node: '>= 0.4' }
+ dev: true
+
+ /object.assign@4.1.5:
+ resolution:
+ {
+ integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ define-properties: 1.2.1
has-symbols: 1.0.3
object-keys: 1.1.1
dev: true
- /object.entries@1.1.6:
- resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- dev: true
-
- /object.fromentries@2.0.6:
- resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==}
- engines: {node: '>= 0.4'}
+ /object.entries@1.1.7:
+ resolution:
+ {
+ integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
dev: true
- /object.hasown@1.1.2:
- resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==}
+ /object.fromentries@2.0.7:
+ resolution:
+ {
+ integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- define-properties: 1.2.0
- es-abstract: 1.21.2
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
dev: true
- /object.values@1.1.6:
- resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
- engines: {node: '>= 0.4'}
+ /object.groupby@1.0.2:
+ resolution:
+ {
+ integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==
+ }
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
+ array.prototype.filter: 1.0.3
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-errors: 1.3.0
dev: true
- /once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
- dependencies:
- wrappy: 1.0.2
-
- /onetime@5.1.2:
- resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
- engines: {node: '>=6'}
+ /object.hasown@1.1.3:
+ resolution:
+ {
+ integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==
+ }
dependencies:
- mimic-fn: 2.1.0
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
dev: true
- /onetime@6.0.0:
- resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
- engines: {node: '>=12'}
+ /object.values@1.1.7:
+ resolution:
+ {
+ integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- mimic-fn: 4.0.0
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
dev: true
- /open@9.1.0:
- resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
- engines: {node: '>=14.16'}
+ /once@1.4.0:
+ resolution:
+ {
+ integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ }
dependencies:
- default-browser: 4.0.0
- define-lazy-prop: 3.0.0
- is-inside-container: 1.0.0
- is-wsl: 2.2.0
+ wrappy: 1.0.2
dev: true
- /optionator@0.9.1:
- resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
- engines: {node: '>= 0.8.0'}
+ /optionator@0.9.3:
+ resolution:
+ {
+ integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
+ }
+ engines: { node: '>= 0.8.0' }
dependencies:
+ '@aashutoshrathi/word-wrap': 1.2.6
deep-is: 0.1.4
fast-levenshtein: 2.0.6
levn: 0.4.1
prelude-ls: 1.2.1
type-check: 0.4.0
- word-wrap: 1.2.3
dev: true
/p-limit@3.1.0:
- resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ }
+ engines: { node: '>=10' }
dependencies:
yocto-queue: 0.1.0
dev: true
/p-locate@5.0.0:
- resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ }
+ engines: { node: '>=10' }
dependencies:
p-limit: 3.1.0
dev: true
/parent-module@1.0.1:
- resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
- engines: {node: '>=6'}
+ resolution:
+ {
+ integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ }
+ engines: { node: '>=6' }
dependencies:
callsites: 3.1.0
dev: true
/path-exists@4.0.0:
- resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+ }
+ engines: { node: '>=8' }
dev: true
/path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
-
- /path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+ }
+ engines: { node: '>=0.10.0' }
dev: true
- /path-key@4.0.0:
- resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
- engines: {node: '>=12'}
- dev: true
+ /path-key@3.1.1:
+ resolution:
+ {
+ integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+ }
+ engines: { node: '>=8' }
/path-parse@1.0.7:
- resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ resolution:
+ {
+ integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+ }
+
+ /path-scurry@1.10.1:
+ resolution:
+ {
+ integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==
+ }
+ engines: { node: '>=16 || 14 >=14.17' }
+ dependencies:
+ lru-cache: 10.2.0
+ minipass: 7.0.4
/path-type@4.0.0:
- resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+ }
+ engines: { node: '>=8' }
dev: true
/picocolors@1.0.0:
- resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ resolution:
+ {
+ integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+ }
/picomatch@2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
- engines: {node: '>=8.6'}
+ resolution:
+ {
+ integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+ }
+ engines: { node: '>=8.6' }
/pify@2.3.0:
- resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
- engines: {node: '>=0.10.0'}
-
- /pirates@4.0.5:
- resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
- engines: {node: '>= 6'}
-
- /postcss-import@15.1.0(postcss@8.4.24):
- resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
- engines: {node: '>=14.0.0'}
+ resolution:
+ {
+ integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
+ }
+ engines: { node: '>=0.10.0' }
+
+ /pirates@4.0.6:
+ resolution:
+ {
+ integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
+ }
+ engines: { node: '>= 6' }
+
+ /postcss-import@15.1.0(postcss@8.4.35):
+ resolution:
+ {
+ integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==
+ }
+ engines: { node: '>=14.0.0' }
peerDependencies:
postcss: ^8.0.0
dependencies:
- postcss: 8.4.24
+ postcss: 8.4.35
postcss-value-parser: 4.2.0
read-cache: 1.0.0
- resolve: 1.22.2
-
- /postcss-js@4.0.1(postcss@8.4.24):
- resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
- engines: {node: ^12 || ^14 || >= 16}
+ resolve: 1.22.8
+
+ /postcss-js@4.0.1(postcss@8.4.35):
+ resolution:
+ {
+ integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==
+ }
+ engines: { node: ^12 || ^14 || >= 16 }
peerDependencies:
postcss: ^8.4.21
dependencies:
camelcase-css: 2.0.1
- postcss: 8.4.24
-
- /postcss-load-config@4.0.1(postcss@8.4.24):
- resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
- engines: {node: '>= 14'}
+ postcss: 8.4.35
+
+ /postcss-load-config@4.0.2(postcss@8.4.35):
+ resolution:
+ {
+ integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==
+ }
+ engines: { node: '>= 14' }
peerDependencies:
postcss: '>=8.0.9'
ts-node: '>=9.0.0'
@@ -2710,61 +3558,81 @@ packages:
ts-node:
optional: true
dependencies:
- lilconfig: 2.1.0
- postcss: 8.4.24
- yaml: 2.3.1
+ lilconfig: 3.0.0
+ postcss: 8.4.35
+ yaml: 2.3.4
- /postcss-nested@6.0.1(postcss@8.4.24):
- resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
- engines: {node: '>=12.0'}
+ /postcss-nested@6.0.1(postcss@8.4.35):
+ resolution:
+ {
+ integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==
+ }
+ engines: { node: '>=12.0' }
peerDependencies:
postcss: ^8.2.14
dependencies:
- postcss: 8.4.24
- postcss-selector-parser: 6.0.13
+ postcss: 8.4.35
+ postcss-selector-parser: 6.0.15
- /postcss-selector-parser@6.0.13:
- resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
- engines: {node: '>=4'}
+ /postcss-selector-parser@6.0.15:
+ resolution:
+ {
+ integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==
+ }
+ engines: { node: '>=4' }
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
/postcss-value-parser@4.2.0:
- resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
-
- /postcss@8.4.14:
- resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
- engines: {node: ^10 || ^12 || >=14}
- dependencies:
- nanoid: 3.3.6
+ resolution:
+ {
+ integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+ }
+
+ /postcss@8.4.31:
+ resolution:
+ {
+ integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
+ }
+ engines: { node: ^10 || ^12 || >=14 }
+ dependencies:
+ nanoid: 3.3.7
picocolors: 1.0.0
source-map-js: 1.0.2
dev: false
- /postcss@8.4.24:
- resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==}
- engines: {node: ^10 || ^12 || >=14}
+ /postcss@8.4.35:
+ resolution:
+ {
+ integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==
+ }
+ engines: { node: ^10 || ^12 || >=14 }
dependencies:
- nanoid: 3.3.6
+ nanoid: 3.3.7
picocolors: 1.0.0
source-map-js: 1.0.2
/prelude-ls@1.2.1:
- resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
- engines: {node: '>= 0.8.0'}
- dev: true
-
- /prettier-plugin-tailwindcss@0.3.0(@ianvs/prettier-plugin-sort-imports@3.7.2)(prettier@2.8.8):
- resolution: {integrity: sha512-009/Xqdy7UmkcTBpwlq7jsViDqXAYSOMLDrHAdTMlVZOrKfM2o9Ci7EMWTMZ7SkKBFTG04UM9F9iM2+4i6boDA==}
- engines: {node: '>=12.17.0'}
+ resolution:
+ {
+ integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+ }
+ engines: { node: '>= 0.8.0' }
+ dev: true
+
+ /prettier-plugin-tailwindcss@0.5.11(prettier@3.2.5):
+ resolution:
+ {
+ integrity: sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w==
+ }
+ engines: { node: '>=14.21.3' }
peerDependencies:
'@ianvs/prettier-plugin-sort-imports': '*'
'@prettier/plugin-pug': '*'
'@shopify/prettier-plugin-liquid': '*'
- '@shufo/prettier-plugin-blade': '*'
'@trivago/prettier-plugin-sort-imports': '*'
- prettier: '>=2.2.0'
+ prettier: ^3.0
prettier-plugin-astro: '*'
prettier-plugin-css-order: '*'
prettier-plugin-import-sort: '*'
@@ -2782,8 +3650,6 @@ packages:
optional: true
'@shopify/prettier-plugin-liquid':
optional: true
- '@shufo/prettier-plugin-blade':
- optional: true
'@trivago/prettier-plugin-sort-imports':
optional: true
prettier-plugin-astro:
@@ -2807,40 +3673,65 @@ packages:
prettier-plugin-twig-melody:
optional: true
dependencies:
- '@ianvs/prettier-plugin-sort-imports': 3.7.2(prettier@2.8.8)
- prettier: 2.8.8
+ prettier: 3.2.5
dev: true
- /prettier@2.8.8:
- resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
- engines: {node: '>=10.13.0'}
+ /prettier@3.2.5:
+ resolution:
+ {
+ integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
+ }
+ engines: { node: '>=14' }
hasBin: true
dev: true
/prop-types@15.8.1:
- resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ resolution:
+ {
+ integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ }
dependencies:
loose-envify: 1.4.0
object-assign: 4.1.1
react-is: 16.13.1
+ dev: true
- /punycode@2.3.0:
- resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
- engines: {node: '>=6'}
+ /punycode@2.3.1:
+ resolution:
+ {
+ integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+ }
+ engines: { node: '>=6' }
dev: true
/qs@6.11.2:
- resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==}
- engines: {node: '>=0.6'}
+ resolution:
+ {
+ integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==
+ }
+ engines: { node: '>=0.6' }
dependencies:
- side-channel: 1.0.4
+ side-channel: 1.0.5
dev: false
/queue-microtask@1.2.3:
- resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ resolution:
+ {
+ integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+ }
+
+ /ramda@0.29.1:
+ resolution:
+ {
+ integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==
+ }
+ dev: false
/react-dom@18.2.0(react@18.2.0):
- resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
+ resolution:
+ {
+ integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
+ }
peerDependencies:
react: ^18.2.0
dependencies:
@@ -2850,257 +3741,412 @@ packages:
dev: false
/react-is@16.13.1:
- resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+ resolution:
+ {
+ integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+ }
+ dev: true
- /react-merge-refs@2.0.2:
- resolution: {integrity: sha512-V5BGTwGa2r+/t0A/BZMS6L7VPXY0CU8xtAhkT3XUoI1WJJhhtvulvoiZkJ5Jt9YAW23m4xFWmhQ+C5HwjtTFhQ==}
+ /react-merge-refs@2.1.1:
+ resolution:
+ {
+ integrity: sha512-jLQXJ/URln51zskhgppGJ2ub7b2WFKGq3cl3NYKtlHoTG+dN2q7EzWrn3hN3EgPsTMvpR9tpq5ijdp7YwFZkag==
+ }
dev: false
/react@18.2.0:
- resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
- engines: {node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
+ }
+ engines: { node: '>=0.10.0' }
dependencies:
loose-envify: 1.4.0
dev: false
/read-cache@1.0.0:
- resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+ resolution:
+ {
+ integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==
+ }
dependencies:
pify: 2.3.0
/read-cmd-shim@4.0.0:
- resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ resolution:
+ {
+ integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==
+ }
+ engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 }
dev: true
/readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
+ resolution:
+ {
+ integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ }
+ engines: { node: '>=8.10.0' }
dependencies:
picomatch: 2.3.1
- /regenerator-runtime@0.13.11:
- resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+ /reflect.getprototypeof@1.0.5:
+ resolution:
+ {
+ integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ globalthis: 1.0.3
+ which-builtin-type: 1.1.3
dev: true
- /regexp.prototype.flags@1.5.0:
- resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==}
- engines: {node: '>= 0.4'}
+ /regenerator-runtime@0.14.1:
+ resolution:
+ {
+ integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+ }
+
+ /regexp.prototype.flags@1.5.1:
+ resolution:
+ {
+ integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- functions-have-names: 1.2.3
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ set-function-name: 2.0.1
dev: true
/resolve-from@4.0.0:
- resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
- engines: {node: '>=4'}
+ resolution:
+ {
+ integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+ }
+ engines: { node: '>=4' }
dev: true
/resolve-pkg-maps@1.0.0:
- resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+ resolution:
+ {
+ integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==
+ }
dev: true
- /resolve@1.22.2:
- resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
+ /resolve@1.22.8:
+ resolution:
+ {
+ integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ }
hasBin: true
dependencies:
- is-core-module: 2.12.1
+ is-core-module: 2.13.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- /resolve@2.0.0-next.4:
- resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
+ /resolve@2.0.0-next.5:
+ resolution:
+ {
+ integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
+ }
hasBin: true
dependencies:
- is-core-module: 2.12.1
+ is-core-module: 2.13.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
dev: true
/reusify@1.0.4:
- resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
- engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ resolution:
+ {
+ integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+ }
+ engines: { iojs: '>=1.0.0', node: '>=0.10.0' }
/rimraf@3.0.2:
- resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ resolution:
+ {
+ integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ }
hasBin: true
dependencies:
glob: 7.2.3
dev: true
- /run-applescript@5.0.0:
- resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
- engines: {node: '>=12'}
- dependencies:
- execa: 5.1.1
- dev: true
-
/run-parallel@1.2.0:
- resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ resolution:
+ {
+ integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ }
dependencies:
queue-microtask: 1.2.3
- /safe-regex-test@1.0.0:
- resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+ /safe-array-concat@1.1.0:
+ resolution:
+ {
+ integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==
+ }
+ engines: { node: '>=0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ isarray: 2.0.5
+ dev: true
+
+ /safe-regex-test@1.0.3:
+ resolution:
+ {
+ integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.6
+ es-errors: 1.3.0
is-regex: 1.1.4
dev: true
/scheduler@0.23.0:
- resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
+ resolution:
+ {
+ integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
+ }
dependencies:
loose-envify: 1.4.0
dev: false
- /semver@6.3.0:
- resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
+ /semver@6.3.1:
+ resolution:
+ {
+ integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+ }
hasBin: true
+ dev: true
- /semver@7.5.1:
- resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==}
- engines: {node: '>=10'}
+ /semver@7.6.0:
+ resolution:
+ {
+ integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
+ }
+ engines: { node: '>=10' }
hasBin: true
dependencies:
lru-cache: 6.0.0
dev: true
- /set-cookie-parser@2.6.0:
- resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
- dev: false
-
- /shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
+ /set-function-length@1.2.1:
+ resolution:
+ {
+ integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- shebang-regex: 3.0.0
- dev: true
+ define-data-property: 1.1.2
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.1
- /shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
+ /set-function-name@2.0.1:
+ resolution:
+ {
+ integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ define-data-property: 1.1.2
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.1
dev: true
- /side-channel@1.0.4:
- resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ /shebang-command@2.0.0:
+ resolution:
+ {
+ integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ }
+ engines: { node: '>=8' }
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- object-inspect: 1.12.3
-
- /signal-exit@3.0.7:
- resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
- dev: true
+ shebang-regex: 3.0.0
- /signal-exit@4.0.2:
- resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==}
- engines: {node: '>=14'}
- dev: true
+ /shebang-regex@3.0.0:
+ resolution:
+ {
+ integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+ }
+ engines: { node: '>=8' }
+
+ /side-channel@1.0.5:
+ resolution:
+ {
+ integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ object-inspect: 1.13.1
+
+ /signal-exit@4.1.0:
+ resolution:
+ {
+ integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+ }
+ engines: { node: '>=14' }
/slash@3.0.0:
- resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
- engines: {node: '>=8'}
- dev: true
-
- /slash@4.0.0:
- resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
- engines: {node: '>=12'}
+ resolution:
+ {
+ integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+ }
+ engines: { node: '>=8' }
dev: true
/source-map-js@1.0.2:
- resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
- engines: {node: '>=0.10.0'}
-
- /stop-iteration-iterator@1.0.0:
- resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- internal-slot: 1.0.5
- dev: true
+ resolution:
+ {
+ integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+ }
+ engines: { node: '>=0.10.0' }
/streamsearch@1.1.0:
- resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
- engines: {node: '>=10.0.0'}
+ resolution:
+ {
+ integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
+ }
+ engines: { node: '>=10.0.0' }
dev: false
- /string.prototype.matchall@4.0.8:
- resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
+ /string-width@4.2.3:
+ resolution:
+ {
+ integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ }
+ engines: { node: '>=8' }
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ /string-width@5.1.2:
+ resolution:
+ {
+ integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+ }
+ engines: { node: '>=12' }
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
- get-intrinsic: 1.2.1
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+
+ /string.prototype.matchall@4.0.10:
+ resolution:
+ {
+ integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==
+ }
+ dependencies:
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
+ get-intrinsic: 1.2.4
has-symbols: 1.0.3
- internal-slot: 1.0.5
- regexp.prototype.flags: 1.5.0
- side-channel: 1.0.4
+ internal-slot: 1.0.7
+ regexp.prototype.flags: 1.5.1
+ set-function-name: 2.0.1
+ side-channel: 1.0.5
dev: true
- /string.prototype.trim@1.2.7:
- resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==}
- engines: {node: '>= 0.4'}
+ /string.prototype.trim@1.2.8:
+ resolution:
+ {
+ integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
dev: true
- /string.prototype.trimend@1.0.6:
- resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
+ /string.prototype.trimend@1.0.7:
+ resolution:
+ {
+ integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==
+ }
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
dev: true
- /string.prototype.trimstart@1.0.6:
- resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
+ /string.prototype.trimstart@1.0.7:
+ resolution:
+ {
+ integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==
+ }
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.0
- es-abstract: 1.21.2
+ call-bind: 1.0.6
+ define-properties: 1.2.1
+ es-abstract: 1.22.3
dev: true
/strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ }
+ engines: { node: '>=8' }
dependencies:
ansi-regex: 5.0.1
- dev: true
-
- /strip-bom@3.0.0:
- resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
- engines: {node: '>=4'}
- dev: true
- /strip-final-newline@2.0.0:
- resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
- engines: {node: '>=6'}
- dev: true
+ /strip-ansi@7.1.0:
+ resolution:
+ {
+ integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
+ }
+ engines: { node: '>=12' }
+ dependencies:
+ ansi-regex: 6.0.1
- /strip-final-newline@3.0.0:
- resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
- engines: {node: '>=12'}
+ /strip-bom@3.0.0:
+ resolution:
+ {
+ integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+ }
+ engines: { node: '>=4' }
dev: true
/strip-json-comments@3.1.1:
- resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+ }
+ engines: { node: '>=8' }
dev: true
- /stripe@12.7.0:
- resolution: {integrity: sha512-4yY9gNFznBI6fZtR0B4y2a+o2EJe+s7p4DiHECKphwa36zYIczpWzO1g4dF0PF3lhTRw5FWTaHGBjwaD5FEiDQ==}
- engines: {node: '>=12.*'}
+ /stripe@14.15.0:
+ resolution:
+ {
+ integrity: sha512-KPxNcf0iFWA38pkzeJyJklK9qQJo/6FEBDcLsZxDCVHfn8yT+uP9p1JSYiOhIxCyh+6BD5XEVOMnnBJnVeEnfA==
+ }
+ engines: { node: '>=12.*' }
dependencies:
- '@types/node': 20.2.5
+ '@types/node': 20.11.16
qs: 6.11.2
dev: false
- /styled-jsx@5.1.1(@babel/core@7.22.1)(react@18.2.0):
- resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
- engines: {node: '>= 12.0.0'}
+ /styled-jsx@5.1.1(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==
+ }
+ engines: { node: '>= 12.0.0' }
peerDependencies:
'@babel/core': '*'
babel-plugin-macros: '*'
@@ -3111,99 +4157,127 @@ packages:
babel-plugin-macros:
optional: true
dependencies:
- '@babel/core': 7.22.1
client-only: 0.0.1
react: 18.2.0
dev: false
- /sucrase@3.32.0:
- resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==}
- engines: {node: '>=8'}
+ /sucrase@3.35.0:
+ resolution:
+ {
+ integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==
+ }
+ engines: { node: '>=16 || 14 >=14.17' }
hasBin: true
dependencies:
'@jridgewell/gen-mapping': 0.3.3
commander: 4.1.1
- glob: 7.1.6
+ glob: 10.3.10
lines-and-columns: 1.2.4
mz: 2.7.0
- pirates: 4.0.5
+ pirates: 4.0.6
ts-interface-checker: 0.1.13
- /supabase@1.64.8:
- resolution: {integrity: sha512-HrJe7vJx8he1JdgUn8if+JxZkDugD030xNqy9Jxlbs8X/lNuEnmo7EW0uDJsMVTz6L8hXTuafHlJy4HiULa1Qw==}
- engines: {npm: '>=8'}
+ /supabase@1.142.2:
+ resolution:
+ {
+ integrity: sha512-CWe6+WIGnWg8rHXngDwlJX1A3DyEpZLD2EMnA0YKUU1WdnpbdUQsu5vVWbiybFxOC2SPdbylzEyV5iFy6qa7Nw==
+ }
+ engines: { npm: '>=8' }
hasBin: true
requiresBuild: true
dependencies:
- bin-links: 4.0.1
- node-fetch: 3.3.1
- tar: 6.1.15
+ bin-links: 4.0.3
+ https-proxy-agent: 7.0.2
+ node-fetch: 3.3.2
+ tar: 6.2.0
+ transitivePeerDependencies:
+ - supports-color
dev: true
- /supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
- dependencies:
- has-flag: 3.0.0
-
/supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
+ resolution:
+ {
+ integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ }
+ engines: { node: '>=8' }
dependencies:
has-flag: 4.0.0
dev: true
/supports-preserve-symlinks-flag@1.0.0:
- resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
- engines: {node: '>= 0.4'}
+ resolution:
+ {
+ integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+ }
+ engines: { node: '>= 0.4' }
+
+ /tailwind-merge@2.2.1:
+ resolution:
+ {
+ integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==
+ }
+ dependencies:
+ '@babel/runtime': 7.23.9
+ dev: false
- /synckit@0.8.5:
- resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==}
- engines: {node: ^14.18.0 || >=16.0.0}
+ /tailwindcss-animate@1.0.7(tailwindcss@3.4.1):
+ resolution:
+ {
+ integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==
+ }
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
dependencies:
- '@pkgr/utils': 2.4.1
- tslib: 2.5.2
- dev: true
+ tailwindcss: 3.4.1
+ dev: false
- /tailwindcss@3.3.2:
- resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==}
- engines: {node: '>=14.0.0'}
+ /tailwindcss@3.4.1:
+ resolution:
+ {
+ integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==
+ }
+ engines: { node: '>=14.0.0' }
hasBin: true
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
- chokidar: 3.5.3
+ chokidar: 3.6.0
didyoumean: 1.2.2
dlv: 1.1.3
- fast-glob: 3.2.12
+ fast-glob: 3.3.2
glob-parent: 6.0.2
is-glob: 4.0.3
- jiti: 1.18.2
+ jiti: 1.21.0
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.24
- postcss-import: 15.1.0(postcss@8.4.24)
- postcss-js: 4.0.1(postcss@8.4.24)
- postcss-load-config: 4.0.1(postcss@8.4.24)
- postcss-nested: 6.0.1(postcss@8.4.24)
- postcss-selector-parser: 6.0.13
- postcss-value-parser: 4.2.0
- resolve: 1.22.2
- sucrase: 3.32.0
+ postcss: 8.4.35
+ postcss-import: 15.1.0(postcss@8.4.35)
+ postcss-js: 4.0.1(postcss@8.4.35)
+ postcss-load-config: 4.0.2(postcss@8.4.35)
+ postcss-nested: 6.0.1(postcss@8.4.35)
+ postcss-selector-parser: 6.0.15
+ resolve: 1.22.8
+ sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
/tapable@2.2.1:
- resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
- engines: {node: '>=6'}
+ resolution:
+ {
+ integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+ }
+ engines: { node: '>=6' }
dev: true
- /tar@6.1.15:
- resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==}
- engines: {node: '>=10'}
+ /tar@6.2.0:
+ resolution:
+ {
+ integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==
+ }
+ engines: { node: '>=10' }
dependencies:
chownr: 2.0.0
fs-minipass: 2.1.0
@@ -3214,44 +4288,68 @@ packages:
dev: true
/text-table@0.2.0:
- resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ resolution:
+ {
+ integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+ }
dev: true
/thenify-all@1.6.0:
- resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
- engines: {node: '>=0.8'}
+ resolution:
+ {
+ integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==
+ }
+ engines: { node: '>=0.8' }
dependencies:
thenify: 3.3.1
/thenify@3.3.1:
- resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+ resolution:
+ {
+ integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
+ }
dependencies:
any-promise: 1.3.0
- /titleize@3.0.0:
- resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
- engines: {node: '>=12'}
- dev: true
-
- /to-fast-properties@2.0.0:
- resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
- engines: {node: '>=4'}
-
/to-regex-range@5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
+ resolution:
+ {
+ integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ }
+ engines: { node: '>=8.0' }
dependencies:
is-number: 7.0.0
/tr46@0.0.3:
- resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+ resolution:
+ {
+ integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+ }
dev: false
+ /ts-api-utils@1.2.1(typescript@5.3.3):
+ resolution:
+ {
+ integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==
+ }
+ engines: { node: '>=16' }
+ peerDependencies:
+ typescript: '>=4.2.0'
+ dependencies:
+ typescript: 5.3.3
+ dev: true
+
/ts-interface-checker@0.1.13:
- resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+ resolution:
+ {
+ integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
+ }
- /tsconfig-paths@3.14.2:
- resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==}
+ /tsconfig-paths@3.15.0:
+ resolution:
+ {
+ integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==
+ }
dependencies:
'@types/json5': 0.0.29
json5: 1.0.2
@@ -3259,136 +4357,167 @@ packages:
strip-bom: 3.0.0
dev: true
- /tslib@1.14.1:
- resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
- dev: true
-
- /tslib@2.5.2:
- resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==}
-
- /tsutils@3.21.0(typescript@5.0.4):
- resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
- engines: {node: '>= 6'}
- peerDependencies:
- typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
- dependencies:
- tslib: 1.14.1
- typescript: 5.0.4
- dev: true
+ /tslib@2.6.2:
+ resolution:
+ {
+ integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+ }
+ dev: false
/type-check@0.4.0:
- resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
- engines: {node: '>= 0.8.0'}
+ resolution:
+ {
+ integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ }
+ engines: { node: '>= 0.8.0' }
dependencies:
prelude-ls: 1.2.1
dev: true
/type-fest@0.20.2:
- resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+ }
+ engines: { node: '>=10' }
dev: true
- /type@1.2.0:
- resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==}
- dev: false
+ /typed-array-buffer@1.0.1:
+ resolution:
+ {
+ integrity: sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ es-errors: 1.3.0
+ is-typed-array: 1.1.13
+ dev: true
- /type@2.7.2:
- resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==}
- dev: false
+ /typed-array-byte-length@1.0.0:
+ resolution:
+ {
+ integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ call-bind: 1.0.6
+ for-each: 0.3.3
+ has-proto: 1.0.1
+ is-typed-array: 1.1.13
+ dev: true
- /typed-array-length@1.0.4:
- resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
+ /typed-array-byte-offset@1.0.0:
+ resolution:
+ {
+ integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- call-bind: 1.0.2
+ available-typed-arrays: 1.0.6
+ call-bind: 1.0.6
for-each: 0.3.3
- is-typed-array: 1.1.10
+ has-proto: 1.0.1
+ is-typed-array: 1.1.13
dev: true
- /typedarray-to-buffer@3.1.5:
- resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+ /typed-array-length@1.0.4:
+ resolution:
+ {
+ integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+ }
dependencies:
- is-typedarray: 1.0.0
- dev: false
+ call-bind: 1.0.6
+ for-each: 0.3.3
+ is-typed-array: 1.1.13
+ dev: true
- /typescript@5.0.4:
- resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==}
- engines: {node: '>=12.20'}
+ /typescript@5.3.3:
+ resolution:
+ {
+ integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==
+ }
+ engines: { node: '>=14.17' }
hasBin: true
dev: true
/unbox-primitive@1.0.2:
- resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ resolution:
+ {
+ integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ }
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.6
has-bigints: 1.0.2
has-symbols: 1.0.3
which-boxed-primitive: 1.0.2
dev: true
- /untildify@4.0.0:
- resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
- engines: {node: '>=8'}
- dev: true
+ /undici-types@5.26.5:
+ resolution:
+ {
+ integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+ }
- /update-browserslist-db@1.0.11(browserslist@4.21.7):
- resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
+ /update-browserslist-db@1.0.13(browserslist@4.22.3):
+ resolution:
+ {
+ integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
+ }
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
dependencies:
- browserslist: 4.21.7
- escalade: 3.1.1
+ browserslist: 4.22.3
+ escalade: 3.1.2
picocolors: 1.0.0
+ dev: true
/uri-js@4.4.1:
- resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ resolution:
+ {
+ integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ }
dependencies:
- punycode: 2.3.0
+ punycode: 2.3.1
dev: true
- /utf-8-validate@5.0.10:
- resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==}
- engines: {node: '>=6.14.2'}
- requiresBuild: true
- dependencies:
- node-gyp-build: 4.6.0
- dev: false
-
/util-deprecate@1.0.2:
- resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ resolution:
+ {
+ integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+ }
- /web-streams-polyfill@3.2.1:
- resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
- engines: {node: '>= 8'}
+ /web-streams-polyfill@3.3.2:
+ resolution:
+ {
+ integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==
+ }
+ engines: { node: '>= 8' }
dev: true
/webidl-conversions@3.0.1:
- resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
- dev: false
-
- /websocket@1.0.34:
- resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==}
- engines: {node: '>=4.0.0'}
- dependencies:
- bufferutil: 4.0.7
- debug: 2.6.9
- es5-ext: 0.10.62
- typedarray-to-buffer: 3.1.5
- utf-8-validate: 5.0.10
- yaeti: 0.0.6
- transitivePeerDependencies:
- - supports-color
+ resolution:
+ {
+ integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+ }
dev: false
/whatwg-url@5.0.0:
- resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+ resolution:
+ {
+ integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ }
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
dev: false
/which-boxed-primitive@1.0.2:
- resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ resolution:
+ {
+ integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ }
dependencies:
is-bigint: 1.0.4
is-boolean-object: 1.1.2
@@ -3397,8 +4526,32 @@ packages:
is-symbol: 1.0.4
dev: true
+ /which-builtin-type@1.1.3:
+ resolution:
+ {
+ integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==
+ }
+ engines: { node: '>= 0.4' }
+ dependencies:
+ function.prototype.name: 1.1.6
+ has-tostringtag: 1.0.2
+ is-async-function: 2.0.0
+ is-date-object: 1.0.5
+ is-finalizationregistry: 1.0.2
+ is-generator-function: 1.0.10
+ is-regex: 1.1.4
+ is-weakref: 1.0.2
+ isarray: 2.0.5
+ which-boxed-primitive: 1.0.2
+ which-collection: 1.0.1
+ which-typed-array: 1.1.14
+ dev: true
+
/which-collection@1.0.1:
- resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==}
+ resolution:
+ {
+ integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
+ }
dependencies:
is-map: 2.0.2
is-set: 2.0.2
@@ -3406,63 +4559,104 @@ packages:
is-weakset: 2.0.2
dev: true
- /which-typed-array@1.1.9:
- resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==}
- engines: {node: '>= 0.4'}
+ /which-typed-array@1.1.14:
+ resolution:
+ {
+ integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==
+ }
+ engines: { node: '>= 0.4' }
dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
+ available-typed-arrays: 1.0.6
+ call-bind: 1.0.6
for-each: 0.3.3
gopd: 1.0.1
- has-tostringtag: 1.0.0
- is-typed-array: 1.1.10
+ has-tostringtag: 1.0.2
dev: true
/which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
+ resolution:
+ {
+ integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ }
+ engines: { node: '>= 8' }
hasBin: true
dependencies:
isexe: 2.0.0
- dev: true
- /word-wrap@1.2.3:
- resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
- engines: {node: '>=0.10.0'}
- dev: true
+ /wrap-ansi@7.0.0:
+ resolution:
+ {
+ integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ }
+ engines: { node: '>=10' }
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ /wrap-ansi@8.1.0:
+ resolution:
+ {
+ integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+ }
+ engines: { node: '>=12' }
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
/wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ resolution:
+ {
+ integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+ }
+ dev: true
/write-file-atomic@5.0.1:
- resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ resolution:
+ {
+ integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==
+ }
+ engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 }
dependencies:
imurmurhash: 0.1.4
- signal-exit: 4.0.2
+ signal-exit: 4.1.0
dev: true
- /yaeti@0.0.6:
- resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==}
- engines: {node: '>=0.10.32'}
+ /ws@8.16.0:
+ resolution:
+ {
+ integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==
+ }
+ engines: { node: '>=10.0.0' }
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
dev: false
- /yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
-
/yallist@4.0.0:
- resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ resolution:
+ {
+ integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+ }
dev: true
- /yaml@2.3.1:
- resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
- engines: {node: '>= 14'}
+ /yaml@2.3.4:
+ resolution:
+ {
+ integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==
+ }
+ engines: { node: '>= 14' }
/yocto-queue@0.1.0:
- resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
- engines: {node: '>=10'}
+ resolution:
+ {
+ integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+ }
+ engines: { node: '>=10' }
dev: true
-
- /zod@3.21.4:
- resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==}
- dev: false
diff --git a/postcss.config.js b/postcss.config.js
index 5fcfa07c..5cbc2c7d 100644
--- a/postcss.config.js
+++ b/postcss.config.js
@@ -1,7 +1,6 @@
-
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {}
}
-};
\ No newline at end of file
+};
diff --git a/schema.sql b/schema.sql
index 15307ff2..f6eeab90 100644
--- a/schema.sql
+++ b/schema.sql
@@ -1,3 +1,4 @@
+@ -1,145 +0,0 @@
/**
* USERS
* Note: This table contains user data. Users should only be able to view and update their own data.
diff --git a/styles/main.css b/styles/main.css
index 7e1f4003..7d98d40c 100644
--- a/styles/main.css
+++ b/styles/main.css
@@ -8,7 +8,7 @@
box-sizing: inherit;
}
-*:focus {
+*:focus:not(ol) {
@apply outline-none ring-2 ring-pink-500 ring-opacity-50;
}
@@ -16,7 +16,10 @@ html {
height: 100%;
box-sizing: border-box;
touch-action: manipulation;
- font-feature-settings: 'case' 1, 'rlig' 1, 'calt' 0;
+ font-feature-settings:
+ 'case' 1,
+ 'rlig' 1,
+ 'calt' 0;
}
html,
@@ -38,6 +41,10 @@ a {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
+p a {
+ @apply hover:underline;
+}
+
.animated {
-webkit-animation-duration: 1s;
animation-duration: 1s;
@@ -48,5 +55,5 @@ a {
}
.height-screen-helper {
- height: calc(100vh - 80px);
+ min-height: calc(100vh - 80px);
}
diff --git a/supabase/.gitignore b/supabase/.gitignore
index 773c7c3e..98b57ac8 100644
--- a/supabase/.gitignore
+++ b/supabase/.gitignore
@@ -1,3 +1,5 @@
# Supabase
.branches
.temp
+.env
+config.toml
\ No newline at end of file
diff --git a/supabase/config.toml b/supabase/config.toml
deleted file mode 100644
index 50fbafaf..00000000
--- a/supabase/config.toml
+++ /dev/null
@@ -1,82 +0,0 @@
-# A string used to distinguish different Supabase projects on the same host. Defaults to the working
-# directory name when running `supabase init`.
-project_id = "nextjs-subscription-payments"
-
-[api]
-# Port to use for the API URL.
-port = 54321
-# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API
-# endpoints. public and storage are always included.
-schemas = ["public", "storage", "graphql_public"]
-# Extra schemas to add to the search_path of every request. public is always included.
-extra_search_path = ["public", "extensions"]
-# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size
-# for accidental or malicious requests.
-max_rows = 1000
-
-[db]
-# Port to use for the local database URL.
-port = 54322
-# The database major version to use. This has to be the same as your remote database's. Run `SHOW
-# server_version;` on the remote database to check.
-major_version = 15
-
-[studio]
-# Port to use for Supabase Studio.
-port = 54323
-
-# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they
-# are monitored, and you can view the emails that would have been sent from the web interface.
-[inbucket]
-# Port to use for the email testing server web interface.
-port = 54324
-smtp_port = 54325
-pop3_port = 54326
-
-[storage]
-# The maximum file size allowed (e.g. "5MB", "500KB").
-file_size_limit = "50MiB"
-
-[auth]
-# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used
-# in emails.
-site_url = "http://localhost:3000"
-# A list of *exact* URLs that auth providers are permitted to redirect to post authentication.
-additional_redirect_urls = ["https://localhost:3000"]
-# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 seconds (one
-# week).
-jwt_expiry = 3600
-# Allow/disallow new user signups to your project.
-enable_signup = true
-
-[auth.email]
-# Allow/disallow new user signups via email to your project.
-enable_signup = true
-# If enabled, a user will be required to confirm any email change on both the old, and new email
-# addresses. If disabled, only the new email is required to confirm.
-double_confirm_changes = true
-# If enabled, users need to confirm their email address before signing in.
-enable_confirmations = true
-
-# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`,
-# `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin`, `notion`, `twitch`,
-# `twitter`, `slack`, `spotify`, `workos`, `zoom`.
-[auth.external.apple]
-enabled = false
-client_id = ""
-secret = ""
-# Overrides the default auth redirectUrl.
-redirect_uri = ""
-# Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure,
-# or any other third-party OIDC providers.
-url = ""
-
-[analytics]
-enabled = false
-port = 54327
-vector_port = 54328
-# Setup BigQuery project to enable log viewer on local development stack.
-# See: https://supabase.com/docs/guides/getting-started/local-development#enabling-local-logging
-gcp_project_id = ""
-gcp_project_number = ""
-gcp_jwt_path = "supabase/gcloud.json"
diff --git a/supabase/link.js b/supabase/link.js
new file mode 100644
index 00000000..e4d506a0
--- /dev/null
+++ b/supabase/link.js
@@ -0,0 +1,26 @@
+// Run this script to spin up a Dockerized Supabase instance for local testing
+// You will need a Docker installation and .env.local file with the following variables:
+// SUPABASE_PROJECT_REF: The project reference for your Supabase instance
+// SUPABASE_DB_PASSWORD: The password for your Supabase instance
+// You can find these values in the Supabase dashboard for your remote instance
+require('dotenv').config({ path: './.env.local' });
+const { execSync } = require('child_process');
+
+// Define the actual command with sensitive data
+const command = `npx supabase link --project-ref "${process.env.SUPABASE_PROJECT_REF}" --password "${process.env.SUPABASE_DB_PASSWORD}"`;
+
+// Create a log-safe version of the command by replacing sensitive data
+const logSafeCommand = command.replace(
+ process.env.SUPABASE_DB_PASSWORD,
+ '[HIDDEN]'
+);
+
+try {
+ // Execute the actual command
+ execSync(command, { stdio: 'inherit' });
+} catch (error) {
+ // Log the safe version of the command
+ console.error('Failed to execute command:', logSafeCommand);
+ console.error('Error:', error.name);
+ process.exit(1);
+}
diff --git a/supabase/migrations/20240105210253_update.sql b/supabase/migrations/20240105210253_update.sql
new file mode 100644
index 00000000..dbff2696
--- /dev/null
+++ b/supabase/migrations/20240105210253_update.sql
@@ -0,0 +1,127 @@
+drop policy "Can update own user data." on "public"."users";
+
+drop policy "Can view own user data." on "public"."users";
+
+alter table "public"."customers" drop constraint "customers_id_fkey";
+
+alter table "public"."subscriptions" drop constraint "subscriptions_user_id_fkey";
+
+alter table "public"."users" drop constraint "users_id_fkey";
+
+alter table "public"."prices" drop column "description";
+
+alter table "public"."prices" drop column "metadata";
+
+alter table "public"."customers" add constraint "customers_id_fkey" FOREIGN KEY (id) REFERENCES auth.users(id) ON UPDATE CASCADE ON DELETE CASCADE not valid;
+
+alter table "public"."customers" validate constraint "customers_id_fkey";
+
+alter table "public"."subscriptions" add constraint "subscriptions_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth.users(id) ON UPDATE CASCADE ON DELETE CASCADE not valid;
+
+alter table "public"."subscriptions" validate constraint "subscriptions_user_id_fkey";
+
+alter table "public"."users" add constraint "users_id_fkey" FOREIGN KEY (id) REFERENCES auth.users(id) ON UPDATE CASCADE ON DELETE CASCADE not valid;
+
+alter table "public"."users" validate constraint "users_id_fkey";
+
+create policy "Enable delete access for customers based on id"
+on "public"."customers"
+as permissive
+for delete
+to authenticated
+using ((auth.uid() = id));
+
+
+create policy "Enable insert for customers based on id"
+on "public"."customers"
+as permissive
+for insert
+to authenticated
+with check ((auth.uid() = id));
+
+
+create policy "Enable read access for customers based on id"
+on "public"."customers"
+as permissive
+for select
+to authenticated
+using ((auth.uid() = id));
+
+
+create policy "Enable update access for customers based on id"
+on "public"."customers"
+as permissive
+for update
+to authenticated
+using ((auth.uid() = id))
+with check ((auth.uid() = id));
+
+
+create policy "Enable delete access for subscriptions based on user_id"
+on "public"."subscriptions"
+as permissive
+for delete
+to authenticated
+using ((auth.uid() = user_id));
+
+
+create policy "Enable insert for subscriptions based on user_id"
+on "public"."subscriptions"
+as permissive
+for insert
+to authenticated
+with check ((auth.uid() = user_id));
+
+
+create policy "Enable read access for subscriptions based on user_id"
+on "public"."subscriptions"
+as permissive
+for select
+to authenticated
+using ((auth.uid() = user_id));
+
+
+create policy "Enable update access for subscriptions based on user_id"
+on "public"."subscriptions"
+as permissive
+for update
+to authenticated
+using ((auth.uid() = user_id))
+with check ((auth.uid() = user_id));
+
+
+create policy "Enable delete access for users based on id"
+on "public"."users"
+as permissive
+for delete
+to authenticated
+using ((auth.uid() = id));
+
+
+create policy "Enable insert for users based on id"
+on "public"."users"
+as permissive
+for insert
+to authenticated
+with check ((auth.uid() = id));
+
+
+create policy "Enable read access for users based on id"
+on "public"."users"
+as permissive
+for select
+to authenticated
+using ((auth.uid() = id));
+
+
+create policy "Enable update access for users based on id"
+on "public"."users"
+as permissive
+for update
+to authenticated
+using ((auth.uid() = id))
+with check ((auth.uid() = id));
+
+
+
+
diff --git a/tailwind.config.js b/tailwind.config.js
index 431bf41f..e179ddaa 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -9,11 +9,32 @@ module.exports = {
'pages/**/*.{ts,tsx}'
],
theme: {
+ container: {
+ center: true,
+ padding: '2rem',
+ screens: {
+ '2xl': '1400px'
+ }
+ },
extend: {
fontFamily: {
sans: ['var(--font-sans)', ...fontFamily.sans]
+ },
+ keyframes: {
+ 'accordion-down': {
+ from: { height: 0 },
+ to: { height: 'var(--radix-accordion-content-height)' }
+ },
+ 'accordion-up': {
+ from: { height: 'var(--radix-accordion-content-height)' },
+ to: { height: 0 }
+ }
+ },
+ animation: {
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out'
}
}
},
- plugins: []
+ plugins: [require('tailwindcss-animate')]
};
diff --git a/tsconfig.json b/tsconfig.json
index bf574ed2..f59f0f05 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,11 +1,7 @@
{
"compilerOptions": {
"target": "es5",
- "lib": [
- "dom",
- "dom.iterable",
- "esnext"
- ],
+ "lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@@ -19,9 +15,7 @@
"jsx": "preserve",
"baseUrl": ".",
"paths": {
- "@/*": [
- "./*"
- ]
+ "@/*": ["./*"]
},
"incremental": true,
"plugins": [
@@ -30,13 +24,6 @@
}
]
},
- "include": [
- "next-env.d.ts",
- "**/*.ts",
- "**/*.tsx",
- ".next/types/**/*.ts"
- ],
- "exclude": [
- "node_modules"
- ]
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
}
diff --git a/types_db.ts b/types_db.ts
index 966c791a..7491c8ac 100644
Binary files a/types_db.ts and b/types_db.ts differ
diff --git a/utils/auth-helpers/client.ts b/utils/auth-helpers/client.ts
new file mode 100644
index 00000000..1d87a330
--- /dev/null
+++ b/utils/auth-helpers/client.ts
@@ -0,0 +1,45 @@
+'use client';
+
+import { createClient } from '@/utils/supabase/client';
+import { type Provider } from '@supabase/supabase-js';
+import { getURL } from '@/utils/helpers';
+import { redirectToPath } from './server';
+import { AppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime';
+
+export async function handleRequest(
+ e: React.FormEvent,
+ requestFunc: (formData: FormData) => Promise,
+ router: AppRouterInstance | null = null
+): Promise {
+ // Prevent default form submission refresh
+ e.preventDefault();
+
+ const formData = new FormData(e.currentTarget);
+ const redirectUrl: string = await requestFunc(formData);
+ console.log(redirectUrl);
+
+ if (router) {
+ // If client-side router is provided, use it to redirect
+ return router.push(redirectUrl);
+ } else {
+ // Otherwise, redirect server-side
+ return await redirectToPath(redirectUrl);
+ }
+}
+
+export async function signInWithOAuth(e: React.FormEvent) {
+ // Prevent default form submission refresh
+ e.preventDefault();
+ const formData = new FormData(e.currentTarget);
+ const provider = String(formData.get('provider')).trim() as Provider;
+
+ // Create client-side supabase client and call signInWithOAuth
+ const supabase = createClient();
+ const redirectURL = getURL('/auth/callback');
+ await supabase.auth.signInWithOAuth({
+ provider: provider,
+ options: {
+ redirectTo: redirectURL
+ }
+ });
+}
diff --git a/utils/auth-helpers/server.ts b/utils/auth-helpers/server.ts
new file mode 100644
index 00000000..ae466586
--- /dev/null
+++ b/utils/auth-helpers/server.ts
@@ -0,0 +1,336 @@
+'use server';
+
+import { createClient } from '@/utils/supabase/server';
+import { cookies } from 'next/headers';
+import { redirect } from 'next/navigation';
+import { getURL, getErrorRedirect, getStatusRedirect } from 'utils/helpers';
+import { getAuthTypes } from 'utils/auth-helpers/settings';
+
+function isValidEmail(email: string) {
+ var regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
+ return regex.test(email);
+}
+
+export async function redirectToPath(path: string) {
+ return redirect(path);
+}
+
+export async function SignOut(formData: FormData) {
+ const pathName = String(formData.get('pathName')).trim();
+
+ const supabase = createClient();
+ const { error } = await supabase.auth.signOut();
+
+ if (error) {
+ return getErrorRedirect(
+ pathName,
+ 'Hmm... Something went wrong.',
+ 'You could not be signed out.'
+ );
+ }
+
+ return '/signin';
+}
+
+export async function signInWithEmail(formData: FormData) {
+ const cookieStore = cookies();
+ const callbackURL = getURL('/auth/callback');
+
+ const email = String(formData.get('email')).trim();
+ let redirectPath: string;
+
+ if (!isValidEmail(email)) {
+ redirectPath = getErrorRedirect(
+ '/signin/email_signin',
+ 'Invalid email address.',
+ 'Please try again.'
+ );
+ }
+
+ const supabase = createClient();
+ let options = {
+ emailRedirectTo: callbackURL,
+ shouldCreateUser: true
+ };
+
+ // If allowPassword is false, do not create a new user
+ const { allowPassword } = getAuthTypes();
+ if (allowPassword) options.shouldCreateUser = false;
+ const { data, error } = await supabase.auth.signInWithOtp({
+ email,
+ options: options
+ });
+
+ if (error) {
+ redirectPath = getErrorRedirect(
+ '/signin/email_signin',
+ 'You could not be signed in.',
+ error.message
+ );
+ } else if (data) {
+ cookieStore.set('preferredSignInView', 'email_signin', { path: '/' });
+ redirectPath = getStatusRedirect(
+ '/signin/email_signin',
+ 'Success!',
+ 'Please check your email for a magic link. You may now close this tab.',
+ true
+ );
+ } else {
+ redirectPath = getErrorRedirect(
+ '/signin/email_signin',
+ 'Hmm... Something went wrong.',
+ 'You could not be signed in.'
+ );
+ }
+
+ return redirectPath;
+}
+
+export async function requestPasswordUpdate(formData: FormData) {
+ const callbackURL = getURL('/auth/reset_password');
+
+ // Get form data
+ const email = String(formData.get('email')).trim();
+ let redirectPath: string;
+
+ if (!isValidEmail(email)) {
+ redirectPath = getErrorRedirect(
+ '/signin/forgot_password',
+ 'Invalid email address.',
+ 'Please try again.'
+ );
+ }
+
+ const supabase = createClient();
+
+ const { data, error } = await supabase.auth.resetPasswordForEmail(email, {
+ redirectTo: callbackURL
+ });
+
+ if (error) {
+ redirectPath = getErrorRedirect(
+ '/signin/forgot_password',
+ error.message,
+ 'Please try again.'
+ );
+ } else if (data) {
+ redirectPath = getStatusRedirect(
+ '/signin/forgot_password',
+ 'Success!',
+ 'Please check your email for a password reset link. You may now close this tab.',
+ true
+ );
+ } else {
+ redirectPath = getErrorRedirect(
+ '/signin/forgot_password',
+ 'Hmm... Something went wrong.',
+ 'Password reset email could not be sent.'
+ );
+ }
+
+ return redirectPath;
+}
+
+export async function signInWithPassword(formData: FormData) {
+ const cookieStore = cookies();
+ const email = String(formData.get('email')).trim();
+ const password = String(formData.get('password')).trim();
+ let redirectPath: string;
+
+ const supabase = createClient();
+ const { error, data } = await supabase.auth.signInWithPassword({
+ email,
+ password
+ });
+
+ if (error) {
+ redirectPath = getErrorRedirect(
+ '/signin/password_signin',
+ 'Sign in failed.',
+ error.message
+ );
+ } else if (data.user) {
+ cookieStore.set('preferredSignInView', 'password_signin', { path: '/' });
+ redirectPath = getStatusRedirect('/', 'Success!', 'You are now signed in.');
+ } else {
+ redirectPath = getErrorRedirect(
+ '/signin/password_signin',
+ 'Hmm... Something went wrong.',
+ 'You could not be signed in.'
+ );
+ }
+
+ return redirectPath;
+}
+
+export async function signUp(formData: FormData) {
+ const callbackURL = getURL('/auth/callback');
+
+ const email = String(formData.get('email')).trim();
+ const password = String(formData.get('password')).trim();
+ let redirectPath: string;
+
+ if (!isValidEmail(email)) {
+ redirectPath = getErrorRedirect(
+ '/signin/signup',
+ 'Invalid email address.',
+ 'Please try again.'
+ );
+ }
+
+ const supabase = createClient();
+ const { error, data } = await supabase.auth.signUp({
+ email,
+ password,
+ options: {
+ emailRedirectTo: callbackURL
+ }
+ });
+
+ if (error) {
+ redirectPath = getErrorRedirect(
+ '/signin/signup',
+ 'Sign up failed.',
+ error.message
+ );
+ } else if (data.session) {
+ redirectPath = getStatusRedirect('/', 'Success!', 'You are now signed in.');
+ } else if (
+ data.user &&
+ data.user.identities &&
+ data.user.identities.length == 0
+ ) {
+ redirectPath = getErrorRedirect(
+ '/signin/signup',
+ 'Sign up failed.',
+ 'There is already an account associated with this email address. Try resetting your password.'
+ );
+ } else if (data.user) {
+ redirectPath = getStatusRedirect(
+ '/',
+ 'Success!',
+ 'Please check your email for a confirmation link. You may now close this tab.'
+ );
+ } else {
+ redirectPath = getErrorRedirect(
+ '/signin/signup',
+ 'Hmm... Something went wrong.',
+ 'You could not be signed up.'
+ );
+ }
+
+ return redirectPath;
+}
+
+export async function updatePassword(formData: FormData) {
+ const password = String(formData.get('password')).trim();
+ const passwordConfirm = String(formData.get('passwordConfirm')).trim();
+ let redirectPath: string;
+
+ // Check that the password and confirmation match
+ if (password !== passwordConfirm) {
+ redirectPath = getErrorRedirect(
+ '/signin/update_password',
+ 'Your password could not be updated.',
+ 'Passwords do not match.'
+ );
+ }
+
+ const supabase = createClient();
+ const { error, data } = await supabase.auth.updateUser({
+ password
+ });
+
+ if (error) {
+ redirectPath = getErrorRedirect(
+ '/signin/update_password',
+ 'Your password could not be updated.',
+ error.message
+ );
+ } else if (data.user) {
+ redirectPath = getStatusRedirect(
+ '/',
+ 'Success!',
+ 'Your password has been updated.'
+ );
+ } else {
+ redirectPath = getErrorRedirect(
+ '/signin/update_password',
+ 'Hmm... Something went wrong.',
+ 'Your password could not be updated.'
+ );
+ }
+
+ return redirectPath;
+}
+
+export async function updateEmail(formData: FormData) {
+ // Get form data
+ const newEmail = String(formData.get('newEmail')).trim();
+
+ // Check that the email is valid
+ if (!isValidEmail(newEmail)) {
+ return getErrorRedirect(
+ '/account',
+ 'Your email could not be updated.',
+ 'Invalid email address.'
+ );
+ }
+
+ const supabase = createClient();
+
+ const callbackUrl = getURL(
+ getStatusRedirect('/account', 'Success!', `Your email has been updated.`)
+ );
+
+ const { error } = await supabase.auth.updateUser(
+ { email: newEmail },
+ {
+ emailRedirectTo: callbackUrl
+ }
+ );
+
+ if (error) {
+ return getErrorRedirect(
+ '/account',
+ 'Your email could not be updated.',
+ error.message
+ );
+ } else {
+ return getStatusRedirect(
+ '/account',
+ 'Confirmation emails sent.',
+ `You will need to confirm the update by clicking the links sent to both the old and new email addresses.`
+ );
+ }
+}
+
+export async function updateName(formData: FormData) {
+ // Get form data
+ const fullName = String(formData.get('fullName')).trim();
+
+ const supabase = createClient();
+ const { error, data } = await supabase.auth.updateUser({
+ data: { full_name: fullName }
+ });
+
+ if (error) {
+ return getErrorRedirect(
+ '/account',
+ 'Your name could not be updated.',
+ error.message
+ );
+ } else if (data.user) {
+ return getStatusRedirect(
+ '/account',
+ 'Success!',
+ 'Your name has been updated.'
+ );
+ } else {
+ return getErrorRedirect(
+ '/account',
+ 'Hmm... Something went wrong.',
+ 'Your name could not be updated.'
+ );
+ }
+}
diff --git a/utils/auth-helpers/settings.ts b/utils/auth-helpers/settings.ts
new file mode 100644
index 00000000..fb159e81
--- /dev/null
+++ b/utils/auth-helpers/settings.ts
@@ -0,0 +1,49 @@
+// Boolean toggles to determine which auth types are allowed
+const allowOauth = true;
+const allowEmail = true;
+const allowPassword = true;
+
+// Boolean toggle to determine whether auth interface should route through server or client
+// (Currently set to false because screen sometimes flickers with server redirects)
+const allowServerRedirect = false;
+
+// Check that at least one of allowPassword and allowEmail is true
+if (!allowPassword && !allowEmail)
+ throw new Error('At least one of allowPassword and allowEmail must be true');
+
+export const getAuthTypes = () => {
+ return { allowOauth, allowEmail, allowPassword };
+};
+
+export const getViewTypes = () => {
+ // Define the valid view types
+ let viewTypes: string[] = [];
+ if (allowEmail) {
+ viewTypes = [...viewTypes, 'email_signin'];
+ }
+ if (allowPassword) {
+ viewTypes = [
+ ...viewTypes,
+ 'password_signin',
+ 'forgot_password',
+ 'update_password',
+ 'signup'
+ ];
+ }
+
+ return viewTypes;
+};
+
+export const getDefaultSignInView = (preferredSignInView: string | null) => {
+ // Define the default sign in view
+ let defaultView = allowPassword ? 'password_signin' : 'email_signin';
+ if (preferredSignInView && getViewTypes().includes(preferredSignInView)) {
+ defaultView = preferredSignInView;
+ }
+
+ return defaultView;
+};
+
+export const getRedirectMethod = () => {
+ return allowServerRedirect ? 'server' : 'client';
+};
diff --git a/utils/cn.ts b/utils/cn.ts
new file mode 100644
index 00000000..9ad0df42
--- /dev/null
+++ b/utils/cn.ts
@@ -0,0 +1,6 @@
+import { type ClassValue, clsx } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/utils/helpers.ts b/utils/helpers.ts
index 8fc24f08..806bd7c8 100644
--- a/utils/helpers.ts
+++ b/utils/helpers.ts
@@ -1,17 +1,28 @@
-import { Database } from '@/types_db';
+import type { Tables } from '@/types_db';
-type Price = Database['public']['Tables']['prices']['Row'];
+type Price = Tables<'prices'>;
-export const getURL = () => {
+export const getURL = (path: string = '') => {
+ // Check if NEXT_PUBLIC_SITE_URL is set and non-empty. Set this to your site URL in production env.
let url =
- process?.env?.NEXT_PUBLIC_SITE_URL ?? // Set this to your site URL in production env.
- process?.env?.NEXT_PUBLIC_VERCEL_URL ?? // Automatically set by Vercel.
- 'http://localhost:3000/';
- // Make sure to include `https://` when not localhost.
- url = url.includes('http') ? url : `https://${url}`;
- // Make sure to including trailing `/`.
- url = url.charAt(url.length - 1) === '/' ? url : `${url}/`;
- return url;
+ process?.env?.NEXT_PUBLIC_SITE_URL &&
+ process.env.NEXT_PUBLIC_SITE_URL.trim() !== ''
+ ? process.env.NEXT_PUBLIC_SITE_URL
+ : // If not set, check for NEXT_PUBLIC_VERCEL_URL, which is automatically set by Vercel.
+ process?.env?.NEXT_PUBLIC_VERCEL_URL &&
+ process.env.NEXT_PUBLIC_VERCEL_URL.trim() !== ''
+ ? process.env.NEXT_PUBLIC_VERCEL_URL
+ : // If neither is set, default to localhost for local development.
+ 'http://localhost:3000/';
+
+ // Trim the URL and remove trailing slash if exists.
+ url = url.replace(/\/+$/, '');
+
+ // Ensure path starts without a slash to avoid double slashes in the final URL.
+ path = path.replace(/^\/+/, '');
+
+ // Concatenate the URL and the path.
+ return path ? `${url}/${path}` : url;
};
export const postData = async ({
@@ -30,17 +41,94 @@ export const postData = async ({
body: JSON.stringify(data)
});
- if (!res.ok) {
- console.log('Error in postData', { url, data, res });
-
- throw Error(res.statusText);
- }
-
return res.json();
};
export const toDateTime = (secs: number) => {
- var t = new Date('1970-01-01T00:30:00Z'); // Unix epoch start.
+ var t = new Date(+0); // Unix epoch start.
t.setSeconds(secs);
return t;
};
+
+export const calculateTrialEndUnixTimestamp = (
+ trialPeriodDays: number | null | undefined
+) => {
+ // Check if trialPeriodDays is null, undefined, or less than 2 days
+ if (
+ trialPeriodDays === null ||
+ trialPeriodDays === undefined ||
+ trialPeriodDays < 2
+ ) {
+ return undefined;
+ }
+
+ const currentDate = new Date(); // Current date and time
+ const trialEnd = new Date(
+ currentDate.getTime() + (trialPeriodDays + 1) * 24 * 60 * 60 * 1000
+ ); // Add trial days
+ return Math.floor(trialEnd.getTime() / 1000); // Convert to Unix timestamp in seconds
+};
+
+const toastKeyMap: { [key: string]: string[] } = {
+ status: ['status', 'status_description'],
+ error: ['error', 'error_description']
+};
+
+const getToastRedirect = (
+ path: string,
+ toastType: string,
+ toastName: string,
+ toastDescription: string = '',
+ disableButton: boolean = false,
+ arbitraryParams: string = ''
+): string => {
+ const [nameKey, descriptionKey] = toastKeyMap[toastType];
+
+ let redirectPath = `${path}?${nameKey}=${encodeURIComponent(toastName)}`;
+
+ if (toastDescription) {
+ redirectPath += `&${descriptionKey}=${encodeURIComponent(toastDescription)}`;
+ }
+
+ if (disableButton) {
+ redirectPath += `&disable_button=true`;
+ }
+
+ if (arbitraryParams) {
+ redirectPath += `&${arbitraryParams}`;
+ }
+
+ return redirectPath;
+};
+
+export const getStatusRedirect = (
+ path: string,
+ statusName: string,
+ statusDescription: string = '',
+ disableButton: boolean = false,
+ arbitraryParams: string = ''
+) =>
+ getToastRedirect(
+ path,
+ 'status',
+ statusName,
+ statusDescription,
+ disableButton,
+ arbitraryParams
+ );
+
+export const getErrorRedirect = (
+ path: string,
+ errorName: string,
+ errorDescription: string = '',
+ disableButton: boolean = false,
+ arbitraryParams: string = ''
+) =>
+ getToastRedirect(
+ path,
+ 'error',
+ errorName,
+ errorDescription,
+ disableButton,
+ arbitraryParams
+ );
diff --git a/utils/stripe-client.ts b/utils/stripe/client.ts
similarity index 100%
rename from utils/stripe-client.ts
rename to utils/stripe/client.ts
diff --git a/utils/stripe.ts b/utils/stripe/config.ts
similarity index 68%
rename from utils/stripe.ts
rename to utils/stripe/config.ts
index ef569889..aff19d0e 100644
--- a/utils/stripe.ts
+++ b/utils/stripe/config.ts
@@ -4,12 +4,15 @@ export const stripe = new Stripe(
process.env.STRIPE_SECRET_KEY_LIVE ?? process.env.STRIPE_SECRET_KEY ?? '',
{
// https://github.com/stripe/stripe-node#configuration
- apiVersion: '2022-11-15',
+ // https://stripe.com/docs/api/versioning
+ // @ts-ignore
+ apiVersion: null,
// Register this as an official Stripe plugin.
// https://stripe.com/docs/building-plugins#setappinfo
appInfo: {
name: 'Next.js Subscription Starter',
- version: '0.1.0'
+ version: '0.0.0',
+ url: 'https://github.com/vercel/nextjs-subscription-payments'
}
}
);
diff --git a/utils/stripe/server.ts b/utils/stripe/server.ts
new file mode 100644
index 00000000..dd48f0c2
--- /dev/null
+++ b/utils/stripe/server.ts
@@ -0,0 +1,181 @@
+'use server';
+
+import Stripe from 'stripe';
+import { stripe } from '@/utils/stripe/config';
+import { createClient } from '@/utils/supabase/server';
+import { createOrRetrieveCustomer } from '@/utils/supabase/admin';
+import {
+ getURL,
+ getErrorRedirect,
+ calculateTrialEndUnixTimestamp
+} from '@/utils/helpers';
+import { Tables } from '@/types_db';
+
+type Price = Tables<'prices'>;
+
+type CheckoutResponse = {
+ errorRedirect?: string;
+ sessionId?: string;
+};
+
+export async function checkoutWithStripe(
+ price: Price,
+ redirectPath: string = '/account'
+): Promise {
+ try {
+ // Get the user from Supabase auth
+ const supabase = createClient();
+ const {
+ error,
+ data: { user }
+ } = await supabase.auth.getUser();
+
+ if (error || !user) {
+ console.error(error);
+ throw new Error('Could not get user session.');
+ }
+
+ // Retrieve or create the customer in Stripe
+ let customer: string;
+ try {
+ customer = await createOrRetrieveCustomer({
+ uuid: user?.id || '',
+ email: user?.email || ''
+ });
+ } catch (err) {
+ console.error(err);
+ throw new Error('Unable to access customer record.');
+ }
+
+ let params: Stripe.Checkout.SessionCreateParams = {
+ allow_promotion_codes: true,
+ billing_address_collection: 'required',
+ customer,
+ customer_update: {
+ address: 'auto'
+ },
+ line_items: [
+ {
+ price: price.id,
+ quantity: 1
+ }
+ ],
+ cancel_url: getURL(),
+ success_url: getURL(redirectPath)
+ };
+
+ console.log(
+ 'Trial end:',
+ calculateTrialEndUnixTimestamp(price.trial_period_days)
+ );
+ if (price.type === 'recurring') {
+ params = {
+ ...params,
+ mode: 'subscription',
+ subscription_data: {
+ trial_end: calculateTrialEndUnixTimestamp(price.trial_period_days)
+ }
+ };
+ } else if (price.type === 'one_time') {
+ params = {
+ ...params,
+ mode: 'payment'
+ };
+ }
+
+ // Create a checkout session in Stripe
+ let session;
+ try {
+ session = await stripe.checkout.sessions.create(params);
+ } catch (err) {
+ console.error(err);
+ throw new Error('Unable to create checkout session.');
+ }
+
+ // Instead of returning a Response, just return the data or error.
+ if (session) {
+ return { sessionId: session.id };
+ } else {
+ throw new Error('Unable to create checkout session.');
+ }
+ } catch (error) {
+ if (error instanceof Error) {
+ return {
+ errorRedirect: getErrorRedirect(
+ redirectPath,
+ error.message,
+ 'Please try again later or contact a system administrator.'
+ )
+ };
+ } else {
+ return {
+ errorRedirect: getErrorRedirect(
+ redirectPath,
+ 'An unknown error occurred.',
+ 'Please try again later or contact a system administrator.'
+ )
+ };
+ }
+ }
+}
+
+export async function createStripePortal(currentPath: string) {
+ try {
+ const supabase = createClient();
+ const {
+ error,
+ data: { user }
+ } = await supabase.auth.getUser();
+
+ if (!user) {
+ if (error) {
+ console.error(error);
+ }
+ throw new Error('Could not get user session.');
+ }
+
+ let customer;
+ try {
+ customer = await createOrRetrieveCustomer({
+ uuid: user.id || '',
+ email: user.email || ''
+ });
+ } catch (err) {
+ console.error(err);
+ throw new Error('Unable to access customer record.');
+ }
+
+ if (!customer) {
+ throw new Error('Could not get customer.');
+ }
+
+ try {
+ const { url } = await stripe.billingPortal.sessions.create({
+ customer,
+ return_url: getURL('/account')
+ });
+ if (!url) {
+ throw new Error('Could not create billing portal');
+ }
+ return url;
+ } catch (err) {
+ console.error(err);
+ throw new Error('Could not create billing portal');
+ }
+ } catch (error) {
+ if (error instanceof Error) {
+ console.error(error);
+ return getErrorRedirect(
+ currentPath,
+ error.message,
+ 'Please try again later or contact a system administrator.'
+ );
+ } else {
+ return getErrorRedirect(
+ currentPath,
+ 'An unknown error occurred.',
+ 'Please try again later or contact a system administrator.'
+ );
+ }
+ }
+}
diff --git a/utils/supabase-admin.ts b/utils/supabase-admin.ts
deleted file mode 100644
index b1aa2767..00000000
--- a/utils/supabase-admin.ts
+++ /dev/null
@@ -1,185 +0,0 @@
-import { toDateTime } from './helpers';
-import { stripe } from './stripe';
-import { createClient } from '@supabase/supabase-js';
-import Stripe from 'stripe';
-import type { Database } from 'types_db';
-
-type Product = Database['public']['Tables']['products']['Row'];
-type Price = Database['public']['Tables']['prices']['Row'];
-
-// Note: supabaseAdmin uses the SERVICE_ROLE_KEY which you must only use in a secure server-side context
-// as it has admin privileges and overwrites RLS policies!
-const supabaseAdmin = createClient(
- process.env.NEXT_PUBLIC_SUPABASE_URL || '',
- process.env.SUPABASE_SERVICE_ROLE_KEY || ''
-);
-
-const upsertProductRecord = async (product: Stripe.Product) => {
- const productData: Product = {
- id: product.id,
- active: product.active,
- name: product.name,
- description: product.description ?? null,
- image: product.images?.[0] ?? null,
- metadata: product.metadata
- };
-
- const { error } = await supabaseAdmin.from('products').upsert([productData]);
- if (error) throw error;
- console.log(`Product inserted/updated: ${product.id}`);
-};
-
-const upsertPriceRecord = async (price: Stripe.Price) => {
- const priceData: Price = {
- id: price.id,
- product_id: typeof price.product === 'string' ? price.product : '',
- active: price.active,
- currency: price.currency,
- description: price.nickname ?? null,
- type: price.type,
- unit_amount: price.unit_amount ?? null,
- interval: price.recurring?.interval ?? null,
- interval_count: price.recurring?.interval_count ?? null,
- trial_period_days: price.recurring?.trial_period_days ?? null,
- metadata: price.metadata
- };
-
- const { error } = await supabaseAdmin.from('prices').upsert([priceData]);
- if (error) throw error;
- console.log(`Price inserted/updated: ${price.id}`);
-};
-
-const createOrRetrieveCustomer = async ({
- email,
- uuid
-}: {
- email: string;
- uuid: string;
-}) => {
- const { data, error } = await supabaseAdmin
- .from('customers')
- .select('stripe_customer_id')
- .eq('id', uuid)
- .single();
- if (error || !data?.stripe_customer_id) {
- // No customer record found, let's create one.
- const customerData: { metadata: { supabaseUUID: string }; email?: string } =
- {
- metadata: {
- supabaseUUID: uuid
- }
- };
- if (email) customerData.email = email;
- const customer = await stripe.customers.create(customerData);
- // Now insert the customer ID into our Supabase mapping table.
- const { error: supabaseError } = await supabaseAdmin
- .from('customers')
- .insert([{ id: uuid, stripe_customer_id: customer.id }]);
- if (supabaseError) throw supabaseError;
- console.log(`New customer created and inserted for ${uuid}.`);
- return customer.id;
- }
- return data.stripe_customer_id;
-};
-
-/**
- * Copies the billing details from the payment method to the customer object.
- */
-const copyBillingDetailsToCustomer = async (
- uuid: string,
- payment_method: Stripe.PaymentMethod
-) => {
- //Todo: check this assertion
- const customer = payment_method.customer as string;
- const { name, phone, address } = payment_method.billing_details;
- if (!name || !phone || !address) return;
- //@ts-ignore
- await stripe.customers.update(customer, { name, phone, address });
- const { error } = await supabaseAdmin
- .from('users')
- .update({
- billing_address: { ...address },
- payment_method: { ...payment_method[payment_method.type] }
- })
- .eq('id', uuid);
- if (error) throw error;
-};
-
-const manageSubscriptionStatusChange = async (
- subscriptionId: string,
- customerId: string,
- createAction = false
-) => {
- // Get customer's UUID from mapping table.
- const { data: customerData, error: noCustomerError } = await supabaseAdmin
- .from('customers')
- .select('id')
- .eq('stripe_customer_id', customerId)
- .single();
- if (noCustomerError) throw noCustomerError;
-
- const { id: uuid } = customerData!;
-
- const subscription = await stripe.subscriptions.retrieve(subscriptionId, {
- expand: ['default_payment_method']
- });
- // Upsert the latest status of the subscription object.
- const subscriptionData: Database['public']['Tables']['subscriptions']['Insert'] =
- {
- id: subscription.id,
- user_id: uuid,
- metadata: subscription.metadata,
- status: subscription.status,
- price_id: subscription.items.data[0].price.id,
- //TODO check quantity on subscription
- // @ts-ignore
- quantity: subscription.quantity,
- cancel_at_period_end: subscription.cancel_at_period_end,
- cancel_at: subscription.cancel_at
- ? toDateTime(subscription.cancel_at).toISOString()
- : null,
- canceled_at: subscription.canceled_at
- ? toDateTime(subscription.canceled_at).toISOString()
- : null,
- current_period_start: toDateTime(
- subscription.current_period_start
- ).toISOString(),
- current_period_end: toDateTime(
- subscription.current_period_end
- ).toISOString(),
- created: toDateTime(subscription.created).toISOString(),
- ended_at: subscription.ended_at
- ? toDateTime(subscription.ended_at).toISOString()
- : null,
- trial_start: subscription.trial_start
- ? toDateTime(subscription.trial_start).toISOString()
- : null,
- trial_end: subscription.trial_end
- ? toDateTime(subscription.trial_end).toISOString()
- : null
- };
-
- const { error } = await supabaseAdmin
- .from('subscriptions')
- .upsert([subscriptionData]);
- if (error) throw error;
- console.log(
- `Inserted/updated subscription [${subscription.id}] for user [${uuid}]`
- );
-
- // For a new subscription copy the billing details to the customer object.
- // NOTE: This is a costly operation and should happen at the very end.
- if (createAction && subscription.default_payment_method && uuid)
- //@ts-ignore
- await copyBillingDetailsToCustomer(
- uuid,
- subscription.default_payment_method as Stripe.PaymentMethod
- );
-};
-
-export {
- upsertProductRecord,
- upsertPriceRecord,
- createOrRetrieveCustomer,
- manageSubscriptionStatusChange
-};
diff --git a/utils/supabase/admin.ts b/utils/supabase/admin.ts
new file mode 100644
index 00000000..077df5d0
--- /dev/null
+++ b/utils/supabase/admin.ts
@@ -0,0 +1,292 @@
+import { toDateTime } from '@/utils/helpers';
+import { stripe } from '@/utils/stripe/config';
+import { createClient } from '@supabase/supabase-js';
+import Stripe from 'stripe';
+import type { Database, Tables, TablesInsert } from 'types_db';
+
+type Product = Tables<'products'>;
+type Price = Tables<'prices'>;
+
+// Change to control trial period length
+const TRIAL_PERIOD_DAYS = 0;
+
+// Note: supabaseAdmin uses the SERVICE_ROLE_KEY which you must only use in a secure server-side context
+// as it has admin privileges and overwrites RLS policies!
+const supabaseAdmin = createClient(
+ process.env.NEXT_PUBLIC_SUPABASE_URL || '',
+ process.env.SUPABASE_SERVICE_ROLE_KEY || ''
+);
+
+const upsertProductRecord = async (product: Stripe.Product) => {
+ const productData: Product = {
+ id: product.id,
+ active: product.active,
+ name: product.name,
+ description: product.description ?? null,
+ image: product.images?.[0] ?? null,
+ metadata: product.metadata
+ };
+
+ const { error: upsertError } = await supabaseAdmin
+ .from('products')
+ .upsert([productData]);
+ if (upsertError)
+ throw new Error(`Product insert/update failed: ${upsertError}`);
+ console.log(`Product inserted/updated: ${product.id}`);
+};
+
+const upsertPriceRecord = async (
+ price: Stripe.Price,
+ retryCount = 0,
+ maxRetries = 3
+) => {
+ const priceData: Price = {
+ id: price.id,
+ product_id: typeof price.product === 'string' ? price.product : '',
+ active: price.active,
+ currency: price.currency,
+ type: price.type,
+ unit_amount: price.unit_amount ?? null,
+ interval: price.recurring?.interval ?? null,
+ interval_count: price.recurring?.interval_count ?? null,
+ trial_period_days: price.recurring?.trial_period_days ?? TRIAL_PERIOD_DAYS
+ };
+
+ const { error: upsertError } = await supabaseAdmin
+ .from('prices')
+ .upsert([priceData]);
+
+ if (upsertError?.message.includes('foreign key constraint')) {
+ if (retryCount < maxRetries) {
+ console.log(`Retry attempt ${retryCount + 1} for price ID: ${price.id}`);
+ await new Promise((resolve) => setTimeout(resolve, 2000));
+ await upsertPriceRecord(price, retryCount + 1, maxRetries);
+ } else {
+ throw new Error(
+ `Price insert/update failed after ${maxRetries} retries: ${upsertError}`
+ );
+ }
+ } else if (upsertError) {
+ throw new Error(`Price insert/update failed: ${upsertError}`);
+ } else {
+ console.log(`Price inserted/updated: ${price.id}`);
+ }
+};
+
+const deleteProductRecord = async (product: Stripe.Product) => {
+ const { error: deletionError } = await supabaseAdmin
+ .from('products')
+ .delete()
+ .eq('id', product.id);
+ if (deletionError)
+ throw new Error(`Product deletion failed: ${deletionError}`);
+ console.log(`Product deleted: ${product.id}`);
+};
+
+const deletePriceRecord = async (price: Stripe.Price) => {
+ const { error: deletionError } = await supabaseAdmin
+ .from('prices')
+ .delete()
+ .eq('id', price.id);
+ if (deletionError) throw new Error(`Price deletion failed: ${deletionError}`);
+ console.log(`Price deleted: ${price.id}`);
+};
+
+const upsertCustomerToSupabase = async (uuid: string, customerId: string) => {
+ const { error: upsertError } = await supabaseAdmin
+ .from('customers')
+ .upsert([{ id: uuid, stripe_customer_id: customerId }]);
+
+ if (upsertError)
+ throw new Error(`Supabase customer record creation failed: ${upsertError}`);
+
+ return customerId;
+};
+
+const createCustomerInStripe = async (uuid: string, email: string) => {
+ const customerData = { metadata: { supabaseUUID: uuid }, email: email };
+ const newCustomer = await stripe.customers.create(customerData);
+ if (!newCustomer) throw new Error('Stripe customer creation failed.');
+
+ return newCustomer.id;
+};
+
+const createOrRetrieveCustomer = async ({
+ email,
+ uuid
+}: {
+ email: string;
+ uuid: string;
+}) => {
+ // Check if the customer already exists in Supabase
+ const { data: existingSupabaseCustomer, error: queryError } =
+ await supabaseAdmin
+ .from('customers')
+ .select('*')
+ .eq('id', uuid)
+ .maybeSingle();
+
+ if (queryError) {
+ throw new Error(`Supabase customer lookup failed: ${queryError}`);
+ }
+
+ // Retrieve the Stripe customer ID using the Supabase customer ID, with email fallback
+ let stripeCustomerId: string | undefined;
+ if (existingSupabaseCustomer?.stripe_customer_id) {
+ const existingStripeCustomer = await stripe.customers.retrieve(
+ existingSupabaseCustomer.stripe_customer_id
+ );
+ stripeCustomerId = existingStripeCustomer.id;
+ } else {
+ // If Stripe ID is missing from Supabase, try to retrieve Stripe customer ID by email
+ const stripeCustomers = await stripe.customers.list({ email: email });
+ stripeCustomerId =
+ stripeCustomers.data.length > 0 ? stripeCustomers.data[0].id : undefined;
+ }
+
+ // If still no stripeCustomerId, create a new customer in Stripe
+ const stripeIdToInsert = stripeCustomerId
+ ? stripeCustomerId
+ : await createCustomerInStripe(uuid, email);
+ if (!stripeIdToInsert) throw new Error('Stripe customer creation failed.');
+
+ if (existingSupabaseCustomer && stripeCustomerId) {
+ // If Supabase has a record but doesn't match Stripe, update Supabase record
+ if (existingSupabaseCustomer.stripe_customer_id !== stripeCustomerId) {
+ const { error: updateError } = await supabaseAdmin
+ .from('customers')
+ .update({ stripe_customer_id: stripeCustomerId })
+ .eq('id', uuid);
+
+ if (updateError)
+ throw new Error(
+ `Supabase customer record update failed: ${updateError}`
+ );
+ console.warn(
+ `Supabase customer record mismatched Stripe ID. Supabase record updated.`
+ );
+ }
+ // If Supabase has a record and matches Stripe, return Stripe customer ID
+ return stripeCustomerId;
+ } else {
+ console.warn(
+ `Supabase customer record was missing. A new record was created.`
+ );
+
+ // If Supabase has no record, create a new record and return Stripe customer ID
+ const upsertedStripeCustomer = await upsertCustomerToSupabase(
+ uuid,
+ stripeIdToInsert
+ );
+ if (!upsertedStripeCustomer)
+ throw new Error('Supabase customer record creation failed.');
+
+ return upsertedStripeCustomer;
+ }
+};
+
+/**
+ * Copies the billing details from the payment method to the customer object.
+ */
+const copyBillingDetailsToCustomer = async (
+ uuid: string,
+ payment_method: Stripe.PaymentMethod
+) => {
+ //Todo: check this assertion
+ const customer = payment_method.customer as string;
+ const { name, phone, address } = payment_method.billing_details;
+ if (!name || !phone || !address) return;
+ //@ts-ignore
+ await stripe.customers.update(customer, { name, phone, address });
+ const { error: updateError } = await supabaseAdmin
+ .from('users')
+ .update({
+ billing_address: { ...address },
+ payment_method: { ...payment_method[payment_method.type] }
+ })
+ .eq('id', uuid);
+ if (updateError) throw new Error(`Customer update failed: ${updateError}`);
+};
+
+const manageSubscriptionStatusChange = async (
+ subscriptionId: string,
+ customerId: string,
+ createAction = false
+) => {
+ // Get customer's UUID from mapping table.
+ const { data: customerData, error: noCustomerError } = await supabaseAdmin
+ .from('customers')
+ .select('id')
+ .eq('stripe_customer_id', customerId)
+ .single();
+
+ if (noCustomerError)
+ throw new Error(`Customer lookup failed: ${noCustomerError}`);
+
+ const { id: uuid } = customerData!;
+
+ const subscription = await stripe.subscriptions.retrieve(subscriptionId, {
+ expand: ['default_payment_method']
+ });
+ // Upsert the latest status of the subscription object.
+ const subscriptionData: TablesInsert<'subscriptions'> = {
+ id: subscription.id,
+ user_id: uuid,
+ metadata: subscription.metadata,
+ status: subscription.status,
+ price_id: subscription.items.data[0].price.id,
+ //TODO check quantity on subscription
+ // @ts-ignore
+ quantity: subscription.quantity,
+ cancel_at_period_end: subscription.cancel_at_period_end,
+ cancel_at: subscription.cancel_at
+ ? toDateTime(subscription.cancel_at).toISOString()
+ : null,
+ canceled_at: subscription.canceled_at
+ ? toDateTime(subscription.canceled_at).toISOString()
+ : null,
+ current_period_start: toDateTime(
+ subscription.current_period_start
+ ).toISOString(),
+ current_period_end: toDateTime(
+ subscription.current_period_end
+ ).toISOString(),
+ created: toDateTime(subscription.created).toISOString(),
+ ended_at: subscription.ended_at
+ ? toDateTime(subscription.ended_at).toISOString()
+ : null,
+ trial_start: subscription.trial_start
+ ? toDateTime(subscription.trial_start).toISOString()
+ : null,
+ trial_end: subscription.trial_end
+ ? toDateTime(subscription.trial_end).toISOString()
+ : null
+ };
+
+ const { error: upsertError } = await supabaseAdmin
+ .from('subscriptions')
+ .upsert([subscriptionData]);
+ if (upsertError)
+ throw new Error(`Subscription insert/update failed: ${upsertError}`);
+ console.log(
+ `Inserted/updated subscription [${subscription.id}] for user [${uuid}]`
+ );
+
+ // For a new subscription copy the billing details to the customer object.
+ // NOTE: This is a costly operation and should happen at the very end.
+ if (createAction && subscription.default_payment_method && uuid)
+ //@ts-ignore
+ await copyBillingDetailsToCustomer(
+ uuid,
+ subscription.default_payment_method as Stripe.PaymentMethod
+ );
+};
+
+export {
+ upsertProductRecord,
+ upsertPriceRecord,
+ deleteProductRecord,
+ deletePriceRecord,
+ createOrRetrieveCustomer,
+ manageSubscriptionStatusChange
+};
diff --git a/utils/supabase/client.ts b/utils/supabase/client.ts
new file mode 100644
index 00000000..c315dedd
--- /dev/null
+++ b/utils/supabase/client.ts
@@ -0,0 +1,10 @@
+import { createBrowserClient } from '@supabase/ssr';
+import { Database } from '@/types_db';
+
+// Define a function to create a Supabase client for client-side operations
+export const createClient = () =>
+ createBrowserClient(
+ // Pass Supabase URL and anonymous key from the environment to the client
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
+ );
diff --git a/utils/supabase/middleware.ts b/utils/supabase/middleware.ts
new file mode 100644
index 00000000..32f1b3c5
--- /dev/null
+++ b/utils/supabase/middleware.ts
@@ -0,0 +1,84 @@
+import { createServerClient, type CookieOptions } from '@supabase/ssr';
+import { type NextRequest, NextResponse } from 'next/server';
+
+export const createClient = (request: NextRequest) => {
+ // Create an unmodified response
+ let response = NextResponse.next({
+ request: {
+ headers: request.headers
+ }
+ });
+
+ const supabase = createServerClient(
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
+ {
+ cookies: {
+ get(name: string) {
+ return request.cookies.get(name)?.value;
+ },
+ set(name: string, value: string, options: CookieOptions) {
+ // If the cookie is updated, update the cookies for the request and response
+ request.cookies.set({
+ name,
+ value,
+ ...options
+ });
+ response = NextResponse.next({
+ request: {
+ headers: request.headers
+ }
+ });
+ response.cookies.set({
+ name,
+ value,
+ ...options
+ });
+ },
+ remove(name: string, options: CookieOptions) {
+ // If the cookie is removed, update the cookies for the request and response
+ request.cookies.set({
+ name,
+ value: '',
+ ...options
+ });
+ response = NextResponse.next({
+ request: {
+ headers: request.headers
+ }
+ });
+ response.cookies.set({
+ name,
+ value: '',
+ ...options
+ });
+ }
+ }
+ }
+ );
+
+ return { supabase, response };
+};
+
+export const updateSession = async (request: NextRequest) => {
+ try {
+ // This `try/catch` block is only here for the interactive tutorial.
+ // Feel free to remove once you have Supabase connected.
+ const { supabase, response } = createClient(request);
+
+ // This will refresh session if expired - required for Server Components
+ // https://supabase.com/docs/guides/auth/server-side/nextjs
+ await supabase.auth.getUser();
+
+ return response;
+ } catch (e) {
+ // If you are here, a Supabase client could not be created!
+ // This is likely because you have not set up environment variables.
+ // Check out http://localhost:3000 for Next Steps.
+ return NextResponse.next({
+ request: {
+ headers: request.headers
+ }
+ });
+ }
+};
diff --git a/utils/supabase/server.ts b/utils/supabase/server.ts
new file mode 100644
index 00000000..ccf79c7c
--- /dev/null
+++ b/utils/supabase/server.ts
@@ -0,0 +1,43 @@
+import { createServerClient, type CookieOptions } from '@supabase/ssr';
+import { cookies } from 'next/headers';
+import { Database } from '@/types_db';
+
+// Define a function to create a Supabase client for server-side operations
+// The function takes a cookie store created with next/headers cookies as an argument
+export const createClient = () => {
+ const cookieStore = cookies();
+
+ return createServerClient(
+ // Pass Supabase URL and anonymous key from the environment to the client
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
+
+ // Define a cookies object with methods for interacting with the cookie store and pass it to the client
+ {
+ cookies: {
+ // The get method is used to retrieve a cookie by its name
+ get(name: string) {
+ return cookieStore.get(name)?.value;
+ },
+ // The set method is used to set a cookie with a given name, value, and options
+ set(name: string, value: string, options: CookieOptions) {
+ try {
+ cookieStore.set({ name, value, ...options });
+ } catch (error) {
+ // If the set method is called from a Server Component, an error may occur
+ // This can be ignored if there is middleware refreshing user sessions
+ }
+ },
+ // The remove method is used to delete a cookie by its name
+ remove(name: string, options: CookieOptions) {
+ try {
+ cookieStore.set({ name, value: '', ...options });
+ } catch (error) {
+ // If the remove method is called from a Server Component, an error may occur
+ // This can be ignored if there is middleware refreshing user sessions
+ }
+ }
+ }
+ }
+ );
+};