From 6a339a4b02196d14b96ac86f8f4a3d6966dd6302 Mon Sep 17 00:00:00 2001 From: Giancarlo Buomprisco Date: Wed, 19 Jun 2024 23:00:00 +0800 Subject: [PATCH] Billing get subscription enhancement (#36) * Filter out metered line items from billing schema This update refines the process of creating a billing schema by filtering out metered line items. The change is necessary as metered line items can be shared across different plans, potentially causing conflicts or duplicates in the schema. * Update packages to newer versions This update upgrades several packages across multiple project files to their latest version. These packages include "supabase-js", "react-query", "react-hook-form", and "pnpm". The commit ensures the project is up-to-date with recent package versions, potentially benefiting from bug fixes, new features, and performance improvements. * Add subscription retrieval in billing services Added a function to retrieve subscription info in both Stripe and LemonSqueezy billing services. To accomplish this, new methods were added to related services and types. This allows querying specific subscription data based on its id, and throws an error if it fails. Furthermore, PayloadBuilder classes were created to systematically build the subscription payload. * Remove account ID retrieval from Lemon Squeezy billing service The code that was querying the database to fetch the accountId has been removed from lemon-squeezy-billing-strategy.service.ts. It was unnecessary as the Lemon Squeezy API does not provide account ID and therefore it is always left empty. Also, adjustments have been made in billing-strategy-provider.service.ts to reflect that the target account ID can be optional. * Extract 'next' parameter from callback URL The update allows for the extraction of the 'next' parameter from the callback URL. If such a parameter is available, it is subsequently added to the search parameters. The enhancement improves URL parameter handling in the authentication callback service. * Refactor URL redirection in auth-callback service The update simplifies the redirection logic in the authentication callback service. This is achieved by setting the url pathname directly to the redirect path, instead of first setting it to the callback parameter. Moreover, the code handling the 'next' path has also been streamlined, setting the url pathname to the next path when available. --- apps/web/package.json | 8 +- package.json | 2 +- .../billing/core/src/create-billing-schema.ts | 7 +- .../billing-strategy-provider.service.ts | 9 + .../billing-webhook-handler.service.ts | 2 +- packages/billing/core/src/types/index.ts | 17 +- packages/billing/gateway/package.json | 4 +- .../billing-event-handler.service.ts | 2 +- .../billing-gateway.service.ts | 12 +- .../lemon-squeezy-billing-strategy.service.ts | 87 ++++ ...zy-subscription-payload-builder.service.ts | 141 ++++++ .../lemon-squeezy-webhook-handler.service.ts | 133 +----- packages/billing/stripe/package.json | 2 +- .../stripe-billing-strategy.service.ts | 45 ++ ...pe-subscription-payload-builder.service.ts | 100 +++++ .../stripe-webhook-handler.service.ts | 148 +++---- packages/cms/keystatic/package.json | 2 +- packages/database-webhooks/package.json | 2 +- packages/features/accounts/package.json | 6 +- packages/features/admin/package.json | 6 +- packages/features/auth/package.json | 6 +- packages/features/notifications/package.json | 4 +- packages/features/team-accounts/package.json | 6 +- packages/i18n/package.json | 2 +- packages/next/package.json | 2 +- packages/supabase/package.json | 6 +- .../supabase/src/auth-callback.service.ts | 12 +- packages/ui/package.json | 2 +- pnpm-lock.yaml | 417 +++++++++--------- tooling/prettier/package.json | 2 +- 30 files changed, 738 insertions(+), 456 deletions(-) create mode 100644 packages/billing/lemon-squeezy/src/services/lemon-squeezy-subscription-payload-builder.service.ts create mode 100644 packages/billing/stripe/src/services/stripe-subscription-payload-builder.service.ts diff --git a/apps/web/package.json b/apps/web/package.json index ae6666d36..0ae2fa71f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -54,9 +54,9 @@ "@makerkit/data-loader-supabase-nextjs": "^1.2.3", "@marsidev/react-turnstile": "^0.7.1", "@radix-ui/react-icons": "^1.3.0", - "@supabase/supabase-js": "^2.43.4", - "@tanstack/react-query": "5.45.0", - "@tanstack/react-query-next-experimental": "^5.45.0", + "@supabase/supabase-js": "^2.43.5", + "@tanstack/react-query": "5.45.1", + "@tanstack/react-query-next-experimental": "^5.45.1", "@tanstack/react-table": "^8.17.3", "date-fns": "^3.6.0", "lucide-react": "^0.395.0", @@ -65,7 +65,7 @@ "next-themes": "0.3.0", "react": "18.3.1", "react-dom": "18.3.1", - "react-hook-form": "^7.51.5", + "react-hook-form": "^7.52.0", "react-i18next": "^14.1.2", "recharts": "^2.12.7", "sonner": "^1.5.0", diff --git a/package.json b/package.json index 5bafd8ed4..d72dc559f 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@manypkg/cli": "^0.21.4", "@turbo/gen": "^2.0.4", "cross-env": "^7.0.3", - "pnpm": "^9.3.0", + "pnpm": "^9.4.0", "prettier": "^3.3.2", "turbo": "2.0.4", "typescript": "^5.4.5", diff --git a/packages/billing/core/src/create-billing-schema.ts b/packages/billing/core/src/create-billing-schema.ts index 159f4616e..ce4f9c875 100644 --- a/packages/billing/core/src/create-billing-schema.ts +++ b/packages/billing/core/src/create-billing-schema.ts @@ -173,7 +173,12 @@ export const PlanSchema = z ) .refine( (item) => { - const ids = item.lineItems.map((item) => item.id); + // metered line items can be shared across plans + const lineItems = item.lineItems.filter( + (item) => item.type !== LineItemType.Metered, + ); + + const ids = lineItems.map((item) => item.id); return ids.length === new Set(ids).size; }, diff --git a/packages/billing/core/src/services/billing-strategy-provider.service.ts b/packages/billing/core/src/services/billing-strategy-provider.service.ts index a56c29a96..1529a174a 100644 --- a/packages/billing/core/src/services/billing-strategy-provider.service.ts +++ b/packages/billing/core/src/services/billing-strategy-provider.service.ts @@ -9,6 +9,7 @@ import { RetrieveCheckoutSessionSchema, UpdateSubscriptionParamsSchema, } from '../schema'; +import { UpsertSubscriptionParams } from '../types'; export abstract class BillingStrategyProviderService { abstract createBillingPortalSession( @@ -65,4 +66,12 @@ export abstract class BillingStrategyProviderService { interval: string; amount: number; }>; + + abstract getSubscription( + subscriptionId: string, + ): Promise; } diff --git a/packages/billing/core/src/services/billing-webhook-handler.service.ts b/packages/billing/core/src/services/billing-webhook-handler.service.ts index 7a3ec3172..60ffc0ea1 100644 --- a/packages/billing/core/src/services/billing-webhook-handler.service.ts +++ b/packages/billing/core/src/services/billing-webhook-handler.service.ts @@ -43,7 +43,7 @@ export abstract class BillingWebhookHandlerService { onPaymentFailed: (sessionId: string) => Promise; // generic handler for any event - onEvent?: (data: Data) => Promise; + onEvent?: (data: unknown) => Promise; }, ): Promise; } diff --git a/packages/billing/core/src/types/index.ts b/packages/billing/core/src/types/index.ts index cb67f1a80..f62f12819 100644 --- a/packages/billing/core/src/types/index.ts +++ b/packages/billing/core/src/types/index.ts @@ -1,7 +1,22 @@ import { Database } from '@kit/supabase/database'; export type UpsertSubscriptionParams = - Database['public']['Functions']['upsert_subscription']['Args']; + Database['public']['Functions']['upsert_subscription']['Args'] & { + line_items: Array; + }; + +interface LineItem { + id: string; + quantity: number; + subscription_id: string; + subscription_item_id: string; + product_id: string; + variant_id: string; + price_amount: number | null | undefined; + interval: string; + interval_count: number; + type: 'flat' | 'metered' | 'per_seat' | undefined; +} export type UpsertOrderParams = Database['public']['Functions']['upsert_order']['Args']; \ No newline at end of file diff --git a/packages/billing/gateway/package.json b/packages/billing/gateway/package.json index 577464493..57f73631f 100644 --- a/packages/billing/gateway/package.json +++ b/packages/billing/gateway/package.json @@ -27,13 +27,13 @@ "@kit/tailwind-config": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:^", - "@supabase/supabase-js": "^2.43.4", + "@supabase/supabase-js": "^2.43.5", "@types/react": "^18.3.3", "date-fns": "^3.6.0", "lucide-react": "^0.395.0", "next": "14.2.4", "react": "18.3.1", - "react-hook-form": "^7.51.5", + "react-hook-form": "^7.52.0", "react-i18next": "^14.1.2", "zod": "^3.23.8" }, diff --git a/packages/billing/gateway/src/server/services/billing-event-handler/billing-event-handler.service.ts b/packages/billing/gateway/src/server/services/billing-event-handler/billing-event-handler.service.ts index 4e4a99aaa..7da20387e 100644 --- a/packages/billing/gateway/src/server/services/billing-event-handler/billing-event-handler.service.ts +++ b/packages/billing/gateway/src/server/services/billing-event-handler/billing-event-handler.service.ts @@ -26,7 +26,7 @@ interface CustomHandlersParams { ) => Promise; onPaymentSucceeded: (sessionId: string) => Promise; onPaymentFailed: (sessionId: string) => Promise; - onEvent?: (data: Data) => Promise; + onEvent(event: unknown): Promise; } /** diff --git a/packages/billing/gateway/src/server/services/billing-gateway/billing-gateway.service.ts b/packages/billing/gateway/src/server/services/billing-gateway/billing-gateway.service.ts index b02e1c041..8662f3b37 100644 --- a/packages/billing/gateway/src/server/services/billing-gateway/billing-gateway.service.ts +++ b/packages/billing/gateway/src/server/services/billing-gateway/billing-gateway.service.ts @@ -127,7 +127,17 @@ class BillingGatewayService { return strategy.updateSubscriptionItem(payload); } - getStrategy() { + /** + * Retrieves a subscription from the provider. + * @param subscriptionId + */ + async getSubscription(subscriptionId: string) { + const strategy = await this.getStrategy(); + + return strategy.getSubscription(subscriptionId); + } + + private getStrategy() { return BillingGatewayFactoryService.GetProviderStrategy(this.provider); } } diff --git a/packages/billing/lemon-squeezy/src/services/lemon-squeezy-billing-strategy.service.ts b/packages/billing/lemon-squeezy/src/services/lemon-squeezy-billing-strategy.service.ts index 8db513deb..ac55fb253 100644 --- a/packages/billing/lemon-squeezy/src/services/lemon-squeezy-billing-strategy.service.ts +++ b/packages/billing/lemon-squeezy/src/services/lemon-squeezy-billing-strategy.service.ts @@ -4,6 +4,7 @@ import { cancelSubscription, createUsageRecord, getCheckout, + getSubscription, getVariant, listUsageRecords, updateSubscriptionItem, @@ -24,6 +25,7 @@ import { getLogger } from '@kit/shared/logger'; import { createLemonSqueezyBillingPortalSession } from './create-lemon-squeezy-billing-portal-session'; import { createLemonSqueezyCheckout } from './create-lemon-squeezy-checkout'; +import { createLemonSqueezySubscriptionPayloadBuilderService } from './lemon-squeezy-subscription-payload-builder.service'; export class LemonSqueezyBillingStrategyService implements BillingStrategyProviderService @@ -340,6 +342,91 @@ export class LemonSqueezyBillingStrategyService return { success: true }; } + async getSubscription(subscriptionId: string) { + const logger = await getLogger(); + + const ctx = { + name: this.namespace, + subscriptionId, + }; + + logger.info(ctx, 'Retrieving subscription...'); + + const { error, data } = await getSubscription(subscriptionId); + + if (error) { + logger.error( + { + ...ctx, + error, + }, + 'Failed to retrieve subscription', + ); + + throw new Error('Failed to retrieve subscription'); + } + + if (!data) { + logger.error( + { + ...ctx, + }, + 'Subscription not found', + ); + + throw new Error('Subscription not found'); + } + + logger.info(ctx, 'Subscription retrieved successfully'); + + const payloadBuilderService = + createLemonSqueezySubscriptionPayloadBuilderService(); + + const subscription = data.data.attributes; + const customerId = subscription.customer_id.toString(); + const status = subscription.status; + const variantId = subscription.variant_id; + const productId = subscription.product_id; + const createdAt = subscription.created_at; + const endsAt = subscription.ends_at; + const renewsAt = subscription.renews_at; + const trialEndsAt = subscription.trial_ends_at; + const intervalCount = subscription.billing_anchor; + const interval = intervalCount === 1 ? 'month' : 'year'; + + const subscriptionItemId = + data.data.attributes.first_subscription_item?.id.toString() as string; + + const lineItems = [ + { + id: subscriptionItemId.toString(), + product: productId.toString(), + variant: variantId.toString(), + quantity: subscription.first_subscription_item?.quantity ?? 1, + // not anywhere in the API + priceAmount: 0, + }, + ]; + + return payloadBuilderService.build({ + customerId, + id: subscriptionId, + // not in the API + accountId: '', + lineItems, + status, + interval, + intervalCount, + // not in the API + currency: '', + periodStartsAt: new Date(createdAt).getTime(), + periodEndsAt: new Date(renewsAt ?? endsAt).getTime(), + cancelAtPeriodEnd: subscription.cancelled, + trialStartsAt: trialEndsAt ? new Date(createdAt).getTime() : null, + trialEndsAt: trialEndsAt ? new Date(trialEndsAt).getTime() : null, + }); + } + /** * @name queryUsage * @description Queries the usage of the metered billing diff --git a/packages/billing/lemon-squeezy/src/services/lemon-squeezy-subscription-payload-builder.service.ts b/packages/billing/lemon-squeezy/src/services/lemon-squeezy-subscription-payload-builder.service.ts new file mode 100644 index 000000000..cf10823f1 --- /dev/null +++ b/packages/billing/lemon-squeezy/src/services/lemon-squeezy-subscription-payload-builder.service.ts @@ -0,0 +1,141 @@ +import { BillingConfig, getLineItemTypeById } from '@kit/billing'; +import { UpsertSubscriptionParams } from '@kit/billing/types'; + +type SubscriptionStatus = + | 'on_trial' + | 'active' + | 'cancelled' + | 'paused' + | 'expired' + | 'unpaid' + | 'past_due'; + +/** + * @name createLemonSqueezySubscriptionPayloadBuilderService + * @description Create a new instance of the `LemonSqueezySubscriptionPayloadBuilderService` class + */ +export function createLemonSqueezySubscriptionPayloadBuilderService() { + return new LemonSqueezySubscriptionPayloadBuilderService(); +} + +/** + * @name LemonSqueezySubscriptionPayloadBuilderService + * @description This class is used to build the subscription payload for Lemon Squeezy + */ +class LemonSqueezySubscriptionPayloadBuilderService { + private config?: BillingConfig; + + /** + * @name withBillingConfig + * @description Set the billing config for the subscription payload + * @param config + */ + withBillingConfig(config: BillingConfig) { + this.config = config; + + return this; + } + + /** + * @name build + * @description Build the subscription payload for Lemon Squeezy + * @param params + */ + build< + LineItem extends { + id: string; + quantity: number; + product: string; + variant: string; + priceAmount: number; + }, + >(params: { + id: string; + accountId: string; + customerId: string; + lineItems: LineItem[]; + interval: string; + intervalCount: number; + status: string; + currency: string; + cancelAtPeriodEnd: boolean; + periodStartsAt: number; + periodEndsAt: number; + trialStartsAt: number | null; + trialEndsAt: number | null; + }): UpsertSubscriptionParams { + const canceledAtPeriodEnd = + params.status === 'cancelled' && params.cancelAtPeriodEnd; + + const active = + params.status === 'active' || + params.status === 'trialing' || + canceledAtPeriodEnd; + + const lineItems = params.lineItems.map((item) => { + const quantity = item.quantity ?? 1; + + return { + id: item.id, + subscription_item_id: item.id, + quantity, + interval: params.interval, + interval_count: params.intervalCount, + subscription_id: params.id, + product_id: item.product, + variant_id: item.variant, + price_amount: item.priceAmount, + type: this.config + ? getLineItemTypeById(this.config, item.variant) + : undefined, + }; + }); + + // otherwise we are updating a subscription + // and we only need to return the update payload + return { + target_subscription_id: params.id, + target_account_id: params.accountId, + target_customer_id: params.customerId, + billing_provider: 'lemon-squeezy', + status: this.getSubscriptionStatus(params.status as SubscriptionStatus), + line_items: lineItems, + active, + currency: params.currency, + cancel_at_period_end: params.cancelAtPeriodEnd ?? false, + period_starts_at: getISOString(params.periodStartsAt) as string, + period_ends_at: getISOString(params.periodEndsAt) as string, + trial_starts_at: params.trialStartsAt + ? getISOString(params.trialStartsAt) + : undefined, + trial_ends_at: params.trialEndsAt + ? getISOString(params.trialEndsAt) + : undefined, + }; + } + + private getSubscriptionStatus(status: SubscriptionStatus) { + switch (status) { + case 'active': + return 'active'; + case 'cancelled': + return 'canceled'; + case 'paused': + return 'paused'; + case 'on_trial': + return 'trialing'; + case 'past_due': + return 'past_due'; + case 'unpaid': + return 'unpaid'; + case 'expired': + return 'past_due'; + default: + return 'active'; + } + } +} + +function getISOString(date: number | null) { + return date ? new Date(date).toISOString() : undefined; +} diff --git a/packages/billing/lemon-squeezy/src/services/lemon-squeezy-webhook-handler.service.ts b/packages/billing/lemon-squeezy/src/services/lemon-squeezy-webhook-handler.service.ts index 472768109..5989a8740 100644 --- a/packages/billing/lemon-squeezy/src/services/lemon-squeezy-webhook-handler.service.ts +++ b/packages/billing/lemon-squeezy/src/services/lemon-squeezy-webhook-handler.service.ts @@ -1,10 +1,6 @@ import { getOrder, getVariant } from '@lemonsqueezy/lemonsqueezy.js'; -import { - BillingConfig, - BillingWebhookHandlerService, - getLineItemTypeById, -} from '@kit/billing'; +import { BillingConfig, BillingWebhookHandlerService } from '@kit/billing'; import { getLogger } from '@kit/shared/logger'; import { Database } from '@kit/supabase/database'; @@ -12,24 +8,31 @@ import { getLemonSqueezyEnv } from '../schema/lemon-squeezy-server-env.schema'; import { OrderWebhook } from '../types/order-webhook'; import { SubscriptionWebhook } from '../types/subscription-webhook'; import { initializeLemonSqueezyClient } from './lemon-squeezy-sdk'; +import { createLemonSqueezySubscriptionPayloadBuilderService } from './lemon-squeezy-subscription-payload-builder.service'; import { createHmac } from './verify-hmac'; type UpsertSubscriptionParams = - Database['public']['Functions']['upsert_subscription']['Args']; + Database['public']['Functions']['upsert_subscription']['Args'] & { + line_items: Array; + }; type UpsertOrderParams = Database['public']['Functions']['upsert_order']['Args']; -type OrderStatus = 'pending' | 'failed' | 'paid' | 'refunded'; +interface LineItem { + id: string; + quantity: number; + subscription_id: string; + subscription_item_id: string; + product_id: string; + variant_id: string; + price_amount: number | null | undefined; + interval: string; + interval_count: number; + type: 'flat' | 'metered' | 'per_seat' | undefined; +} -type SubscriptionStatus = - | 'on_trial' - | 'active' - | 'cancelled' - | 'paused' - | 'expired' - | 'unpaid' - | 'past_due'; +type OrderStatus = 'pending' | 'failed' | 'paid' | 'refunded'; export class LemonSqueezyWebhookHandlerService implements BillingWebhookHandlerService @@ -252,7 +255,10 @@ export class LemonSqueezyWebhookHandlerService const interval = intervalCount === 1 ? 'month' : 'year'; - const payload = this.buildSubscriptionPayload({ + const payloadBuilderService = + createLemonSqueezySubscriptionPayloadBuilderService(); + + const payload = payloadBuilderService.withBillingConfig(this.config).build({ customerId, id: subscriptionId, accountId, @@ -292,76 +298,6 @@ export class LemonSqueezyWebhookHandlerService return onSubscriptionDeletedCallback(subscription.data.id); } - private buildSubscriptionPayload< - LineItem extends { - id: string; - quantity: number; - product: string; - variant: string; - priceAmount: number; - }, - >(params: { - id: string; - accountId: string; - customerId: string; - lineItems: LineItem[]; - interval: string; - intervalCount: number; - status: string; - currency: string; - cancelAtPeriodEnd: boolean; - periodStartsAt: number; - periodEndsAt: number; - trialStartsAt: number | null; - trialEndsAt: number | null; - }): UpsertSubscriptionParams { - const canceledAtPeriodEnd = - params.status === 'cancelled' && params.cancelAtPeriodEnd; - - const active = - params.status === 'active' || - params.status === 'trialing' || - canceledAtPeriodEnd; - - const lineItems = params.lineItems.map((item) => { - const quantity = item.quantity ?? 1; - - return { - id: item.id, - quantity, - interval: params.interval, - interval_count: params.intervalCount, - subscription_id: params.id, - product_id: item.product, - variant_id: item.variant, - price_amount: item.priceAmount, - type: getLineItemTypeById(this.config, item.variant), - }; - }); - - // otherwise we are updating a subscription - // and we only need to return the update payload - return { - target_subscription_id: params.id, - target_account_id: params.accountId, - target_customer_id: params.customerId, - billing_provider: this.provider, - status: this.getSubscriptionStatus(params.status as SubscriptionStatus), - line_items: lineItems, - active, - currency: params.currency, - cancel_at_period_end: params.cancelAtPeriodEnd ?? false, - period_starts_at: getISOString(params.periodStartsAt) as string, - period_ends_at: getISOString(params.periodEndsAt) as string, - trial_starts_at: params.trialStartsAt - ? getISOString(params.trialStartsAt) - : undefined, - trial_ends_at: params.trialEndsAt - ? getISOString(params.trialEndsAt) - : undefined, - }; - } - private getOrderStatus(status: OrderStatus) { switch (status) { case 'paid': @@ -376,31 +312,6 @@ export class LemonSqueezyWebhookHandlerService return 'pending'; } } - - private getSubscriptionStatus(status: SubscriptionStatus) { - switch (status) { - case 'active': - return 'active'; - case 'cancelled': - return 'canceled'; - case 'paused': - return 'paused'; - case 'on_trial': - return 'trialing'; - case 'past_due': - return 'past_due'; - case 'unpaid': - return 'unpaid'; - case 'expired': - return 'past_due'; - default: - return 'active'; - } - } -} - -function getISOString(date: number | null) { - return date ? new Date(date).toISOString() : undefined; } async function isSigningSecretValid(rawBody: string, signatureHeader: string) { diff --git a/packages/billing/stripe/package.json b/packages/billing/stripe/package.json index c23017018..ebbe1f4fa 100644 --- a/packages/billing/stripe/package.json +++ b/packages/billing/stripe/package.json @@ -17,7 +17,7 @@ "dependencies": { "@stripe/react-stripe-js": "^2.7.1", "@stripe/stripe-js": "^3.5.0", - "stripe": "^15.11.0" + "stripe": "^15.12.0" }, "devDependencies": { "@kit/billing": "workspace:^", diff --git a/packages/billing/stripe/src/services/stripe-billing-strategy.service.ts b/packages/billing/stripe/src/services/stripe-billing-strategy.service.ts index 7fb8781be..582a1f4bc 100644 --- a/packages/billing/stripe/src/services/stripe-billing-strategy.service.ts +++ b/packages/billing/stripe/src/services/stripe-billing-strategy.service.ts @@ -18,6 +18,7 @@ import { getLogger } from '@kit/shared/logger'; import { createStripeBillingPortalSession } from './create-stripe-billing-portal-session'; import { createStripeCheckout } from './create-stripe-checkout'; import { createStripeClient } from './stripe-sdk'; +import { createStripeSubscriptionPayloadBuilderService } from './stripe-subscription-payload-builder.service'; /** * @name StripeBillingStrategyService @@ -357,6 +358,50 @@ export class StripeBillingStrategyService } } + async getSubscription(subscriptionId: string) { + const stripe = await this.stripeProvider(); + const logger = await getLogger(); + + const ctx = { + name: this.namespace, + subscriptionId, + }; + + logger.info(ctx, 'Retrieving subscription...'); + + const subscriptionPayloadBuilder = + createStripeSubscriptionPayloadBuilderService(); + + try { + const subscription = await stripe.subscriptions.retrieve(subscriptionId, { + expand: ['line_items'], + }); + + logger.info(ctx, 'Subscription retrieved successfully'); + + const customer = subscription.customer as string; + const accountId = subscription.metadata?.accountId as string; + + return subscriptionPayloadBuilder.build({ + customerId: customer, + accountId, + id: subscription.id, + lineItems: subscription.items.data, + status: subscription.status, + currency: subscription.currency, + cancelAtPeriodEnd: subscription.cancel_at_period_end, + periodStartsAt: subscription.current_period_start, + periodEndsAt: subscription.current_period_end, + trialStartsAt: subscription.trial_start, + trialEndsAt: subscription.trial_end, + }); + } catch (error) { + logger.error({ ...ctx, error }, 'Failed to retrieve subscription'); + + throw new Error('Failed to retrieve subscription'); + } + } + private async stripeProvider(): Promise { return createStripeClient(); } diff --git a/packages/billing/stripe/src/services/stripe-subscription-payload-builder.service.ts b/packages/billing/stripe/src/services/stripe-subscription-payload-builder.service.ts new file mode 100644 index 000000000..5d68789cc --- /dev/null +++ b/packages/billing/stripe/src/services/stripe-subscription-payload-builder.service.ts @@ -0,0 +1,100 @@ +import Stripe from 'stripe'; + +import { BillingConfig, getLineItemTypeById } from '@kit/billing'; +import { UpsertSubscriptionParams } from '@kit/billing/types'; + +/** + * @name createStripeSubscriptionPayloadBuilderService + * @description Create a new instance of the `StripeSubscriptionPayloadBuilderService` class + */ +export function createStripeSubscriptionPayloadBuilderService() { + return new StripeSubscriptionPayloadBuilderService(); +} + +/** + * @name StripeSubscriptionPayloadBuilderService + * @description This class is used to build the subscription payload for Stripe + */ +class StripeSubscriptionPayloadBuilderService { + private config?: BillingConfig; + + /** + * @name withBillingConfig + * @description Set the billing config for the subscription payload + * @param config + */ + withBillingConfig(config: BillingConfig) { + this.config = config; + + return this; + } + + /** + * @name build + * @description Build the subscription payload for Stripe + * @param params + */ + build< + LineItem extends { + id: string; + quantity?: number; + price?: Stripe.Price; + }, + >(params: { + id: string; + accountId: string; + customerId: string; + lineItems: LineItem[]; + status: Stripe.Subscription.Status; + currency: string; + cancelAtPeriodEnd: boolean; + periodStartsAt: number; + periodEndsAt: number; + trialStartsAt: number | null; + trialEndsAt: number | null; + }): UpsertSubscriptionParams { + const active = params.status === 'active' || params.status === 'trialing'; + + const lineItems = params.lineItems.map((item) => { + const quantity = item.quantity ?? 1; + const variantId = item.price?.id as string; + + return { + id: item.id, + quantity, + subscription_id: params.id, + subscription_item_id: item.id, + product_id: item.price?.product as string, + variant_id: variantId, + price_amount: item.price?.unit_amount, + interval: item.price?.recurring?.interval as string, + interval_count: item.price?.recurring?.interval_count as number, + type: this.config + ? getLineItemTypeById(this.config, variantId) + : undefined, + }; + }); + + // otherwise we are updating a subscription + // and we only need to return the update payload + return { + target_subscription_id: params.id, + target_account_id: params.accountId, + target_customer_id: params.customerId, + billing_provider: 'stripe', + status: params.status, + line_items: lineItems, + active, + currency: params.currency, + cancel_at_period_end: params.cancelAtPeriodEnd ?? false, + period_starts_at: getISOString(params.periodStartsAt) as string, + period_ends_at: getISOString(params.periodEndsAt) as string, + trial_starts_at: getISOString(params.trialStartsAt), + trial_ends_at: getISOString(params.trialEndsAt), + }; + } +} + +function getISOString(date: number | null) { + return date ? new Date(date * 1000).toISOString() : undefined; +} diff --git a/packages/billing/stripe/src/services/stripe-webhook-handler.service.ts b/packages/billing/stripe/src/services/stripe-webhook-handler.service.ts index 4690b46e4..0f8ff66e9 100644 --- a/packages/billing/stripe/src/services/stripe-webhook-handler.service.ts +++ b/packages/billing/stripe/src/services/stripe-webhook-handler.service.ts @@ -1,18 +1,30 @@ import Stripe from 'stripe'; -import { - BillingConfig, - BillingWebhookHandlerService, - getLineItemTypeById, -} from '@kit/billing'; +import { BillingConfig, BillingWebhookHandlerService } from '@kit/billing'; import { getLogger } from '@kit/shared/logger'; import { Database } from '@kit/supabase/database'; import { StripeServerEnvSchema } from '../schema/stripe-server-env.schema'; import { createStripeClient } from './stripe-sdk'; +import { createStripeSubscriptionPayloadBuilderService } from './stripe-subscription-payload-builder.service'; type UpsertSubscriptionParams = - Database['public']['Functions']['upsert_subscription']['Args']; + Database['public']['Functions']['upsert_subscription']['Args'] & { + line_items: Array; + }; + +interface LineItem { + id: string; + quantity: number; + subscription_id: string; + subscription_item_id: string; + product_id: string; + variant_id: string; + price_amount: number | null | undefined; + interval: string; + interval_count: number; + type: 'flat' | 'metered' | 'per_seat' | undefined; +} type UpsertOrderParams = Database['public']['Functions']['upsert_order']['Args']; @@ -149,22 +161,27 @@ export class StripeWebhookHandlerService // if it's a subscription, we need to retrieve the subscription // and build the payload for the subscription if (isSubscription) { + const subscriptionPayloadBuilderService = + createStripeSubscriptionPayloadBuilderService(); + const subscriptionId = session.subscription as string; const subscription = await stripe.subscriptions.retrieve(subscriptionId); - const payload = this.buildSubscriptionPayload({ - accountId, - customerId, - id: subscription.id, - lineItems: subscription.items.data, - status: subscription.status, - currency: subscription.currency, - periodStartsAt: subscription.current_period_start, - periodEndsAt: subscription.current_period_end, - cancelAtPeriodEnd: subscription.cancel_at_period_end, - trialStartsAt: subscription.trial_start, - trialEndsAt: subscription.trial_end, - }); + const payload = subscriptionPayloadBuilderService + .withBillingConfig(this.config) + .build({ + accountId, + customerId, + id: subscription.id, + lineItems: subscription.items.data, + status: subscription.status, + currency: subscription.currency, + periodStartsAt: subscription.current_period_start, + periodEndsAt: subscription.current_period_end, + cancelAtPeriodEnd: subscription.cancel_at_period_end, + trialStartsAt: subscription.trial_start, + trialEndsAt: subscription.trial_end, + }); return onCheckoutCompletedCallback(payload); } else { @@ -237,19 +254,24 @@ export class StripeWebhookHandlerService const subscriptionId = subscription.id; const accountId = subscription.metadata.accountId as string; - const payload = this.buildSubscriptionPayload({ - customerId: subscription.customer as string, - id: subscriptionId, - accountId, - lineItems: subscription.items.data, - status: subscription.status, - currency: subscription.currency, - periodStartsAt: subscription.current_period_start, - periodEndsAt: subscription.current_period_end, - cancelAtPeriodEnd: subscription.cancel_at_period_end, - trialStartsAt: subscription.trial_start, - trialEndsAt: subscription.trial_end, - }); + const subscriptionPayloadBuilderService = + createStripeSubscriptionPayloadBuilderService(); + + const payload = subscriptionPayloadBuilderService + .withBillingConfig(this.config) + .build({ + customerId: subscription.customer as string, + id: subscriptionId, + accountId, + lineItems: subscription.items.data, + status: subscription.status, + currency: subscription.currency, + periodStartsAt: subscription.current_period_start, + periodEndsAt: subscription.current_period_end, + cancelAtPeriodEnd: subscription.cancel_at_period_end, + trialStartsAt: subscription.trial_start, + trialEndsAt: subscription.trial_end, + }); return onSubscriptionUpdatedCallback(payload); } @@ -263,64 +285,6 @@ export class StripeWebhookHandlerService return onSubscriptionDeletedCallback(event.data.object.id); } - private buildSubscriptionPayload< - LineItem extends { - id: string; - quantity?: number; - price?: Stripe.Price; - }, - >(params: { - id: string; - accountId: string; - customerId: string; - lineItems: LineItem[]; - status: Stripe.Subscription.Status; - currency: string; - cancelAtPeriodEnd: boolean; - periodStartsAt: number; - periodEndsAt: number; - trialStartsAt: number | null; - trialEndsAt: number | null; - }): UpsertSubscriptionParams { - const active = params.status === 'active' || params.status === 'trialing'; - - const lineItems = params.lineItems.map((item) => { - const quantity = item.quantity ?? 1; - const variantId = item.price?.id as string; - - return { - id: item.id, - quantity, - subscription_id: params.id, - subscription_item_id: item.id, - product_id: item.price?.product as string, - variant_id: variantId, - price_amount: item.price?.unit_amount, - interval: item.price?.recurring?.interval as string, - interval_count: item.price?.recurring?.interval_count as number, - type: getLineItemTypeById(this.config, variantId), - }; - }); - - // otherwise we are updating a subscription - // and we only need to return the update payload - return { - target_subscription_id: params.id, - target_account_id: params.accountId, - target_customer_id: params.customerId, - billing_provider: this.provider, - status: params.status, - line_items: lineItems, - active, - currency: params.currency, - cancel_at_period_end: params.cancelAtPeriodEnd ?? false, - period_starts_at: getISOString(params.periodStartsAt) as string, - period_ends_at: getISOString(params.periodEndsAt) as string, - trial_starts_at: getISOString(params.trialStartsAt), - trial_ends_at: getISOString(params.trialEndsAt), - }; - } - private async loadStripe() { if (!this.stripe) { this.stripe = await createStripeClient(); @@ -329,7 +293,3 @@ export class StripeWebhookHandlerService return this.stripe; } } - -function getISOString(date: number | null) { - return date ? new Date(date * 1000).toISOString() : undefined; -} diff --git a/packages/cms/keystatic/package.json b/packages/cms/keystatic/package.json index 38158ad0e..2c822ad1c 100644 --- a/packages/cms/keystatic/package.json +++ b/packages/cms/keystatic/package.json @@ -15,7 +15,7 @@ "./route-handler": "./src/keystatic-route-handler.ts" }, "dependencies": { - "@keystatic/core": "0.5.19", + "@keystatic/core": "0.5.20", "@keystatic/next": "^5.0.1", "@markdoc/markdoc": "^0.4.0" }, diff --git a/packages/database-webhooks/package.json b/packages/database-webhooks/package.json index dc049ba36..dfbd8c73a 100644 --- a/packages/database-webhooks/package.json +++ b/packages/database-webhooks/package.json @@ -23,7 +23,7 @@ "@kit/tailwind-config": "workspace:*", "@kit/team-accounts": "workspace:^", "@kit/tsconfig": "workspace:*", - "@supabase/supabase-js": "^2.43.4", + "@supabase/supabase-js": "^2.43.5", "zod": "^3.23.8" }, "eslintConfig": { diff --git a/packages/features/accounts/package.json b/packages/features/accounts/package.json index 01dc28152..ca070b6ea 100644 --- a/packages/features/accounts/package.json +++ b/packages/features/accounts/package.json @@ -33,8 +33,8 @@ "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:^", "@radix-ui/react-icons": "^1.3.0", - "@supabase/supabase-js": "^2.43.4", - "@tanstack/react-query": "5.45.0", + "@supabase/supabase-js": "^2.43.5", + "@tanstack/react-query": "5.45.1", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "lucide-react": "^0.395.0", @@ -42,7 +42,7 @@ "next-themes": "0.3.0", "react": "18.3.1", "react-dom": "18.3.1", - "react-hook-form": "^7.51.5", + "react-hook-form": "^7.52.0", "react-i18next": "^14.1.2", "sonner": "^1.5.0", "zod": "^3.23.8" diff --git a/packages/features/admin/package.json b/packages/features/admin/package.json index cef815f33..004c03203 100644 --- a/packages/features/admin/package.json +++ b/packages/features/admin/package.json @@ -20,15 +20,15 @@ "@kit/ui": "workspace:^", "@makerkit/data-loader-supabase-core": "^0.0.8", "@makerkit/data-loader-supabase-nextjs": "^1.2.3", - "@supabase/supabase-js": "^2.43.4", - "@tanstack/react-query": "5.45.0", + "@supabase/supabase-js": "^2.43.5", + "@tanstack/react-query": "5.45.1", "@tanstack/react-table": "^8.17.3", "@types/react": "^18.3.3", "lucide-react": "^0.395.0", "next": "14.2.4", "react": "18.3.1", "react-dom": "18.3.1", - "react-hook-form": "^7.51.5", + "react-hook-form": "^7.52.0", "zod": "^3.23.8" }, "exports": { diff --git a/packages/features/auth/package.json b/packages/features/auth/package.json index 2008bc6a8..0f3ac5a2a 100644 --- a/packages/features/auth/package.json +++ b/packages/features/auth/package.json @@ -28,12 +28,12 @@ "@kit/ui": "workspace:^", "@marsidev/react-turnstile": "^0.7.1", "@radix-ui/react-icons": "^1.3.0", - "@supabase/supabase-js": "^2.43.4", - "@tanstack/react-query": "5.45.0", + "@supabase/supabase-js": "^2.43.5", + "@tanstack/react-query": "5.45.1", "@types/react": "^18.3.3", "lucide-react": "^0.395.0", "next": "14.2.4", - "react-hook-form": "^7.51.5", + "react-hook-form": "^7.52.0", "react-i18next": "^14.1.2", "sonner": "^1.5.0", "zod": "^3.23.8" diff --git a/packages/features/notifications/package.json b/packages/features/notifications/package.json index 98b44024d..0c809efc2 100644 --- a/packages/features/notifications/package.json +++ b/packages/features/notifications/package.json @@ -20,8 +20,8 @@ "@kit/tailwind-config": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@supabase/supabase-js": "^2.43.4", - "@tanstack/react-query": "5.45.0", + "@supabase/supabase-js": "^2.43.5", + "@tanstack/react-query": "5.45.1", "@types/react": "^18.3.3", "lucide-react": "^0.395.0", "react": "18.3.1", diff --git a/packages/features/team-accounts/package.json b/packages/features/team-accounts/package.json index acac2314d..7c0f47083 100644 --- a/packages/features/team-accounts/package.json +++ b/packages/features/team-accounts/package.json @@ -31,8 +31,8 @@ "@kit/tailwind-config": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:^", - "@supabase/supabase-js": "^2.43.4", - "@tanstack/react-query": "5.45.0", + "@supabase/supabase-js": "^2.43.5", + "@tanstack/react-query": "5.45.1", "@tanstack/react-table": "^8.17.3", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", @@ -42,7 +42,7 @@ "next": "14.2.4", "react": "18.3.1", "react-dom": "18.3.1", - "react-hook-form": "^7.51.5", + "react-hook-form": "^7.52.0", "react-i18next": "^14.1.2", "sonner": "^1.5.0", "zod": "^3.23.8" diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 33800ae31..adaaaa27b 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -21,7 +21,7 @@ "@kit/shared": "workspace:^", "@kit/tailwind-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@tanstack/react-query": "5.45.0", + "@tanstack/react-query": "5.45.1", "react-i18next": "^14.1.2" }, "dependencies": { diff --git a/packages/next/package.json b/packages/next/package.json index ddefbcbee..86da05a58 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -21,7 +21,7 @@ "@kit/supabase": "workspace:^", "@kit/tailwind-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@supabase/supabase-js": "^2.43.4", + "@supabase/supabase-js": "^2.43.5", "next": "14.2.4", "zod": "^3.23.8" }, diff --git a/packages/supabase/package.json b/packages/supabase/package.json index dad3e2b0c..2665725a4 100644 --- a/packages/supabase/package.json +++ b/packages/supabase/package.json @@ -26,10 +26,10 @@ "@kit/prettier-config": "workspace:*", "@kit/tailwind-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@supabase/gotrue-js": "2.62.2", + "@supabase/gotrue-js": "2.64.3", "@supabase/ssr": "^0.3.0", - "@supabase/supabase-js": "^2.43.4", - "@tanstack/react-query": "5.45.0", + "@supabase/supabase-js": "^2.43.5", + "@tanstack/react-query": "5.45.1", "@types/react": "^18.3.3", "next": "14.2.4", "react": "18.3.1", diff --git a/packages/supabase/src/auth-callback.service.ts b/packages/supabase/src/auth-callback.service.ts index c9f336d6c..d0b6e59bc 100644 --- a/packages/supabase/src/auth-callback.service.ts +++ b/packages/supabase/src/auth-callback.service.ts @@ -44,15 +44,14 @@ class AuthCallbackService { url.port = ''; } + url.pathname = params.redirectPath; + const token_hash = searchParams.get('token_hash'); const type = searchParams.get('type') as EmailOtpType | null; const callbackParam = searchParams.get('callback'); - const next = callbackParam - ? new URL(callbackParam).pathname - : params.redirectPath; - const callbackUrl = callbackParam ? new URL(callbackParam) : null; + const nextPath = callbackUrl ? callbackUrl.searchParams.get('next') : null; const inviteToken = callbackUrl?.searchParams.get('invite_token'); const errorPath = params.errorPath ?? '/auth/callback/error'; @@ -62,7 +61,10 @@ class AuthCallbackService { searchParams.delete('next'); searchParams.delete('callback'); - url.pathname = next; + // if we have a next path, we redirect to that path + if (nextPath) { + url.pathname = nextPath; + } // if we have an invite token, we append it to the redirect url if (inviteToken) { diff --git a/packages/ui/package.json b/packages/ui/package.json index 355632f9e..0c6597424 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -51,7 +51,7 @@ "next-themes": "0.3.0", "prettier": "^3.3.2", "react-day-picker": "^8.10.1", - "react-hook-form": "^7.51.5", + "react-hook-form": "^7.52.0", "react-i18next": "^14.1.2", "sonner": "^1.5.0", "tailwindcss": "3.4.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cfed0643a..da4572efc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,8 +22,8 @@ importers: specifier: ^7.0.3 version: 7.0.3 pnpm: - specifier: ^9.3.0 - version: 9.3.0 + specifier: ^9.4.0 + version: 9.4.0 prettier: specifier: ^3.3.2 version: 3.3.2 @@ -56,7 +56,7 @@ importers: version: 2.2.0(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@hookform/resolvers': specifier: ^3.6.0 - version: 3.6.0(react-hook-form@7.51.5(react@18.3.1)) + version: 3.6.0(react-hook-form@7.52.0(react@18.3.1)) '@kit/accounts': specifier: workspace:^ version: link:../../packages/features/accounts @@ -110,10 +110,10 @@ importers: version: link:../../packages/ui '@makerkit/data-loader-supabase-core': specifier: ^0.0.8 - version: 0.0.8(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.4) + version: 0.0.8(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.5) '@makerkit/data-loader-supabase-nextjs': specifier: ^1.2.3 - version: 1.2.3(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.4)(@tanstack/react-query@5.45.0(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 1.2.3(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.5)(@tanstack/react-query@5.45.1(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@marsidev/react-turnstile': specifier: ^0.7.1 version: 0.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -121,14 +121,14 @@ importers: specifier: ^1.3.0 version: 1.3.0(react@18.3.1) '@supabase/supabase-js': - specifier: ^2.43.4 - version: 2.43.4 + specifier: ^2.43.5 + version: 2.43.5 '@tanstack/react-query': - specifier: 5.45.0 - version: 5.45.0(react@18.3.1) + specifier: 5.45.1 + version: 5.45.1(react@18.3.1) '@tanstack/react-query-next-experimental': - specifier: ^5.45.0 - version: 5.45.0(@tanstack/react-query@5.45.0(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + specifier: ^5.45.1 + version: 5.45.1(@tanstack/react-query@5.45.1(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@tanstack/react-table': specifier: ^8.17.3 version: 8.17.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -154,8 +154,8 @@ importers: specifier: 18.3.1 version: 18.3.1(react@18.3.1) react-hook-form: - specifier: ^7.51.5 - version: 7.51.5(react@18.3.1) + specifier: ^7.52.0 + version: 7.52.0(react@18.3.1) react-i18next: specifier: ^14.1.2 version: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -249,7 +249,7 @@ importers: devDependencies: '@hookform/resolvers': specifier: ^3.6.0 - version: 3.6.0(react-hook-form@7.51.5(react@18.3.1)) + version: 3.6.0(react-hook-form@7.52.0(react@18.3.1)) '@kit/billing': specifier: workspace:^ version: link:../core @@ -281,8 +281,8 @@ importers: specifier: workspace:^ version: link:../../ui '@supabase/supabase-js': - specifier: ^2.43.4 - version: 2.43.4 + specifier: ^2.43.5 + version: 2.43.5 '@types/react': specifier: ^18.3.3 version: 18.3.3 @@ -299,8 +299,8 @@ importers: specifier: 18.3.1 version: 18.3.1 react-hook-form: - specifier: ^7.51.5 - version: 7.51.5(react@18.3.1) + specifier: ^7.52.0 + version: 7.52.0(react@18.3.1) react-i18next: specifier: ^14.1.2 version: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -360,8 +360,8 @@ importers: specifier: ^3.5.0 version: 3.5.0 stripe: - specifier: ^15.11.0 - version: 15.11.0 + specifier: ^15.12.0 + version: 15.12.0 devDependencies: '@kit/billing': specifier: workspace:^ @@ -421,11 +421,11 @@ importers: packages/cms/keystatic: dependencies: '@keystatic/core': - specifier: 0.5.19 - version: 0.5.19(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 0.5.20 + version: 0.5.20(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@keystatic/next': specifier: ^5.0.1 - version: 5.0.1(@keystatic/core@0.5.19(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.0.1(@keystatic/core@0.5.20(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@markdoc/markdoc': specifier: ^0.4.0 version: 0.4.0(@types/react@18.3.3)(react@18.3.1) @@ -515,8 +515,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@supabase/supabase-js': - specifier: ^2.43.4 - version: 2.43.4 + specifier: ^2.43.5 + version: 2.43.5 zod: specifier: ^3.23.8 version: 3.23.8 @@ -551,7 +551,7 @@ importers: devDependencies: '@hookform/resolvers': specifier: ^3.6.0 - version: 3.6.0(react-hook-form@7.51.5(react@18.3.1)) + version: 3.6.0(react-hook-form@7.52.0(react@18.3.1)) '@kit/billing-gateway': specifier: workspace:^ version: link:../../billing/gateway @@ -592,11 +592,11 @@ importers: specifier: ^1.3.0 version: 1.3.0(react@18.3.1) '@supabase/supabase-js': - specifier: ^2.43.4 - version: 2.43.4 + specifier: ^2.43.5 + version: 2.43.5 '@tanstack/react-query': - specifier: 5.45.0 - version: 5.45.0(react@18.3.1) + specifier: 5.45.1 + version: 5.45.1(react@18.3.1) '@types/react': specifier: ^18.3.3 version: 18.3.3 @@ -619,8 +619,8 @@ importers: specifier: 18.3.1 version: 18.3.1(react@18.3.1) react-hook-form: - specifier: ^7.51.5 - version: 7.51.5(react@18.3.1) + specifier: ^7.52.0 + version: 7.52.0(react@18.3.1) react-i18next: specifier: ^14.1.2 version: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -635,7 +635,7 @@ importers: devDependencies: '@hookform/resolvers': specifier: ^3.6.0 - version: 3.6.0(react-hook-form@7.51.5(react@18.3.1)) + version: 3.6.0(react-hook-form@7.52.0(react@18.3.1)) '@kit/eslint-config': specifier: workspace:* version: link:../../../tooling/eslint @@ -659,16 +659,16 @@ importers: version: link:../../ui '@makerkit/data-loader-supabase-core': specifier: ^0.0.8 - version: 0.0.8(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.4) + version: 0.0.8(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.5) '@makerkit/data-loader-supabase-nextjs': specifier: ^1.2.3 - version: 1.2.3(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.4)(@tanstack/react-query@5.45.0(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 1.2.3(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.5)(@tanstack/react-query@5.45.1(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@supabase/supabase-js': - specifier: ^2.43.4 - version: 2.43.4 + specifier: ^2.43.5 + version: 2.43.5 '@tanstack/react-query': - specifier: 5.45.0 - version: 5.45.0(react@18.3.1) + specifier: 5.45.1 + version: 5.45.1(react@18.3.1) '@tanstack/react-table': specifier: ^8.17.3 version: 8.17.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -688,8 +688,8 @@ importers: specifier: 18.3.1 version: 18.3.1(react@18.3.1) react-hook-form: - specifier: ^7.51.5 - version: 7.51.5(react@18.3.1) + specifier: ^7.52.0 + version: 7.52.0(react@18.3.1) zod: specifier: ^3.23.8 version: 3.23.8 @@ -698,7 +698,7 @@ importers: devDependencies: '@hookform/resolvers': specifier: ^3.6.0 - version: 3.6.0(react-hook-form@7.51.5(react@18.3.1)) + version: 3.6.0(react-hook-form@7.52.0(react@18.3.1)) '@kit/eslint-config': specifier: workspace:* version: link:../../../tooling/eslint @@ -727,11 +727,11 @@ importers: specifier: ^1.3.0 version: 1.3.0(react@18.3.1) '@supabase/supabase-js': - specifier: ^2.43.4 - version: 2.43.4 + specifier: ^2.43.5 + version: 2.43.5 '@tanstack/react-query': - specifier: 5.45.0 - version: 5.45.0(react@18.3.1) + specifier: 5.45.1 + version: 5.45.1(react@18.3.1) '@types/react': specifier: ^18.3.3 version: 18.3.3 @@ -742,8 +742,8 @@ importers: specifier: 14.2.4 version: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-hook-form: - specifier: ^7.51.5 - version: 7.51.5(react@18.3.1) + specifier: ^7.52.0 + version: 7.52.0(react@18.3.1) react-i18next: specifier: ^14.1.2 version: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -775,11 +775,11 @@ importers: specifier: workspace:* version: link:../../ui '@supabase/supabase-js': - specifier: ^2.43.4 - version: 2.43.4 + specifier: ^2.43.5 + version: 2.43.5 '@tanstack/react-query': - specifier: 5.45.0 - version: 5.45.0(react@18.3.1) + specifier: 5.45.1 + version: 5.45.1(react@18.3.1) '@types/react': specifier: ^18.3.3 version: 18.3.3 @@ -804,7 +804,7 @@ importers: devDependencies: '@hookform/resolvers': specifier: ^3.6.0 - version: 3.6.0(react-hook-form@7.51.5(react@18.3.1)) + version: 3.6.0(react-hook-form@7.52.0(react@18.3.1)) '@kit/accounts': specifier: workspace:^ version: link:../accounts @@ -845,11 +845,11 @@ importers: specifier: workspace:^ version: link:../../ui '@supabase/supabase-js': - specifier: ^2.43.4 - version: 2.43.4 + specifier: ^2.43.5 + version: 2.43.5 '@tanstack/react-query': - specifier: 5.45.0 - version: 5.45.0(react@18.3.1) + specifier: 5.45.1 + version: 5.45.1(react@18.3.1) '@tanstack/react-table': specifier: ^8.17.3 version: 8.17.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -878,8 +878,8 @@ importers: specifier: 18.3.1 version: 18.3.1(react@18.3.1) react-hook-form: - specifier: ^7.51.5 - version: 7.51.5(react@18.3.1) + specifier: ^7.52.0 + version: 7.52.0(react@18.3.1) react-i18next: specifier: ^14.1.2 version: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -918,8 +918,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@tanstack/react-query': - specifier: 5.45.0 - version: 5.45.0(react@18.3.1) + specifier: 5.45.1 + version: 5.45.1(react@18.3.1) react-i18next: specifier: ^14.1.2 version: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1041,7 +1041,7 @@ importers: dependencies: '@sentry/nextjs': specifier: ^8.9.2 - version: 8.9.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.0)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.92.0) + version: 8.9.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.0)(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.92.0) devDependencies: '@kit/eslint-config': specifier: workspace:* @@ -1089,8 +1089,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@supabase/supabase-js': - specifier: ^2.43.4 - version: 2.43.4 + specifier: ^2.43.5 + version: 2.43.5 next: specifier: 14.2.4 version: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1135,17 +1135,17 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@supabase/gotrue-js': - specifier: 2.62.2 - version: 2.62.2 + specifier: 2.64.3 + version: 2.64.3 '@supabase/ssr': specifier: ^0.3.0 - version: 0.3.0(@supabase/supabase-js@2.43.4) + version: 0.3.0(@supabase/supabase-js@2.43.5) '@supabase/supabase-js': - specifier: ^2.43.4 - version: 2.43.4 + specifier: ^2.43.5 + version: 2.43.5 '@tanstack/react-query': - specifier: 5.45.0 - version: 5.45.0(react@18.3.1) + specifier: 5.45.1 + version: 5.45.1(react@18.3.1) '@types/react': specifier: ^18.3.3 version: 18.3.3 @@ -1166,7 +1166,7 @@ importers: dependencies: '@hookform/resolvers': specifier: ^3.6.0 - version: 3.6.0(react-hook-form@7.51.5(react@18.3.1)) + version: 3.6.0(react-hook-form@7.52.0(react@18.3.1)) '@radix-ui/react-accordion': specifier: 1.1.2 version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1286,8 +1286,8 @@ importers: specifier: ^8.10.1 version: 8.10.1(date-fns@3.6.0)(react@18.3.1) react-hook-form: - specifier: ^7.51.5 - version: 7.51.5(react@18.3.1) + specifier: ^7.52.0 + version: 7.52.0(react@18.3.1) react-i18next: specifier: ^14.1.2 version: 14.1.2(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1365,8 +1365,8 @@ importers: specifier: ^3.3.2 version: 3.3.2 prettier-plugin-tailwindcss: - specifier: ^0.6.4 - version: 0.6.4(@ianvs/prettier-plugin-sort-imports@4.2.1(prettier@3.3.2))(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.3.2))(prettier-plugin-astro@0.14.0)(prettier@3.3.2) + specifier: ^0.6.5 + version: 0.6.5(@ianvs/prettier-plugin-sort-imports@4.2.1(prettier@3.3.2))(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.3.2))(prettier-plugin-astro@0.14.0)(prettier@3.3.2) devDependencies: '@kit/tsconfig': specifier: workspace:^ @@ -1744,8 +1744,8 @@ packages: '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - '@keystar/ui@0.7.4': - resolution: {integrity: sha512-U9oHOPP6JrsK7Ky1BJ+pe3T05kBz8V5ryAN+jD4i0i4fegJ1aE06yFwVHcL5iK+Ksj9qoT9pNRBfWOOFs9QMrg==} + '@keystar/ui@0.7.5': + resolution: {integrity: sha512-n65I/AwvjlrwMVUUHm3PbFFeSteQ2PeVZx7Y6sfOcRS1vAfBIOdN/qwk1BYd6ssyMLsx/x3xALAXt45jNL7d9g==} peerDependencies: next: '>=14' react: 18.3.1 @@ -1754,8 +1754,8 @@ packages: next: optional: true - '@keystatic/core@0.5.19': - resolution: {integrity: sha512-y/0PFHLKARQWgFvsu6Kp3/ZoNkLyseNEyrez7tPmfXX08hPMNVlXlwpojCLiXOKAMFYI3XgLgwKHOf5gIsJa3g==} + '@keystatic/core@0.5.20': + resolution: {integrity: sha512-oiKSdBQGcsQe87xUP+k5nXBo9pFxTCP2LRnvr59ztYvNGMcIi9btUplIgKoeVx4nK+JkL4Q0vpegz6j+EMeuuw==} peerDependencies: react: 18.3.1 react-dom: 18.3.1 @@ -3570,19 +3570,16 @@ packages: '@supabase/auth-js@2.64.2': resolution: {integrity: sha512-s+lkHEdGiczDrzXJ1YWt2y3bxRi+qIUnXcgkpLSrId7yjBeaXBFygNjTaoZLG02KNcYwbuZ9qkEIqmj2hF7svw==} - '@supabase/functions-js@2.3.1': - resolution: {integrity: sha512-QyzNle/rVzlOi4BbVqxLSH828VdGY1RElqGFAj+XeVypj6+PVtMlD21G8SDnsPQDtlqqTtoGRgdMlQZih5hTuw==} + '@supabase/functions-js@2.4.1': + resolution: {integrity: sha512-8sZ2ibwHlf+WkHDUZJUXqqmPvWQ3UHN0W30behOJngVh/qHHekhJLCFbh0AjkE9/FqqXtf9eoVvmYgfCLk5tNA==} - '@supabase/gotrue-js@2.62.2': - resolution: {integrity: sha512-AP6e6W9rQXFTEJ7sTTNYQrNf0LCcnt1hUW+RIgUK+Uh3jbWvcIST7wAlYyNZiMlS9+PYyymWQ+Ykz/rOYSO0+A==} + '@supabase/gotrue-js@2.64.3': + resolution: {integrity: sha512-Rql+txnKu1iGl8pZ2NG24nNWtRIaGzC61UZ8G6XVnqt1A8fmq/VXAnNvbuyStMtFV8l9bQnduAB6C1eD+2Eq2Q==} '@supabase/node-fetch@2.6.15': resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} engines: {node: 4.x || >=6.0.0} - '@supabase/postgrest-js@1.15.2': - resolution: {integrity: sha512-9/7pUmXExvGuEK1yZhVYXPZnLEkDTwxgMQHXLrN5BwPZZm4iUCL1YEyep/Z2lIZah8d8M433mVAUEGsihUj5KQ==} - '@supabase/postgrest-js@1.15.5': resolution: {integrity: sha512-YR4TiitTE2hizT7mB99Cl3V9i00RAY5sUxS2/NuWWzkreM7OeYlP2OqnqVwwb4z6ILn+j8x9e/igJDepFhjswQ==} @@ -3594,11 +3591,11 @@ packages: peerDependencies: '@supabase/supabase-js': ^2.33.1 - '@supabase/storage-js@2.5.5': - resolution: {integrity: sha512-OpLoDRjFwClwc2cjTJZG8XviTiQH4Ik8sCiMK5v7et0MDu2QlXjCAW3ljxJB5+z/KazdMOTnySi+hysxWUPu3w==} + '@supabase/storage-js@2.6.0': + resolution: {integrity: sha512-REAxr7myf+3utMkI2oOmZ6sdplMZZ71/2NEIEMBZHL9Fkmm3/JnaOZVSRqvG4LStYj2v5WhCruCzuMn6oD/Drw==} - '@supabase/supabase-js@2.43.4': - resolution: {integrity: sha512-/pLPaxiIsn5Vaz3s32HC6O/VNwfeddnzS0bZRpOW0AKcPuXroD8pT9G8mpiBlZfpKsMmq6k7tlhW7Sr1PAQ1lw==} + '@supabase/supabase-js@2.43.5': + resolution: {integrity: sha512-Y4GukjZWW6ouohMaPlYz8tSz9ykf9jY7w9/RhqKuScmla3Xiklce8eLr8TYAtA+oQYCWxo3RgS3B6O4rd/72FA==} '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -3616,15 +3613,15 @@ packages: '@tanstack/query-core@5.45.0': resolution: {integrity: sha512-RVfIZQmFUTdjhSAAblvueimfngYyfN6HlwaJUPK71PKd7yi43Vs1S/rdimmZedPWX/WGppcq/U1HOj7O7FwYxw==} - '@tanstack/react-query-next-experimental@5.45.0': - resolution: {integrity: sha512-75Tl2T54w5m1h0CvZN1Pdz3zM52zj18uNsOHi5Xszj5D4KM07ZhSNyon8N5osVS+YVcoR/gVqZn8pkRv1SpSqA==} + '@tanstack/react-query-next-experimental@5.45.1': + resolution: {integrity: sha512-GhaU4TwN8xxxt0ZQrdfI4o5uWK53cydLpwGIIuwzF+mqLL9379umsJUKrDbx2GZplyQY0+TYD568+rsb5YDzng==} peerDependencies: - '@tanstack/react-query': ^5.45.0 + '@tanstack/react-query': ^5.45.1 next: ^13 || ^14 || ^15 react: 18.3.1 - '@tanstack/react-query@5.45.0': - resolution: {integrity: sha512-y272cKRJp1BvehrWG4ashOBuqBj1Qm2O6fgYJ9LYSHrLdsCXl74GbSVjUQTReUdHuRIl9cEOoyPa6HYag400lw==} + '@tanstack/react-query@5.45.1': + resolution: {integrity: sha512-mYYfJujKg2kxmkRRjA6nn4YKG3ITsKuH22f1kteJ5IuVQqgKUgbaSQfYwVP0gBS05mhwxO03HVpD0t7BMN7WOA==} peerDependencies: react: 18.3.1 @@ -3798,8 +3795,8 @@ packages: '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - '@types/lodash@4.17.4': - resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==} + '@types/lodash@4.17.5': + resolution: {integrity: sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==} '@types/markdown-it@12.2.3': resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} @@ -4281,8 +4278,8 @@ packages: caniuse-lite@1.0.30001632: resolution: {integrity: sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==} - caniuse-lite@1.0.30001634: - resolution: {integrity: sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA==} + caniuse-lite@1.0.30001636: + resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -5166,8 +5163,8 @@ packages: peerDependencies: graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - graphql@16.8.1: - resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} + graphql@16.8.2: + resolution: {integrity: sha512-cvVIBILwuoSyD54U4cF/UXDh5yAobhNV/tPygI4lZhgOIJQE/WLWC4waBRb4I6bDVYb3OVx3lfHbaQOEoUD5sg==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} gzip-size@6.0.0: @@ -6312,8 +6309,8 @@ packages: engines: {node: '>=16'} hasBin: true - pnpm@9.3.0: - resolution: {integrity: sha512-7nuT4MK9EUCcZCT5K4ZvMdPqG+9fvkfTx1AM3DyWaIM9LlVoGtZt9bZAxh+p3CXVRu+lTXbX+L9UsTYUrCk2MQ==} + pnpm@9.4.0: + resolution: {integrity: sha512-9Um4pSydK4U2di+ZwHIiBe/Fr5E+d4NdvMw7CwssqefcgCK3gGLBcpHEjoh0nHDOiOtadPH6jEv14Yu0bIvYOg==} engines: {node: '>=18.12'} hasBin: true @@ -6390,8 +6387,8 @@ packages: resolution: {integrity: sha512-7jRGJsexaRIyUzTk8uzXlP45cw6DQ5Ci4bTe0xCBCcuO1Fff8jJy9oI+kRCQKSdDFTSAArMSg8GpvzlKBtSaZA==} engines: {node: ^14.15.0 || >=16.0.0} - prettier-plugin-tailwindcss@0.6.4: - resolution: {integrity: sha512-3vhbIvlKyAWPaw9bUr2cw6M1BGx2Oy9CCLJyv+nxEiBGCTcL69WcAz2IFMGqx8IXSzQCInGSo2ujAByg9poHLQ==} + prettier-plugin-tailwindcss@0.6.5: + resolution: {integrity: sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' @@ -6486,8 +6483,8 @@ packages: prosemirror-transform@1.9.0: resolution: {integrity: sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==} - prosemirror-view@1.33.7: - resolution: {integrity: sha512-jo6eMQCtPRwcrA2jISBCnm0Dd2B+szS08BU1Ay+XGiozHo5EZMHfLQE8R5nO4vb1spTH2RW1woZIYXRiQsuP8g==} + prosemirror-view@1.33.8: + resolution: {integrity: sha512-4PhMr/ufz2cdvFgpUAnZfs+0xij3RsFysreeG9V/utpwX7AJtYCDVyuRxzWoMJIEf4C7wVihuBNMPpFLPCiLQw==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -6550,8 +6547,8 @@ packages: peerDependencies: react: 18.3.1 - react-hook-form@7.51.5: - resolution: {integrity: sha512-J2ILT5gWx1XUIJRETiA7M19iXHlG74+6O3KApzvqB/w8S5NQR7AbU8HVZrMALdmDgWpRPYiZJl0zx8Z4L2mP6Q==} + react-hook-form@7.52.0: + resolution: {integrity: sha512-mJX506Xc6mirzLsmXUJyqlAI3Kj9Ph2RhplYhUVffeOQSnubK2uVqBFOBJmvKikvbFV91pxVXmDiR+QMF19x6A==} engines: {node: '>=12.22.0'} peerDependencies: react: 18.3.1 @@ -6995,8 +6992,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - stripe@15.11.0: - resolution: {integrity: sha512-qmZF0PN1jRVpiQrXL8eTb9Jy/6S+aUlcDquKBFT2h3PkaD7RZ444FIojVXUg67FK2zFIUNXgMv02c7csdL5qHg==} + stripe@15.12.0: + resolution: {integrity: sha512-slTbYS1WhRJXVB8YXU8fgHizkUrM9KJyrw4Dd8pLEwzKHYyQTIE46EePC2MVbSDZdE24o1GdNtzmJV4PrPpmJA==} engines: {node: '>=12.*'} styled-jsx@5.1.1: @@ -7491,8 +7488,8 @@ packages: utf-8-validate: optional: true - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7507,8 +7504,8 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - y-prosemirror@1.2.6: - resolution: {integrity: sha512-rGz8kX4v/uFJrLaqZvsezY1JGN/zTDSPMO76zRbNcpE63OEiw2PBCEQi9ZlfbEwgCMoeJLUT+otNyO/Oj73TGQ==} + y-prosemirror@1.2.9: + resolution: {integrity: sha512-fThGIVmSqrqnG/ckywEGlHM9ElfILC4TcMZd5zxWPe/i+UuP97TEr4swsopRKG3Y+KHBVt4Y/5NVBC3AAsUoUg==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} peerDependencies: prosemirror-model: ^1.7.1 @@ -7564,8 +7561,8 @@ packages: engines: {node: '>=4.0.0'} hasBin: true - yjs@13.6.15: - resolution: {integrity: sha512-moFv4uNYhp8BFxIk3AkpoAnnjts7gwdpiG8RtyFiKbMtxKCS0zVZ5wPaaGpwC3V2N/K8TK8MwtSI3+WO9CHWjQ==} + yjs@13.6.17: + resolution: {integrity: sha512-ERnKXYZrZqgGO81Yqt3D69detaRUwaqhsQTZRKi9CDMgteDMund+KcLChfwpjQbva9YwfRgh7S914Pa6qPVVCA==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} yn@3.1.1: @@ -7584,9 +7581,9 @@ packages: snapshots: - '@0no-co/graphql.web@1.0.7(graphql@16.8.1)': + '@0no-co/graphql.web@1.0.7(graphql@16.8.2)': optionalDependencies: - graphql: 16.8.1 + graphql: 16.8.2 '@alloc/quick-lru@5.2.0': {} @@ -7932,9 +7929,9 @@ snapshots: dependencies: tslib: 2.6.3 - '@graphql-typed-document-node/core@3.2.0(graphql@16.8.1)': + '@graphql-typed-document-node/core@3.2.0(graphql@16.8.2)': dependencies: - graphql: 16.8.1 + graphql: 16.8.2 '@grpc/grpc-js@1.10.8': dependencies: @@ -7948,9 +7945,9 @@ snapshots: protobufjs: 7.3.0 yargs: 17.7.2 - '@hookform/resolvers@3.6.0(react-hook-form@7.51.5(react@18.3.1))': + '@hookform/resolvers@3.6.0(react-hook-form@7.52.0(react@18.3.1))': dependencies: - react-hook-form: 7.51.5(react@18.3.1) + react-hook-form: 7.52.0(react@18.3.1) '@humanwhocodes/config-array@0.11.14': dependencies: @@ -8037,7 +8034,7 @@ snapshots: '@juggle/resize-observer@3.4.0': {} - '@keystar/ui@0.7.4(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@keystar/ui@0.7.5(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 '@emotion/css': 11.11.2 @@ -8129,7 +8126,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@keystatic/core@0.5.19(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@keystatic/core@0.5.20(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 '@braintree/sanitize-url': 6.0.4 @@ -8137,7 +8134,7 @@ snapshots: '@emotion/weak-memoize': 0.3.1 '@floating-ui/react': 0.24.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@internationalized/string': 3.2.3 - '@keystar/ui': 0.7.4(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@keystar/ui': 0.7.5(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@markdoc/markdoc': 0.4.0(@types/react@18.3.3)(react@18.3.1) '@react-aria/focus': 3.17.1(react@18.3.1) '@react-aria/i18n': 3.11.1(react@18.3.1) @@ -8153,22 +8150,22 @@ snapshots: '@react-stately/utils': 3.10.1(react@18.3.1) '@react-types/shared': 3.23.1(react@18.3.1) '@sindresorhus/slugify': 1.1.2 - '@toeverything/y-indexeddb': 0.10.0-canary.9(yjs@13.6.15) - '@ts-gql/tag': 0.7.3(graphql@16.8.1) + '@toeverything/y-indexeddb': 0.10.0-canary.9(yjs@13.6.17) + '@ts-gql/tag': 0.7.3(graphql@16.8.2) '@types/mdast': 4.0.4 '@types/node': 16.11.13 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@urql/core': 4.3.0(graphql@16.8.1) - '@urql/exchange-auth': 2.2.0(@urql/core@4.3.0(graphql@16.8.1)) - '@urql/exchange-graphcache': 6.5.1(graphql@16.8.1) - '@urql/exchange-persisted': 4.3.0(@urql/core@4.3.0(graphql@16.8.1)) + '@urql/core': 4.3.0(graphql@16.8.2) + '@urql/exchange-auth': 2.2.0(@urql/core@4.3.0(graphql@16.8.2)) + '@urql/exchange-graphcache': 6.5.1(graphql@16.8.2) + '@urql/exchange-persisted': 4.3.0(@urql/core@4.3.0(graphql@16.8.2)) cookie: 0.5.0 decimal.js-light: 2.5.1 emery: 1.4.3 escape-string-regexp: 4.0.0 fast-deep-equal: 3.1.3 - graphql: 16.8.1 + graphql: 16.8.2 idb-keyval: 6.2.1 ignore: 5.3.1 is-hotkey: 0.2.0 @@ -8195,7 +8192,7 @@ snapshots: prosemirror-state: 1.4.3 prosemirror-tables: 1.3.7 prosemirror-transform: 1.9.0 - prosemirror-view: 1.33.7 + prosemirror-view: 1.33.8 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 @@ -8204,18 +8201,18 @@ snapshots: slate-react: 0.91.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate@0.91.4) superstruct: 1.0.4 unist-util-visit: 5.0.0 - urql: 4.1.0(@urql/core@4.3.0(graphql@16.8.1))(react@18.3.1) - y-prosemirror: 1.2.6(prosemirror-model@1.21.1)(prosemirror-state@1.4.3)(prosemirror-view@1.33.7)(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15) - y-protocols: 1.0.6(yjs@13.6.15) - yjs: 13.6.15 + urql: 4.1.0(@urql/core@4.3.0(graphql@16.8.2))(react@18.3.1) + y-prosemirror: 1.2.9(prosemirror-model@1.21.1)(prosemirror-state@1.4.3)(prosemirror-view@1.33.8)(y-protocols@1.0.6(yjs@13.6.17))(yjs@13.6.17) + y-protocols: 1.0.6(yjs@13.6.17) + yjs: 13.6.17 transitivePeerDependencies: - next - supports-color - '@keystatic/next@5.0.1(@keystatic/core@0.5.19(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@keystatic/next@5.0.1(@keystatic/core@0.5.20(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 - '@keystatic/core': 0.5.19(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@keystatic/core': 0.5.20(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/react': 18.3.3 chokidar: 3.6.0 next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -8225,17 +8222,17 @@ snapshots: '@lemonsqueezy/lemonsqueezy.js@3.2.0': {} - '@makerkit/data-loader-supabase-core@0.0.8(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.4)': + '@makerkit/data-loader-supabase-core@0.0.8(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.5)': dependencies: '@supabase/postgrest-js': 1.15.5 - '@supabase/supabase-js': 2.43.4 + '@supabase/supabase-js': 2.43.5 ts-case-convert: 2.0.7 - '@makerkit/data-loader-supabase-nextjs@1.2.3(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.4)(@tanstack/react-query@5.45.0(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@makerkit/data-loader-supabase-nextjs@1.2.3(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.5)(@tanstack/react-query@5.45.1(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@makerkit/data-loader-supabase-core': 0.0.8(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.4) - '@supabase/supabase-js': 2.43.4 - '@tanstack/react-query': 5.45.0(react@18.3.1) + '@makerkit/data-loader-supabase-core': 0.0.8(@supabase/postgrest-js@1.15.5)(@supabase/supabase-js@2.43.5) + '@supabase/supabase-js': 2.43.5 + '@tanstack/react-query': 5.45.1(react@18.3.1) next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 transitivePeerDependencies: @@ -10518,7 +10515,7 @@ snapshots: '@sentry/types': 8.9.2 '@sentry/utils': 8.9.2 - '@sentry/nextjs@8.9.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.0)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.92.0)': + '@sentry/nextjs@8.9.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.0)(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.92.0)': dependencies: '@opentelemetry/instrumentation-http': 0.52.0(@opentelemetry/api@1.9.0) '@rollup/plugin-commonjs': 24.0.0(rollup@3.29.4) @@ -10648,11 +10645,11 @@ snapshots: dependencies: '@supabase/node-fetch': 2.6.15 - '@supabase/functions-js@2.3.1': + '@supabase/functions-js@2.4.1': dependencies: '@supabase/node-fetch': 2.6.15 - '@supabase/gotrue-js@2.62.2': + '@supabase/gotrue-js@2.64.3': dependencies: '@supabase/node-fetch': 2.6.15 @@ -10660,10 +10657,6 @@ snapshots: dependencies: whatwg-url: 5.0.0 - '@supabase/postgrest-js@1.15.2': - dependencies: - '@supabase/node-fetch': 2.6.15 - '@supabase/postgrest-js@1.15.5': dependencies: '@supabase/node-fetch': 2.6.15 @@ -10673,29 +10666,29 @@ snapshots: '@supabase/node-fetch': 2.6.15 '@types/phoenix': 1.6.4 '@types/ws': 8.5.10 - ws: 8.17.0 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@supabase/ssr@0.3.0(@supabase/supabase-js@2.43.4)': + '@supabase/ssr@0.3.0(@supabase/supabase-js@2.43.5)': dependencies: - '@supabase/supabase-js': 2.43.4 + '@supabase/supabase-js': 2.43.5 cookie: 0.5.0 ramda: 0.29.1 - '@supabase/storage-js@2.5.5': + '@supabase/storage-js@2.6.0': dependencies: '@supabase/node-fetch': 2.6.15 - '@supabase/supabase-js@2.43.4': + '@supabase/supabase-js@2.43.5': dependencies: '@supabase/auth-js': 2.64.2 - '@supabase/functions-js': 2.3.1 + '@supabase/functions-js': 2.4.1 '@supabase/node-fetch': 2.6.15 - '@supabase/postgrest-js': 1.15.2 + '@supabase/postgrest-js': 1.15.5 '@supabase/realtime-js': 2.9.5 - '@supabase/storage-js': 2.5.5 + '@supabase/storage-js': 2.6.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10717,13 +10710,13 @@ snapshots: '@tanstack/query-core@5.45.0': {} - '@tanstack/react-query-next-experimental@5.45.0(@tanstack/react-query@5.45.0(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-next-experimental@5.45.1(@tanstack/react-query@5.45.1(react@18.3.1))(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-query': 5.45.0(react@18.3.1) + '@tanstack/react-query': 5.45.1(react@18.3.1) next: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - '@tanstack/react-query@5.45.0(react@18.3.1)': + '@tanstack/react-query@5.45.1(react@18.3.1)': dependencies: '@tanstack/query-core': 5.45.0 react: 18.3.1 @@ -10736,12 +10729,12 @@ snapshots: '@tanstack/table-core@8.17.3': {} - '@toeverything/y-indexeddb@0.10.0-canary.9(yjs@13.6.15)': + '@toeverything/y-indexeddb@0.10.0-canary.9(yjs@13.6.17)': dependencies: idb: 7.1.1 nanoid: 5.0.7 - y-provider: 0.10.0-canary.9(yjs@13.6.15) - yjs: 13.6.15 + y-provider: 0.10.0-canary.9(yjs@13.6.17) + yjs: 13.6.17 '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -10759,11 +10752,11 @@ snapshots: '@trpc/server@10.45.2': {} - '@ts-gql/tag@0.7.3(graphql@16.8.1)': + '@ts-gql/tag@0.7.3(graphql@16.8.2)': dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - graphql: 16.8.1 - graphql-tag: 2.12.6(graphql@16.8.1) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.2) + graphql: 16.8.2 + graphql-tag: 2.12.6(graphql@16.8.2) '@tsconfig/node10@1.0.11': {} @@ -10948,7 +10941,7 @@ snapshots: '@types/linkify-it@5.0.0': optional: true - '@types/lodash@4.17.4': {} + '@types/lodash@4.17.5': {} '@types/markdown-it@12.2.3': dependencies: @@ -11126,29 +11119,29 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@urql/core@4.3.0(graphql@16.8.1)': + '@urql/core@4.3.0(graphql@16.8.2)': dependencies: - '@0no-co/graphql.web': 1.0.7(graphql@16.8.1) + '@0no-co/graphql.web': 1.0.7(graphql@16.8.2) wonka: 6.3.4 transitivePeerDependencies: - graphql - '@urql/exchange-auth@2.2.0(@urql/core@4.3.0(graphql@16.8.1))': + '@urql/exchange-auth@2.2.0(@urql/core@4.3.0(graphql@16.8.2))': dependencies: - '@urql/core': 4.3.0(graphql@16.8.1) + '@urql/core': 4.3.0(graphql@16.8.2) wonka: 6.3.4 - '@urql/exchange-graphcache@6.5.1(graphql@16.8.1)': + '@urql/exchange-graphcache@6.5.1(graphql@16.8.2)': dependencies: - '@0no-co/graphql.web': 1.0.7(graphql@16.8.1) - '@urql/core': 4.3.0(graphql@16.8.1) + '@0no-co/graphql.web': 1.0.7(graphql@16.8.2) + '@urql/core': 4.3.0(graphql@16.8.2) wonka: 6.3.4 transitivePeerDependencies: - graphql - '@urql/exchange-persisted@4.3.0(@urql/core@4.3.0(graphql@16.8.1))': + '@urql/exchange-persisted@4.3.0(@urql/core@4.3.0(graphql@16.8.2))': dependencies: - '@urql/core': 4.3.0(graphql@16.8.1) + '@urql/core': 4.3.0(graphql@16.8.2) wonka: 6.3.4 '@webassemblyjs/ast@1.12.1': @@ -11254,6 +11247,10 @@ snapshots: dependencies: acorn: 8.11.3 + acorn-jsx@5.3.2(acorn@8.12.0): + dependencies: + acorn: 8.12.0 + acorn-walk@8.3.2: {} acorn-walk@8.3.3: @@ -11486,7 +11483,7 @@ snapshots: browserslist@4.23.1: dependencies: - caniuse-lite: 1.0.30001634 + caniuse-lite: 1.0.30001636 electron-to-chromium: 1.4.803 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) @@ -11542,7 +11539,7 @@ snapshots: caniuse-lite@1.0.30001632: {} - caniuse-lite@1.0.30001634: {} + caniuse-lite@1.0.30001636: {} ccount@2.0.1: {} @@ -12545,12 +12542,12 @@ snapshots: graphemer@1.4.0: {} - graphql-tag@2.12.6(graphql@16.8.1): + graphql-tag@2.12.6(graphql@16.8.2): dependencies: - graphql: 16.8.1 + graphql: 16.8.2 tslib: 2.6.3 - graphql@16.8.1: {} + graphql@16.8.2: {} gzip-size@6.0.0: dependencies: @@ -13399,8 +13396,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) micromark-extension-mdx-expression: 3.0.0 micromark-extension-mdx-jsx: 3.0.0 micromark-extension-mdx-md: 2.0.0 @@ -13989,7 +13986,7 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - pnpm@9.3.0: {} + pnpm@9.4.0: {} possible-typed-array-names@1.0.0: {} @@ -14056,7 +14053,7 @@ snapshots: sass-formatter: 0.7.9 optional: true - prettier-plugin-tailwindcss@0.6.4(@ianvs/prettier-plugin-sort-imports@4.2.1(prettier@3.3.2))(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.3.2))(prettier-plugin-astro@0.14.0)(prettier@3.3.2): + prettier-plugin-tailwindcss@0.6.5(@ianvs/prettier-plugin-sort-imports@4.2.1(prettier@3.3.2))(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.3.2))(prettier-plugin-astro@0.14.0)(prettier@3.3.2): dependencies: prettier: 3.3.2 optionalDependencies: @@ -14090,7 +14087,7 @@ snapshots: dependencies: prosemirror-state: 1.4.3 prosemirror-transform: 1.9.0 - prosemirror-view: 1.33.7 + prosemirror-view: 1.33.8 rope-sequence: 1.3.4 prosemirror-keymap@1.2.2: @@ -14106,7 +14103,7 @@ snapshots: dependencies: prosemirror-model: 1.21.1 prosemirror-transform: 1.9.0 - prosemirror-view: 1.33.7 + prosemirror-view: 1.33.8 prosemirror-tables@1.3.7: dependencies: @@ -14114,13 +14111,13 @@ snapshots: prosemirror-model: 1.21.1 prosemirror-state: 1.4.3 prosemirror-transform: 1.9.0 - prosemirror-view: 1.33.7 + prosemirror-view: 1.33.8 prosemirror-transform@1.9.0: dependencies: prosemirror-model: 1.21.1 - prosemirror-view@1.33.7: + prosemirror-view@1.33.8: dependencies: prosemirror-model: 1.21.1 prosemirror-state: 1.4.3 @@ -14201,7 +14198,7 @@ snapshots: '@babel/runtime': 7.24.7 react: 18.3.1 - react-hook-form@7.51.5(react@18.3.1): + react-hook-form@7.52.0(react@18.3.1): dependencies: react: 18.3.1 @@ -14553,7 +14550,7 @@ snapshots: dependencies: '@juggle/resize-observer': 3.4.0 '@types/is-hotkey': 0.1.10 - '@types/lodash': 4.17.4 + '@types/lodash': 4.17.5 direction: 1.0.4 is-hotkey: 0.1.8 is-plain-object: 5.0.0 @@ -14697,7 +14694,7 @@ snapshots: strip-json-comments@3.1.1: {} - stripe@15.11.0: + stripe@15.12.0: dependencies: '@types/node': 20.14.2 qs: 6.12.1 @@ -15056,9 +15053,9 @@ snapshots: dependencies: punycode: 2.3.1 - urql@4.1.0(@urql/core@4.3.0(graphql@16.8.1))(react@18.3.1): + urql@4.1.0(@urql/core@4.3.0(graphql@16.8.2))(react@18.3.1): dependencies: - '@urql/core': 4.3.0(graphql@16.8.1) + '@urql/core': 4.3.0(graphql@16.8.2) react: 18.3.1 wonka: 6.3.4 @@ -15278,27 +15275,27 @@ snapshots: ws@7.5.9: {} - ws@8.17.0: {} + ws@8.17.1: {} xtend@4.0.2: {} - y-prosemirror@1.2.6(prosemirror-model@1.21.1)(prosemirror-state@1.4.3)(prosemirror-view@1.33.7)(y-protocols@1.0.6(yjs@13.6.15))(yjs@13.6.15): + y-prosemirror@1.2.9(prosemirror-model@1.21.1)(prosemirror-state@1.4.3)(prosemirror-view@1.33.8)(y-protocols@1.0.6(yjs@13.6.17))(yjs@13.6.17): dependencies: lib0: 0.2.94 prosemirror-model: 1.21.1 prosemirror-state: 1.4.3 - prosemirror-view: 1.33.7 - y-protocols: 1.0.6(yjs@13.6.15) - yjs: 13.6.15 + prosemirror-view: 1.33.8 + y-protocols: 1.0.6(yjs@13.6.17) + yjs: 13.6.17 - y-protocols@1.0.6(yjs@13.6.15): + y-protocols@1.0.6(yjs@13.6.17): dependencies: lib0: 0.2.94 - yjs: 13.6.15 + yjs: 13.6.17 - y-provider@0.10.0-canary.9(yjs@13.6.15): + y-provider@0.10.0-canary.9(yjs@13.6.17): dependencies: - yjs: 13.6.15 + yjs: 13.6.17 y18n@5.0.8: {} @@ -15326,7 +15323,7 @@ snapshots: yarn@1.22.22: {} - yjs@13.6.15: + yjs@13.6.17: dependencies: lib0: 0.2.94 diff --git a/tooling/prettier/package.json b/tooling/prettier/package.json index c005ff79b..05f1896b8 100644 --- a/tooling/prettier/package.json +++ b/tooling/prettier/package.json @@ -12,7 +12,7 @@ "@ianvs/prettier-plugin-sort-imports": "^4.2.1", "next": "14.2.4", "prettier": "^3.3.2", - "prettier-plugin-tailwindcss": "^0.6.4" + "prettier-plugin-tailwindcss": "^0.6.5" }, "devDependencies": { "@kit/tsconfig": "workspace:^",