From 47fe4f63d258800ee148f3b53f8489460101596f Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 15 Jun 2025 08:29:28 +0000 Subject: [PATCH 1/8] Project changes: fetch plan values --- .../components/billing/planSelection.svelte | 87 ++++++------------- src/lib/sdk/billing.ts | 14 ++- src/lib/stores/billing.ts | 4 +- src/routes/(console)/+layout.ts | 11 ++- .../(console)/create-organization/+page.ts | 6 +- 5 files changed, 51 insertions(+), 71 deletions(-) diff --git a/src/lib/components/billing/planSelection.svelte b/src/lib/components/billing/planSelection.svelte index db11d298fd..b69e3aa7e9 100644 --- a/src/lib/components/billing/planSelection.svelte +++ b/src/lib/components/billing/planSelection.svelte @@ -1,79 +1,46 @@ - - - {#if $organization?.billingPlan === BillingPlan.FREE && !isNewOrg} - - {/if} - - - {tierFree.description} - - - {formatCurrency(freePlan?.price ?? 0)} - - - - - {#if $organization?.billingPlan === BillingPlan.PRO && !isNewOrg} - - {/if} - - - {tierPro.description} - - - {formatCurrency(proPlan?.price ?? 0)} per month + usage - - - - - {#if $organization?.billingPlan === BillingPlan.SCALE && !isNewOrg} - - {/if} - - - {tierScale.description} - - - {formatCurrency(scalePlan?.price ?? 0)} per month + usage - - + {#each plans as plan} + + + {#if $organization?.billingPlan === plan.$id && !isNewOrg} + + {/if} + + + {plan.desc} + + + {@const isZeroPrice = (plan.price ?? 0) <= 0} + {@const price = formatCurrency(plan.price ?? 0)} + {isZeroPrice ? price : `${price} per month + usage`} + + + {/each} {#if $currentPlan && !isBasePlan} ; +export type PlansMap = Map; export type Roles = { scopes: string[]; @@ -487,6 +488,17 @@ export class Billing { }); } + async listPlans(queries: string[] = []): Promise { + const path = `/console/plans`; + const uri = new URL(this.client.config.endpoint + path); + const params = { + queries, + } + return await this.client.call('get', uri, { + 'content-type': 'application/json' + }, params); + } + async getPlan(planId: string): Promise { const path = `/console/plans/${planId}`; const uri = new URL(this.client.config.endpoint + path); diff --git a/src/lib/stores/billing.ts b/src/lib/stores/billing.ts index c68f336c15..46000eb6c5 100644 --- a/src/lib/stores/billing.ts +++ b/src/lib/stores/billing.ts @@ -161,7 +161,7 @@ export function getServiceLimit(serviceId: PlanServices, tier: Tier = null, plan // plan > addons > seats/others if (serviceId === 'members') { // some don't include `limit`, so we fallback! - return plan?.['addons']['seats']['limit'] ?? 1; + return (plan?.['addons']['seats'] || [])['limit'] ?? 1; } return plan?.[serviceId] ?? 0; @@ -357,7 +357,7 @@ export async function checkForUsageLimit(org: Organization) { const members = org.total; const plan = get(currentPlan); const membersOverflow = - members > plan.addons.seats.limit ? members - (plan.addons.seats.limit || members) : 0; + members > plan.addons.seats?.limit ? members - (plan.addons.seats.limit || members) : 0; if (resources.some((r) => r.value >= 100) || membersOverflow > 0) { readOnly.set(true); diff --git a/src/routes/(console)/+layout.ts b/src/routes/(console)/+layout.ts index 249914fc86..24d9855d03 100644 --- a/src/routes/(console)/+layout.ts +++ b/src/routes/(console)/+layout.ts @@ -1,6 +1,5 @@ import { Dependencies } from '$lib/constants'; import type { Plan } from '$lib/sdk/billing'; -import type { Tier } from '$lib/stores/billing'; import { sdk } from '$lib/stores/sdk'; import { isCloud } from '$lib/system'; import type { LayoutLoad } from './$types'; @@ -25,13 +24,13 @@ export const load: LayoutLoad = async ({ params, fetch, depends, parent }) => { const [data, variables] = await Promise.all([versionPromise, variablesPromise]); - let plansInfo = new Map(); + let plansInfo = new Map(); if (isCloud) { - const plansArray = await sdk.forConsole.billing.getPlansInfo(); - plansInfo = plansArray.plans.reduce((map, plan) => { - map.set(plan.$id as Tier, plan); + const plansArray = await sdk.forConsole.billing.listPlans(); + plansInfo = Object.values(plansArray.plans).reduce((map, plan) => { + map.set(plan.$id, plan); return map; - }, new Map()); + }, new Map()); } const organizations = !isCloud diff --git a/src/routes/(console)/create-organization/+page.ts b/src/routes/(console)/create-organization/+page.ts index 150cd76f3c..6767d0e4f4 100644 --- a/src/routes/(console)/create-organization/+page.ts +++ b/src/routes/(console)/create-organization/+page.ts @@ -7,9 +7,10 @@ import type { Organization } from '$lib/stores/organization'; export const load: PageLoad = async ({ url, parent, depends }) => { depends(Dependencies.CREATE_ORGANIZATION); const { organizations } = await parent(); - const [coupon, paymentMethods] = await Promise.all([ + const [coupon, paymentMethods, plans] = await Promise.all([ getCoupon(url), - sdk.forConsole.billing.listPaymentMethods() + sdk.forConsole.billing.listPaymentMethods(), + sdk.forConsole.billing.listPlans() ]); let plan = getPlanFromUrl(url); const hasFreeOrganizations = organizations.teams?.some( @@ -22,6 +23,7 @@ export const load: PageLoad = async ({ url, parent, depends }) => { return { plan, coupon, + plans, hasFreeOrganizations, paymentMethods, name: url.searchParams.get('name') ?? '' From 6de72265b6aac95ece835668bf4158095042da49 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 16 Jun 2025 03:33:12 +0000 Subject: [PATCH 2/8] plan summary improvement --- src/lib/sdk/billing.ts | 81 +++++++++++++++++-- .../billing/planSummary.svelte | 74 +++++++---------- 2 files changed, 104 insertions(+), 51 deletions(-) diff --git a/src/lib/sdk/billing.ts b/src/lib/sdk/billing.ts index 3147b6aaab..e4a6b2786c 100644 --- a/src/lib/sdk/billing.ts +++ b/src/lib/sdk/billing.ts @@ -151,6 +151,70 @@ export type CreditList = { total: number; }; +export type AggregationTeam = { + $id: string; + /** + * Aggregation creation time in ISO 8601 format. + */ + $createdAt: string; + /** + * Aggregation update date in ISO 8601 format. + */ + $updatedAt: string; + /** + * Beginning date of the invoice. + */ + from: string; + /** + * End date of the invoice. + */ + to: string; + /** + * Total amount of the invoice. + */ + amount: number; + additionalMembers: number; + + /** + * Price for additional members + */ + additionalMemberAmount: number; + /** + * Total storage usage. + */ + usageStorage: number; + /** + * Total active users for the billing period. + */ + usageUsers: number; + /** + * Total number of executions for the billing period. + */ + usageExecutions: number; + /** + * Total bandwidth usage for the billing period. + */ + usageBandwidth: number; + /** + * Total realtime usage for the billing period. + */ + usageRealtime: number; + /** + * Usage logs for the billing period. + */ + resources: InvoiceUsage[]; + /** + * Aggregation billing plan + */ + plan: string; +}; + +export type InvoiceUsage = { + resourceId: string; + value: number; + amount: number; +}; + export type Aggregation = { $id: string; /** @@ -492,11 +556,16 @@ export class Billing { const path = `/console/plans`; const uri = new URL(this.client.config.endpoint + path); const params = { - queries, - } - return await this.client.call('get', uri, { - 'content-type': 'application/json' - }, params); + queries + }; + return await this.client.call( + 'get', + uri, + { + 'content-type': 'application/json' + }, + params + ); } async getPlan(planId: string): Promise { @@ -823,7 +892,7 @@ export class Billing { ); } - async getAggregation(organizationId: string, aggregationId: string): Promise { + async getAggregation(organizationId: string, aggregationId: string): Promise { const path = `/organizations/${organizationId}/aggregations/${aggregationId}`; const params = { organizationId, diff --git a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte index f35163025c..bc60e538eb 100644 --- a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte +++ b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte @@ -5,7 +5,7 @@ import { toLocaleDate } from '$lib/helpers/date'; import { plansInfo, upgradeURL } from '$lib/stores/billing'; import { organization } from '$lib/stores/organization'; - import type { Aggregation, CreditList, Invoice, Plan } from '$lib/sdk/billing'; + import type { Aggregation, AggregationTeam, CreditList, Invoice, Plan } from '$lib/sdk/billing'; import { abbreviateNumber, formatCurrency, formatNumberWithCommas } from '$lib/helpers/numbers'; import { BillingPlan } from '$lib/constants'; import { Click, trackEvent } from '$lib/actions/analytics'; @@ -20,14 +20,20 @@ } from '@appwrite.io/pink-svelte'; import { IconInfo, IconTag } from '@appwrite.io/pink-icons-svelte'; import CancelDowngradeModel from './cancelDowngradeModal.svelte'; + import { onMount } from 'svelte'; export let currentPlan: Plan; export let creditList: CreditList; export let currentInvoice: Invoice | undefined = undefined; - export let currentAggregation: Aggregation | undefined = undefined; + export let currentAggregation: AggregationTeam | undefined = undefined; let showCancel: boolean = false; + onMount(() => { + console.log(currentAggregation); + console.log(currentInvoice); + }); + const availableCredit = creditList.available; const today = new Date(); const isTrial = @@ -64,63 +70,41 @@ 0 - ? currentInvoice.usage.length + 1 - : currentInvoice.usage.length - ).toString()}> + badge={currentAggregation.resources + .filter((r) => r.amount && r.amount > 0) + .length.toString()}> {formatCurrency(extraUsage >= 0 ? extraUsage : 0)} - {#if currentAggregation.additionalMembers} + {#each currentAggregation.resources.filter((r) => r.amount && r.amount > 0) as excess, i} + {#if i > 0} + + {/if} + - Additional members + + {excess.resourceId} + - {formatCurrency( - currentAggregation.additionalMemberAmount - )} + {formatCurrency(excess.amount)} - {currentAggregation.additionalMembers} + + + {formatNumberWithCommas(excess.value)} + + {abbreviateNumber(excess.value)} + - {/if} - {#if currentInvoice?.usage} - {#each currentInvoice.usage as excess, i} - {#if i > 0 || currentAggregation.additionalMembers} - - {/if} - - - - - {excess.name} - - - {formatCurrency(excess.amount)} - - - - - - {formatNumberWithCommas(excess.value)} - - {abbreviateNumber(excess.value)} - - - - {/each} - {/if} + {/each} {/if} From 60b61fecd3211c1b2a223ec067c42f4956c3278f Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 16 Jun 2025 03:51:24 +0000 Subject: [PATCH 3/8] remove logs --- .../billing/planSummary.svelte | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte index bc60e538eb..8c936a7363 100644 --- a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte +++ b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte @@ -5,7 +5,7 @@ import { toLocaleDate } from '$lib/helpers/date'; import { plansInfo, upgradeURL } from '$lib/stores/billing'; import { organization } from '$lib/stores/organization'; - import type { Aggregation, AggregationTeam, CreditList, Invoice, Plan } from '$lib/sdk/billing'; + import type {AggregationTeam, CreditList, Invoice, Plan } from '$lib/sdk/billing'; import { abbreviateNumber, formatCurrency, formatNumberWithCommas } from '$lib/helpers/numbers'; import { BillingPlan } from '$lib/constants'; import { Click, trackEvent } from '$lib/actions/analytics'; @@ -20,7 +20,6 @@ } from '@appwrite.io/pink-svelte'; import { IconInfo, IconTag } from '@appwrite.io/pink-icons-svelte'; import CancelDowngradeModel from './cancelDowngradeModal.svelte'; - import { onMount } from 'svelte'; export let currentPlan: Plan; export let creditList: CreditList; @@ -29,11 +28,6 @@ let showCancel: boolean = false; - onMount(() => { - console.log(currentAggregation); - console.log(currentInvoice); - }); - const availableCredit = creditList.available; const today = new Date(); const isTrial = From 449fe5a7f8dee1f758fcd3dddeaf9a47704caee5 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 16 Jun 2025 05:22:47 +0000 Subject: [PATCH 4/8] fix plan selection --- src/lib/components/billing/planSelection.svelte | 4 ++-- .../organization-[organization]/change-plan/+page.svelte | 7 ++++--- .../organization-[organization]/change-plan/+page.ts | 6 ++++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/lib/components/billing/planSelection.svelte b/src/lib/components/billing/planSelection.svelte index b69e3aa7e9..d4842102f6 100644 --- a/src/lib/components/billing/planSelection.svelte +++ b/src/lib/components/billing/planSelection.svelte @@ -13,8 +13,8 @@ export let isNewOrg = false; export let selfService = true; - $: isBasePlan = BASE_BILLING_PLANS.includes($currentPlan?.$id); $: plans = Object.values(page.data.plans.plans) as Plan[]; + $: currentPlanInList = plans.filter((plan) => plan.$id === $currentPlan?.$id).length > 0; @@ -41,7 +41,7 @@ {/each} - {#if $currentPlan && !isBasePlan} + {#if $currentPlan && !currentPlanInList} $currentPlan?.order; - $: isDowngrade = $plansInfo.get(selectedPlan).order < $currentPlan?.order; + $: isUpgrade = $plansInfo.get(selectedPlan)?.order > $currentPlan?.order; + $: isDowngrade = $plansInfo.get(selectedPlan)?.order < $currentPlan?.order; $: isButtonDisabled = $organization?.billingPlan === selectedPlan; diff --git a/src/routes/(console)/organization-[organization]/change-plan/+page.ts b/src/routes/(console)/organization-[organization]/change-plan/+page.ts index b698d60dce..ce18725fc8 100644 --- a/src/routes/(console)/organization-[organization]/change-plan/+page.ts +++ b/src/routes/(console)/organization-[organization]/change-plan/+page.ts @@ -8,9 +8,10 @@ export const load: PageLoad = async ({ depends, parent, url }) => { const { members, organization, currentPlan, organizations } = await parent(); depends(Dependencies.UPGRADE_PLAN); - const [coupon, paymentMethods] = await Promise.all([ + const [coupon, paymentMethods, plans] = await Promise.all([ getCoupon(url), - sdk.forConsole.billing.listPaymentMethods() + sdk.forConsole.billing.listPaymentMethods(), + sdk.forConsole.billing.listPlans() ]); let plan = getPlanFromUrl(url); @@ -29,6 +30,7 @@ export const load: PageLoad = async ({ depends, parent, url }) => { return { members, plan, + plans, coupon, selfService, hasFreeOrgs, From 42bc0c8f523a432c68152ef8329283a225911c27 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 16 Jun 2025 06:53:54 +0000 Subject: [PATCH 5/8] format --- src/lib/components/billing/planSelection.svelte | 2 +- .../organization-[organization]/billing/planSummary.svelte | 2 +- .../organization-[organization]/change-plan/+page.svelte | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/components/billing/planSelection.svelte b/src/lib/components/billing/planSelection.svelte index d4842102f6..846a887f2d 100644 --- a/src/lib/components/billing/planSelection.svelte +++ b/src/lib/components/billing/planSelection.svelte @@ -1,5 +1,5 @@ diff --git a/src/lib/stores/billing.ts b/src/lib/stores/billing.ts index eee7a0469e..62fdbf3d70 100644 --- a/src/lib/stores/billing.ts +++ b/src/lib/stores/billing.ts @@ -322,6 +322,7 @@ export function checkForProjectsLimit(org: Organization, projects: number) { const plan = get(plansInfo)?.get(org.billingPlan); if (!plan) return; if (plan.$id !== BillingPlan.FREE) return; + if (!org.projects) return; if (org.projects.length > 0) return; if (projects > plan.projects) { diff --git a/src/routes/(console)/organization-[organization]/+page.svelte b/src/routes/(console)/organization-[organization]/+page.svelte index 8484d61069..f18d9e9785 100644 --- a/src/routes/(console)/organization-[organization]/+page.svelte +++ b/src/routes/(console)/organization-[organization]/+page.svelte @@ -122,7 +122,8 @@ function isSetToArchive(project: Models.Project): boolean { if (!isCloud) return false; - if (data.organization.projects.length === 0) return false; + if(!data.organization.projects) return false; + if (data.organization.projects?.length === 0) return false; if (!project || !project.$id) return false; return !data.organization.projects.includes(project.$id); } @@ -131,8 +132,8 @@ return name ? (name.length > limit ? `${name.slice(0, limit)}...` : name) : '-'; } - $: projectsToArchive = data.projects.projects.filter( - (project) => !data.organization.projects.includes(project.$id) + $: projectsToArchive = data.projects.projects?.filter( + (project) => !data.organization.projects?.includes(project.$id) ); @@ -163,7 +164,7 @@ - {#if isCloud && data.organization.projects.length > 0 && $canWriteProjects} + {#if isCloud && data.organization.projects?.length > 0 && $canWriteProjects} From ee293bc66b050dfa71aea82059a92553287c338b Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 25 Jun 2025 06:58:52 +0000 Subject: [PATCH 7/8] handle addons and project usage --- src/lib/sdk/billing.ts | 8 + .../billing/planSummary.svelte | 364 +++++++++++------- 2 files changed, 236 insertions(+), 136 deletions(-) diff --git a/src/lib/sdk/billing.ts b/src/lib/sdk/billing.ts index 581d10add0..baaa7f4408 100644 --- a/src/lib/sdk/billing.ts +++ b/src/lib/sdk/billing.ts @@ -207,8 +207,15 @@ export type AggregationTeam = { * Aggregation billing plan */ plan: string; + projectBreakdown: ProjectBreakdown[] }; +export type ProjectBreakdown = { + $id: string; + name: string; + amount: number; +} + export type InvoiceUsage = { resourceId: string; value: number; @@ -413,6 +420,7 @@ export type Plan = { supportsOrganizationRoles: boolean; buildSize: number; // in MB deploymentSize: number; // in MB + usagePerProject: boolean; }; export type PlanList = { diff --git a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte index 09ea95f4af..d2ce8405cf 100644 --- a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte +++ b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte @@ -15,6 +15,7 @@ Divider, Icon, Layout, + Table, Tooltip, Typography } from '@appwrite.io/pink-svelte'; @@ -36,159 +37,250 @@ {#if $organization} - - Payment estimates - A breakdown of your estimated upcoming payment for the current billing period. Totals displayed - exclude accumulated credits and applicable taxes. - -

- Due at: {toLocaleDate($organization?.billingNextInvoiceDate)} -

- - - - - {currentPlan.name} plan - - - {isTrial || $organization?.billingPlan === BillingPlan.GITHUB_EDUCATION - ? formatCurrency(0) - : currentPlan - ? formatCurrency(currentPlan?.price) - : ''} - - - - {#if currentPlan.budgeting && extraUsage > 0} - r.amount && r.amount > 0) - .length.toString()}> - - {formatCurrency(extraUsage >= 0 ? extraUsage : 0)} - - - {#each currentAggregation.resources.filter((r) => r.amount && r.amount > 0) as excess, i} - {#if i > 0} - - {/if} - - - - - {excess.resourceId} - - - {formatCurrency(excess.amount)} - - - - - - {formatNumberWithCommas(excess.value)} - - {abbreviateNumber(excess.value)} - - - - {/each} - - - {/if} - - {#if currentPlan.supportsCredits && availableCredit > 0} + {#if currentPlan.usagePerProject} + + + + {currentPlan.name} plan + + + Next payment of ${currentAggregation.amount} + will occur on + {toLocaleDate($organization?.billingNextInvoiceDate)} + + + + + + - - - Credits to be applied - - - -{formatCurrency( - Math.min(availableCredit, currentInvoice?.amount ?? 0) - )} + Base plan + + {isTrial || + $organization?.billingPlan === BillingPlan.GITHUB_EDUCATION + ? formatCurrency(0) + : currentPlan + ? formatCurrency(currentPlan?.price) + : ''} + + + {#each currentAggregation.resources.filter((r) => r.amount && r.amount > 0 && Object.keys(currentPlan.addons).includes(r.resourceId) && currentPlan.addons[r.resourceId].price > 0) as excess, i} + {#if i > 0} + {/if} + + + + {excess.resourceId} + + {formatCurrency(excess.amount)} + + + + + {/each} + {#each currentAggregation.projectBreakdown as projectBreakdown} + + + {formatCurrency(projectBreakdown.amount)} + + + + + + {/each} + + + {:else} + + Payment estimates + A breakdown of your estimated upcoming payment for the current billing period. Totals displayed + exclude accumulated credits and applicable taxes. + +

+ Due at: {toLocaleDate($organization?.billingNextInvoiceDate)} +

+ + + + + {currentPlan.name} plan - - {formatCurrency( - Math.max( - (currentInvoice?.amount ?? 0) - - Math.min(availableCredit, currentInvoice?.amount ?? 0), - 0 - ) - )} + + {isTrial || + $organization?.billingPlan === BillingPlan.GITHUB_EDUCATION + ? formatCurrency(0) + : currentPlan + ? formatCurrency(currentPlan?.price) + : ''} - {/if} - - -
- - {#if $organization?.billingPlan === BillingPlan.FREE || $organization?.billingPlan === BillingPlan.GITHUB_EDUCATION} -
- - -
- {:else} -
- {#if $organization?.billingPlanDowngrade !== null} - - {:else} + + {#if currentPlan.budgeting && extraUsage > 0} + r.amount && r.amount > 0) + .length.toString()}> + + {formatCurrency(extraUsage >= 0 ? extraUsage : 0)} + + + {#each currentAggregation.resources.filter((r) => r.amount && r.amount > 0) as excess, i} + {#if i > 0} + + {/if} + + + + + {excess.resourceId} + + + {formatCurrency(excess.amount)} + + + + + + {formatNumberWithCommas(excess.value)} + + {abbreviateNumber(excess.value)} + + + + {/each} + + + {/if} + + {#if currentPlan.supportsCredits && availableCredit > 0} + + + + Credits to be applied + + + -{formatCurrency( + Math.min(availableCredit, currentInvoice?.amount ?? 0) + )} + + + {/if} + + {#if $organization?.billingPlan !== BillingPlan.FREE && $organization?.billingPlan !== BillingPlan.GITHUB_EDUCATION} + + + + + Current total (USD) + + + + Estimates are updated daily and may differ from your + final invoice. + + + + + + {formatCurrency( + Math.max( + (currentInvoice?.amount ?? 0) - + Math.min( + availableCredit, + currentInvoice?.amount ?? 0 + ), + 0 + ) + )} + + + {/if} + + + + + {#if $organization?.billingPlan === BillingPlan.FREE || $organization?.billingPlan === BillingPlan.GITHUB_EDUCATION} +
+ - {/if} - -
- {/if} -
- +
+ {:else} +
+ {#if $organization?.billingPlanDowngrade !== null} + + {:else} + + {/if} + +
+ {/if} +
+
+ {/if} {/if} From 9317f1b92bc94b19d1a99ed78a62b14509bf7c83 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 26 Aug 2025 06:54:17 +0000 Subject: [PATCH 8/8] fix layout.ts --- src/routes/(console)/+layout.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/routes/(console)/+layout.ts b/src/routes/(console)/+layout.ts index 12d265ec4b..7210b51bfc 100644 --- a/src/routes/(console)/+layout.ts +++ b/src/routes/(console)/+layout.ts @@ -48,7 +48,6 @@ export const load: LayoutLoad = async ({ depends, parent }) => { plansInfo, roles: [], scopes: [], - projects, preferences, currentOrgId, organizations,