From 470b047e60ad1f701f3911bc5b345c7141d61909 Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Sat, 18 Apr 2026 10:19:07 +0000
Subject: [PATCH 001/320] feat: add Premium Geo DB addon to project settings
Adds a Premium Geo DB section to the project settings page so users
can enable and disable the premium geolocation addon per-project on
cloud. The section supports the full addon lifecycle:
- Upgrade prompt when the current plan does not support the addon
- Enable flow with optional 3DS payment authentication
- Pending state with cancel & retry option
- Active state with disable action
- Scheduled-for-removal state with re-enable action
Uses the new project-scoped SDK methods: listAddons, createPremiumGeoDBAddon,
and deleteAddon. Bumps the @appwrite.io/console SDK pin accordingly.
Co-Authored-By: Claude Opus 4.6 (1M context)
---
bun.lock | 4 +-
package.json | 2 +-
.../settings/+page.svelte | 5 +
.../settings/+page.ts | 15 +-
.../settings/premiumGeoDB.svelte | 176 ++++++++++++++++++
.../settings/premiumGeoDBDisableModal.svelte | 54 ++++++
.../settings/premiumGeoDBEnableModal.svelte | 90 +++++++++
7 files changed, 340 insertions(+), 6 deletions(-)
create mode 100644 src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
create mode 100644 src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBDisableModal.svelte
create mode 100644 src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte
diff --git a/bun.lock b/bun.lock
index 5e452c9474..f5a1514ea9 100644
--- a/bun.lock
+++ b/bun.lock
@@ -6,7 +6,7 @@
"name": "@appwrite/console",
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
@@ -113,7 +113,7 @@
"@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="],
- "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676", { "dependencies": { "json-bigint": "1.0.0" } }],
+ "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d", { "dependencies": { "json-bigint": "1.0.0" } }],
"@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="],
diff --git a/package.json b/package.json
index 099ae9cb1b..b48a5f4ec4 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
diff --git a/src/routes/(console)/project-[region]-[project]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/+page.svelte
index 823f5a6e97..d422eb5472 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/+page.svelte
@@ -17,6 +17,8 @@
import UpdateVariables from '../updateVariables.svelte';
import { page } from '$app/state';
import UpdateLabels from './updateLabels.svelte';
+ import PremiumGeoDB from './premiumGeoDB.svelte';
+ import { isCloud } from '$lib/system';
import { ID } from '@appwrite.io/console';
export let data;
@@ -93,6 +95,9 @@
+ {#if isCloud}
+
+ {/if}
{
depends(Dependencies.PROJECT_VARIABLES);
depends(Dependencies.PROJECT_INSTALLATIONS);
+ depends(Dependencies.ADDONS);
const limit = PAGE_LIMIT;
const offset = Number(url.searchParams.get('offset') ?? 0);
const variablesOffset = Number(url.searchParams.get('variablesOffset') ?? 0);
const projectSdk = sdk.forProject(params.region, params.project);
- const [variables, installations] = await Promise.all([
+ const [variables, installations, addons] = await Promise.all([
projectSdk.projectApi.listVariables({
queries: [Query.limit(limit), Query.offset(variablesOffset)]
}),
projectSdk.vcs.listInstallations({
queries: [Query.limit(limit), Query.offset(offset)]
- })
+ }),
+ isCloud
+ ? sdk
+ .forConsoleIn(params.region)
+ .projects.listAddons({ projectId: params.project })
+ .catch(() => null)
+ : Promise.resolve(null)
]);
return {
@@ -24,6 +32,7 @@ export const load: PageLoad = async ({ depends, url, params }) => {
offset,
variablesOffset,
variables,
- installations
+ installations,
+ addons
};
};
diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
new file mode 100644
index 0000000000..6b27a1d8a2
--- /dev/null
+++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
@@ -0,0 +1,176 @@
+
+
+
+ Premium Geo DB
+ Enrich session and request data with premium geolocation details such as timezone, postal code, ISP,
+ connection type, and organization. Useful for fine-grained analytics, fraud detection, and personalized
+ user experiences.
+
+
+
+ Premium Geo DB
+
+ {#if !planSupportsPremiumGeoDB && canUpgradeToPremiumGeoDB}
+
+ Premium Geo DB is not available on your current plan. Upgrade your plan to
+ enable it.
+
+
+ Upgrade plan
+
+ {:else if !planSupportsPremiumGeoDB}
+
+ Premium Geo DB is not available on your current plan.
+
+ {:else if isPending}
+
+
+
+
+ A payment is awaiting confirmation. If the payment was interrupted, you can
+ cancel and retry.
+
+
+ Cancel & retry
+
+ {:else if isActive}
+
+ {#if isScheduledForRemoval}
+
+ {:else}
+
+ {/if}
+
+
+ Premium Geo DB is enabled for this project.
+
+ {#if isScheduledForRemoval}
+
+ Premium Geo DB will be removed at the end of your current billing cycle.
+
+
+ Keep Premium Geo DB
+
+ {:else}
+ (showDisable = true)}>
+ Disable Premium Geo DB
+
+ {/if}
+ {:else}
+
+ Enable Premium Geo DB for this project to collect detailed geolocation data on
+ every request. Billed prorated for your current cycle.
+
+ (showEnable = true)}>
+ Enable Premium Geo DB
+
+ {/if}
+
+
+
+
+
+
+{#if premiumGeoDBAddon}
+
+{/if}
diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBDisableModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBDisableModal.svelte
new file mode 100644
index 0000000000..98a36efec6
--- /dev/null
+++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBDisableModal.svelte
@@ -0,0 +1,54 @@
+
+
+
+
+ Are you sure you want to disable the Premium Geo DB addon? The addon will remain active
+ until the end of your current billing cycle and will not be renewed.
+
+
+
+ (show = false)}>Cancel
+ Disable Premium Geo DB
+
+
diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte
new file mode 100644
index 0000000000..5a220fb7fc
--- /dev/null
+++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte
@@ -0,0 +1,90 @@
+
+
+
+
+ By clicking Enable , your payment method will be charged for the prorated amount for
+ the remaining days in your billing cycle, and the addon will be added to this project's
+ subscription for future cycles.
+
+
+ Premium Geo DB enriches session and request data with premium geolocation details including
+ timezone, postal code, ISP, connection type, and organization.
+
+
+
+ (show = false)}>Cancel
+ Enable
+
+
From 5954b7562fb5684e5e411b1fd97fc0b80847d433 Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Sun, 19 Apr 2026 11:13:07 +0000
Subject: [PATCH 002/320] feat(settings): show price in premium geo DB enable
dialog
Mirrors the BAA addon UX by fetching the addon price via
organizations.getAddonPrice(Addon.Premiumgeodb) from the settings
page loader, passing it through to the Premium Geo DB card and
enable modal, and rendering the monthly/prorated breakdown with
formatCurrency alongside the Enable CTA.
Co-Authored-By: Claude Opus 4.7 (1M context)
---
.../settings/+page.svelte | 2 +-
.../settings/+page.ts | 18 +++--
.../settings/premiumGeoDB.svelte | 18 ++++-
.../settings/premiumGeoDBEnableModal.svelte | 66 +++++++++++++++++--
4 files changed, 90 insertions(+), 14 deletions(-)
diff --git a/src/routes/(console)/project-[region]-[project]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/+page.svelte
index d422eb5472..8d41dcdc5c 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/+page.svelte
@@ -96,7 +96,7 @@
{#if isCloud}
-
+
{/if}
{
+export const load: PageLoad = async ({ depends, url, params, parent }) => {
depends(Dependencies.PROJECT_VARIABLES);
depends(Dependencies.PROJECT_INSTALLATIONS);
depends(Dependencies.ADDONS);
+ const { project } = await parent();
const limit = PAGE_LIMIT;
const offset = Number(url.searchParams.get('offset') ?? 0);
const variablesOffset = Number(url.searchParams.get('variablesOffset') ?? 0);
const projectSdk = sdk.forProject(params.region, params.project);
- const [variables, installations, addons] = await Promise.all([
+ const [variables, installations, addons, addonPrice] = await Promise.all([
projectSdk.projectApi.listVariables({
queries: [Query.limit(limit), Query.offset(variablesOffset)]
}),
@@ -24,6 +25,14 @@ export const load: PageLoad = async ({ depends, url, params }) => {
.forConsoleIn(params.region)
.projects.listAddons({ projectId: params.project })
.catch(() => null)
+ : Promise.resolve(null),
+ isCloud
+ ? sdk.forConsole.organizations
+ .getAddonPrice({
+ organizationId: project.teamId,
+ addon: Addon.Premiumgeodb
+ })
+ .catch(() => null)
: Promise.resolve(null)
]);
@@ -33,6 +42,7 @@ export const load: PageLoad = async ({ depends, url, params }) => {
variablesOffset,
variables,
installations,
- addons
+ addons,
+ addonPrice
};
};
diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
index 6b27a1d8a2..e2770fb7ef 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
@@ -9,12 +9,14 @@
import { Dependencies } from '$lib/constants';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
+ import { formatCurrency } from '$lib/helpers/numbers';
import { Badge } from '@appwrite.io/pink-svelte';
import type { Models } from '@appwrite.io/console';
import PremiumGeoDBEnableModal from './premiumGeoDBEnableModal.svelte';
import PremiumGeoDBDisableModal from './premiumGeoDBDisableModal.svelte';
export let addons: Models.AddonList | null = null;
+ export let addonPrice: Models.AddonPrice | null = null;
let showEnable = false;
let showDisable = false;
@@ -30,6 +32,7 @@
$: isPending = premiumGeoDBAddon?.status === 'pending';
$: isActive = premiumGeoDBAddon?.status === 'active';
$: isScheduledForRemoval = isActive && premiumGeoDBAddon?.nextValue === 0;
+ $: monthlyPriceLabel = addonPrice ? formatCurrency(addonPrice.monthlyPrice) : null;
function hasUpgradeablePlanWithPremiumGeoDB(plan: Models.BillingPlan): boolean {
if (!plan) return false;
@@ -132,7 +135,11 @@
{/if}
- Premium Geo DB is enabled for this project.
+ {#if monthlyPriceLabel}
+ Premium Geo DB is enabled for this project at {monthlyPriceLabel}/month.
+ {:else}
+ Premium Geo DB is enabled for this project.
+ {/if}
{#if isScheduledForRemoval}
@@ -156,7 +163,12 @@
{:else}
Enable Premium Geo DB for this project to collect detailed geolocation data on
- every request. Billed prorated for your current cycle.
+ every request.{#if monthlyPriceLabel}
+ This addon costs {monthlyPriceLabel}/month, prorated for your current
+ billing cycle.
+ {:else}
+ Billed prorated for your current cycle.
+ {/if}
-
+
{#if premiumGeoDBAddon}
diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte
index 5a220fb7fc..322842dbec 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte
@@ -9,12 +9,15 @@
import { confirmPayment } from '$lib/stores/stripe';
import { organization } from '$lib/stores/organization';
import { sdk } from '$lib/stores/sdk';
+ import { formatCurrency } from '$lib/helpers/numbers';
import type { Models } from '@appwrite.io/console';
let {
- show = $bindable(false)
+ show = $bindable(false),
+ addonPrice = null
}: {
show: boolean;
+ addonPrice: Models.AddonPrice | null;
} = $props();
let error = $state(null);
@@ -73,18 +76,69 @@
-
- By clicking Enable , your payment method will be charged for the prorated amount for
- the remaining days in your billing cycle, and the addon will be added to this project's
- subscription for future cycles.
-
+ {#if addonPrice}
+
+ By clicking Enable , the amount of
+ {formatCurrency(addonPrice.monthlyPrice)} will be added to your subscription and
+ your payment method will be charged
+ {formatCurrency(addonPrice.proratedAmount)} immediately for the remaining days in your
+ billing cycle.
+
+ {:else}
+
+ By clicking Enable , your payment method will be charged for the prorated amount
+ for the remaining days in your billing cycle, and the addon will be added to this
+ project's subscription for future cycles.
+
+ {/if}
Premium Geo DB enriches session and request data with premium geolocation details including
timezone, postal code, ISP, connection type, and organization.
+ {#if addonPrice}
+
+
+ {addonPrice.name}
+ {formatCurrency(addonPrice.monthlyPrice)} / month
+
+
+
+ Due today (prorated)
+ {formatCurrency(addonPrice.proratedAmount)}
+
+
+ * Plus applicable tax and fees
+
+
+ {/if}
+
(show = false)}>Cancel
Enable
+
+
From 7e73d36e6a369953a4baa126d60bb7678c04ddf9 Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Sun, 19 Apr 2026 11:55:08 +0000
Subject: [PATCH 003/320] update sdk
---
bun.lock | 4 ++--
package.json | 4 ++--
.../settings/+page.ts | 22 +++++++++----------
3 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/bun.lock b/bun.lock
index f5a1514ea9..d749dbc87c 100644
--- a/bun.lock
+++ b/bun.lock
@@ -6,7 +6,7 @@
"name": "@appwrite/console",
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
@@ -113,7 +113,7 @@
"@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="],
- "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d", { "dependencies": { "json-bigint": "1.0.0" } }],
+ "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842", { "dependencies": { "json-bigint": "1.0.0" } }],
"@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="],
diff --git a/package.json b/package.json
index b48a5f4ec4..0bb37b85c7 100644
--- a/package.json
+++ b/package.json
@@ -20,12 +20,12 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
"@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17",
- "@faker-js/faker": "^9.9.0",
+ "@faker-js/faker": "^9.9.0",
"@plausible-analytics/tracker": "^0.4.4",
"@popperjs/core": "^2.11.8",
"@sentry/sveltekit": "^8.55.1",
diff --git a/src/routes/(console)/project-[region]-[project]/settings/+page.ts b/src/routes/(console)/project-[region]-[project]/settings/+page.ts
index e43042e4f3..137e08e488 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/settings/+page.ts
@@ -4,11 +4,10 @@ import { sdk } from '$lib/stores/sdk';
import { Addon, Query } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-export const load: PageLoad = async ({ depends, url, params, parent }) => {
+export const load: PageLoad = async ({ depends, url, params }) => {
depends(Dependencies.PROJECT_VARIABLES);
depends(Dependencies.PROJECT_INSTALLATIONS);
depends(Dependencies.ADDONS);
- const { project } = await parent();
const limit = PAGE_LIMIT;
const offset = Number(url.searchParams.get('offset') ?? 0);
const variablesOffset = Number(url.searchParams.get('variablesOffset') ?? 0);
@@ -22,17 +21,18 @@ export const load: PageLoad = async ({ depends, url, params, parent }) => {
}),
isCloud
? sdk
- .forConsoleIn(params.region)
- .projects.listAddons({ projectId: params.project })
- .catch(() => null)
+ .forConsoleIn(params.region)
+ .projects.listAddons({ projectId: params.project })
+ .catch(() => null)
: Promise.resolve(null),
isCloud
- ? sdk.forConsole.organizations
- .getAddonPrice({
- organizationId: project.teamId,
- addon: Addon.Premiumgeodb
- })
- .catch(() => null)
+ ? sdk.forConsoleIn(params.region)
+ .projects
+ .getAddonPrice({
+ projectId: params.project,
+ addon: Addon.Premiumgeodb
+ })
+ .catch(() => null)
: Promise.resolve(null)
]);
From 0e53210ad1b107b79887df362c9af3545784b85e Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Sun, 19 Apr 2026 12:14:26 +0000
Subject: [PATCH 004/320] feat(billing): render project addons in breakdown +
use server addon name
- Each project row in the organization billing breakdown now iterates
its resources for addon_* entries (amount > 0) and renders them as
child rows (e.g. Premium Geo DB under the project it was enabled on).
The backend already filters project-scoped addons out of the
team-level resources response, so the org "Addons" section shows only
org-scoped addons (BAA, premiumGeoDBOrg) while project-scoped ones
surface where they belong.
- Org-level addon labels now read addon.name from the UsageResource
payload that the getAggregation endpoint populates from billingAddons
config. Dropped the hard-coded billingAddonNames map so new addons
surface with their proper name without a console update.
Co-Authored-By: Claude Opus 4.7 (1M context)
---
package.json | 2 +-
.../billing/planSummary.svelte | 20 +++++++++++++------
.../settings/+page.ts | 20 +++++++++----------
3 files changed, 25 insertions(+), 17 deletions(-)
diff --git a/package.json b/package.json
index 0bb37b85c7..00b3e4d6cb 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
"@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17",
- "@faker-js/faker": "^9.9.0",
+ "@faker-js/faker": "^9.9.0",
"@plausible-analytics/tracker": "^0.4.4",
"@popperjs/core": "^2.11.8",
"@sentry/sveltekit": "^8.55.1",
diff --git a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte
index 84683f8c66..987d1bca6d 100644
--- a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte
+++ b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte
@@ -249,10 +249,6 @@
};
// addons (additional members, projects, etc.)
- const billingAddonNames: Record = {
- addon_baa: 'HIPAA BAA'
- };
-
const addons = (currentAggregation?.resources || [])
.filter(
(r) =>
@@ -269,8 +265,8 @@
? 'Additional members'
: addon.resourceId === 'projects'
? 'Additional projects'
- : (billingAddonNames[addon.resourceId] ??
- `${addon.resourceId} overage (${formatNum(addon.value)})`),
+ : addon.name ||
+ `${addon.resourceId} overage (${formatNum(addon.value)})`,
usage: '',
price: formatCurrency(addon.amount)
},
@@ -400,6 +396,18 @@
priceFormatter: ({ amount }) => formatCurrency(amount),
includeProgress: false
}),
+ ...resources
+ .filter((r) => r.resourceId?.startsWith('addon_') && (r.amount ?? 0) > 0)
+ .map((addon) =>
+ createRow({
+ id: `addon-${addon.resourceId}`,
+ label: addon.name || addon.resourceId,
+ resource: addon,
+ usageFormatter: ({ value }) => formatNum(value),
+ priceFormatter: ({ amount }) => formatCurrency(amount),
+ includeProgress: false
+ })
+ ),
createRow({
id: 'usage-details',
label: `Usage details `,
diff --git a/src/routes/(console)/project-[region]-[project]/settings/+page.ts b/src/routes/(console)/project-[region]-[project]/settings/+page.ts
index 137e08e488..536eef036a 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/settings/+page.ts
@@ -21,18 +21,18 @@ export const load: PageLoad = async ({ depends, url, params }) => {
}),
isCloud
? sdk
- .forConsoleIn(params.region)
- .projects.listAddons({ projectId: params.project })
- .catch(() => null)
+ .forConsoleIn(params.region)
+ .projects.listAddons({ projectId: params.project })
+ .catch(() => null)
: Promise.resolve(null),
isCloud
- ? sdk.forConsoleIn(params.region)
- .projects
- .getAddonPrice({
- projectId: params.project,
- addon: Addon.Premiumgeodb
- })
- .catch(() => null)
+ ? sdk
+ .forConsoleIn(params.region)
+ .projects.getAddonPrice({
+ projectId: params.project,
+ addon: Addon.Premiumgeodb
+ })
+ .catch(() => null)
: Promise.resolve(null)
]);
From 13b04789450b506ee4615170791d947e4d1d7ba0 Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Thu, 23 Apr 2026 01:11:24 +0000
Subject: [PATCH 005/320] chore: bump @appwrite.io/console SDK to 95547fc
---
bun.lock | 4 ++--
package.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/bun.lock b/bun.lock
index d749dbc87c..cf2eb304b5 100644
--- a/bun.lock
+++ b/bun.lock
@@ -6,7 +6,7 @@
"name": "@appwrite/console",
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
@@ -113,7 +113,7 @@
"@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="],
- "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842", { "dependencies": { "json-bigint": "1.0.0" } }],
+ "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", { "dependencies": { "json-bigint": "1.0.0" } }],
"@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="],
diff --git a/package.json b/package.json
index 00b3e4d6cb..5c40d1a666 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
From 304142cf908f7d8a0285f86b118a5f4e92af1edb Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Sun, 26 Apr 2026 05:16:33 +0000
Subject: [PATCH 006/320] chore: keep @appwrite.io/console@95547fc for premium
geo DB SDK methods
---
bun.lock | 4 ++--
package.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/bun.lock b/bun.lock
index 10ce13d787..74cf4d8fe8 100644
--- a/bun.lock
+++ b/bun.lock
@@ -6,7 +6,7 @@
"name": "@appwrite/console",
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
@@ -124,7 +124,7 @@
"@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="],
- "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", { "dependencies": { "json-bigint": "1.0.0" } }],
+ "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", { "dependencies": { "json-bigint": "1.0.0" } }],
"@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="],
diff --git a/package.json b/package.json
index a006833186..641fd4316a 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
From 67566dbadc7c3dcb6969db3f13f2dee30e78d49b Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Sun, 26 Apr 2026 05:19:14 +0000
Subject: [PATCH 007/320] Revert "chore: keep @appwrite.io/console@95547fc for
premium geo DB SDK methods"
This reverts commit 304142cf908f7d8a0285f86b118a5f4e92af1edb.
---
bun.lock | 4 ++--
package.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/bun.lock b/bun.lock
index 74cf4d8fe8..10ce13d787 100644
--- a/bun.lock
+++ b/bun.lock
@@ -6,7 +6,7 @@
"name": "@appwrite/console",
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
@@ -124,7 +124,7 @@
"@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="],
- "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", { "dependencies": { "json-bigint": "1.0.0" } }],
+ "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", { "dependencies": { "json-bigint": "1.0.0" } }],
"@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="],
diff --git a/package.json b/package.json
index 641fd4316a..a006833186 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
From a54c530580145e24b9f6c7a40e18bd0b6a0599ea Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Thu, 30 Apr 2026 02:53:42 +0000
Subject: [PATCH 008/320] chore: update console SDK to 352239b
---
bun.lock | 4 ++--
package.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/bun.lock b/bun.lock
index 10ce13d787..ba8fe3f958 100644
--- a/bun.lock
+++ b/bun.lock
@@ -6,7 +6,7 @@
"name": "@appwrite/console",
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
@@ -124,7 +124,7 @@
"@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="],
- "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", { "dependencies": { "json-bigint": "1.0.0" } }],
+ "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b", { "dependencies": { "json-bigint": "1.0.0" } }],
"@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="],
diff --git a/package.json b/package.json
index a006833186..1f97cb821d 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
From 0889ace4f3e591e25f1c5ca9f9cfc140c91bc37e Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Wed, 6 May 2026 01:57:15 +0000
Subject: [PATCH 009/320] feat(settings): rewrite Premium Geo DB card
description to focus on developer value
---
.../project-[region]-[project]/settings/premiumGeoDB.svelte | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
index e2770fb7ef..acb09ff8e1 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
@@ -88,9 +88,9 @@
Premium Geo DB
- Enrich session and request data with premium geolocation details such as timezone, postal code, ISP,
- connection type, and organization. Useful for fine-grained analytics, fraud detection, and personalized
- user experiences.
+ Know exactly where your users are and how they're connecting. Tailor pricing, currency and language
+ by region, meet local compliance requirements, and catch risky sign-ins before they cause damage —
+ all without writing a line of geo lookup code.
From 6fbdd439be452204e37a59ab9084934248053fdc Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Thu, 7 May 2026 00:44:00 +0000
Subject: [PATCH 010/320] feat(settings): tighten Premium Geo DB card copy to
outcome-focused variant
---
.../project-[region]-[project]/settings/premiumGeoDB.svelte | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
index acb09ff8e1..64f4c2f861 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte
@@ -88,9 +88,9 @@
Premium Geo DB
- Know exactly where your users are and how they're connecting. Tailor pricing, currency and language
- by region, meet local compliance requirements, and catch risky sign-ins before they cause damage —
- all without writing a line of geo lookup code.
+ Give your project richer location intelligence on every user. Tailor pricing by region, surface
+ the right currency and language, comply with local regulations, and spot suspicious sign-ins
+ before they cause damage — all without leaving Appwrite.
From 3e38de492ea48ba1984b62c464cf3b29241a09ae Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Mon, 11 May 2026 11:59:47 +0530
Subject: [PATCH 011/320] feat: add signup email security controls
---
src/lib/actions/analytics.ts | 3 +
.../auth/security/+page.svelte | 2 +
.../security/updateSignupEmailSecurity.svelte | 113 ++++++++++++++++++
3 files changed, 118 insertions(+)
create mode 100644 src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts
index c806945d0f..8846d80f38 100644
--- a/src/lib/actions/analytics.ts
+++ b/src/lib/actions/analytics.ts
@@ -272,6 +272,9 @@ export enum Submit {
AuthPasswordHistoryUpdate = 'submit_auth_password_history_limit_update',
AuthPasswordDictionaryUpdate = 'submit_auth_password_dictionary_update',
AuthPersonalDataCheckUpdate = 'submit_auth_personal_data_check_update',
+ AuthCanonicalEmailsUpdate = 'submit_auth_canonical_emails_update',
+ AuthDisposableEmailsUpdate = 'submit_auth_disposable_emails_update',
+ AuthFreeEmailsUpdate = 'submit_auth_free_emails_update',
AuthSessionAlertsUpdate = 'submit_auth_session_alerts_update',
AuthMembershipPrivacyUpdate = 'submit_auth_membership_privacy_update',
AuthMockNumbersUpdate = 'submit_auth_mock_numbers_update',
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/+page.svelte
index 254fef0f74..3758a0fd7d 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/+page.svelte
@@ -8,6 +8,7 @@
import UpdateSessionsLimit from './updateSessionsLimit.svelte';
import PasswordPolicies from './passwordPolicies.svelte';
import SessionSecurity from './sessionSecurity.svelte';
+ import UpdateSignupEmailSecurity from './updateSignupEmailSecurity.svelte';
let { data }: PageProps = $props();
@@ -17,6 +18,7 @@
+
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
new file mode 100644
index 0000000000..ba1879c723
--- /dev/null
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
@@ -0,0 +1,113 @@
+
+
+
From 38f8abc8faf33fb4e9683adfc47c48e67b0ab75c Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Mon, 11 May 2026 12:05:06 +0530
Subject: [PATCH 012/320] fix: handle signup email security update failures
---
.../security/updateSignupEmailSecurity.svelte | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
index ba1879c723..596b4c5f84 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
@@ -31,20 +31,29 @@
});
async function updateSignupEmailSecurity() {
+ let currentSubmit = Submit.AuthCanonicalEmailsUpdate;
+ let hasAppliedServerChange = false;
+
try {
const projectSdk = sdk.forProject(project.region, project.$id).project;
+ currentSubmit = Submit.AuthCanonicalEmailsUpdate;
await projectSdk.updateCanonicalEmails({
enabled: authCanonicalEmails
});
+ hasAppliedServerChange = true;
+ currentSubmit = Submit.AuthDisposableEmailsUpdate;
await projectSdk.updateDisposableEmails({
enabled: authDisposableEmails
});
+ hasAppliedServerChange = true;
+ currentSubmit = Submit.AuthFreeEmailsUpdate;
await projectSdk.updateFreeEmails({
enabled: authFreeEmails
});
+ hasAppliedServerChange = true;
await invalidate(Dependencies.PROJECT);
@@ -56,11 +65,15 @@
trackEvent(Submit.AuthDisposableEmailsUpdate);
trackEvent(Submit.AuthFreeEmailsUpdate);
} catch (error) {
+ if (hasAppliedServerChange) {
+ await invalidate(Dependencies.PROJECT);
+ }
+
addNotification({
type: 'error',
message: error.message
});
- trackError(error, Submit.AuthCanonicalEmailsUpdate);
+ trackError(error, currentSubmit);
}
}
From f8d28167cc50e26d91e92ad21b1fb973bb659937 Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Mon, 11 May 2026 07:21:54 +0000
Subject: [PATCH 013/320] chore: update console SDK to 634f110
---
bun.lock | 4 ++--
package.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/bun.lock b/bun.lock
index 8668a20baa..f06557fe68 100644
--- a/bun.lock
+++ b/bun.lock
@@ -6,7 +6,7 @@
"name": "@appwrite/console",
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@634f110",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
@@ -124,7 +124,7 @@
"@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="],
- "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b", { "dependencies": { "json-bigint": "1.0.0" } }],
+ "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@634f110", { "dependencies": { "json-bigint": "1.0.0" } }],
"@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="],
diff --git a/package.json b/package.json
index 1f97cb821d..3563b06a80 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
},
"dependencies": {
"@ai-sdk/svelte": "^1.1.24",
- "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b",
+ "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@634f110",
"@appwrite.io/pink-icons": "0.25.0",
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
From cbda2db53e9a7305776cca64e1a171ce4cfde750 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Mon, 11 May 2026 16:49:33 +0530
Subject: [PATCH 014/320] refactor: update email policy copy
---
.../security/updateSignupEmailSecurity.svelte | 20 ++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
index 596b4c5f84..bb41aad937 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
@@ -80,15 +80,17 @@
-
+
Update
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionsLimit.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionsLimit.svelte
index 4ea90f44ec..f169a9cab5 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionsLimit.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionsLimit.svelte
@@ -10,12 +10,14 @@
import type { Models } from '@appwrite.io/console';
let {
- project
+ project,
+ policy
}: {
project: Models.Project;
+ policy: Models.PolicySessionLimit;
} = $props();
- let maxSessions = $state(project?.authSessionsLimit);
+ let maxSessions = $state(policy.total);
async function updateSessionsLimit() {
try {
@@ -54,7 +56,7 @@
bind:value={maxSessions} />
- Update
+ Update
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
index 3bfac6c703..1ca6beb1d9 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
@@ -10,7 +10,13 @@
import type { Models } from '@appwrite.io/console';
import { onMount } from 'svelte';
- let { project }: { project: Models.Project } = $props();
+ type SignupEmailSecurityProject = Models.Project & {
+ authCanonicalEmails?: boolean;
+ authDisposableEmails?: boolean;
+ authFreeEmails?: boolean;
+ };
+
+ let { project }: { project: SignupEmailSecurityProject } = $props();
let authCanonicalEmails = $state(false);
let authDisposableEmails = $state(false);
@@ -38,19 +44,19 @@
const projectSdk = sdk.forProject(project.region, project.$id).project;
currentSubmit = Submit.AuthCanonicalEmailsUpdate;
- await projectSdk.updateCanonicalEmails({
+ await projectSdk.updateDenyAliasedEmailPolicy({
enabled: authCanonicalEmails
});
hasAppliedServerChange = true;
currentSubmit = Submit.AuthDisposableEmailsUpdate;
- await projectSdk.updateDisposableEmails({
+ await projectSdk.updateDenyDisposableEmailPolicy({
enabled: authDisposableEmails
});
hasAppliedServerChange = true;
currentSubmit = Submit.AuthFreeEmailsUpdate;
- await projectSdk.updateFreeEmails({
+ await projectSdk.updateDenyFreeEmailPolicy({
enabled: authFreeEmails
});
hasAppliedServerChange = true;
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateUsersLimit.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateUsersLimit.svelte
index 63a51144e3..dc64a2dc78 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateUsersLimit.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateUsersLimit.svelte
@@ -11,22 +11,21 @@
import type { Models } from '@appwrite.io/console';
let {
- project
+ project,
+ policy
}: {
project: Models.Project;
+ policy: Models.PolicyUserLimit;
} = $props();
let maxUsersInputField: HTMLInputElement | null = $state(null);
- let value = $state(project?.authLimit !== 0 ? 'limited' : 'unlimited');
- let newLimit = $state(project?.authLimit !== 0 ? project?.authLimit : 100);
+ let value = $state(policy.total !== 0 ? 'limited' : 'unlimited');
+ let newLimit = $state(policy.total !== 0 ? policy.total : 100);
const isLimited = $derived(value === 'limited');
const btnDisabled = $derived.by(() => {
- return (
- (!isLimited && project?.authLimit === 0) ||
- (isLimited && project?.authLimit === newLimit)
- );
+ return (!isLimited && policy.total === 0) || (isLimited && policy.total === newLimit);
});
async function updateLimit() {
diff --git a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte
index 83b6c3e4ed..029effce65 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte
@@ -10,7 +10,7 @@
import { addNotification } from '$lib/stores/notifications';
import { oAuthProviders } from '$lib/stores/oauth-providers';
import { sdk } from '$lib/stores/sdk';
- import { AuthMethod as MethodId, type Models } from '@appwrite.io/console';
+ import { ProjectAuthMethodId as MethodId } from '@appwrite.io/console';
import { base } from '$app/paths';
import {
Avatar,
@@ -24,6 +24,7 @@
} from '@appwrite.io/pink-svelte';
import { Dependencies } from '$lib/constants';
import type { PageProps } from './$types';
+ import type { AuthProvider } from '../updateOAuth';
import { SvelteSet } from 'svelte/reactivity';
import { get } from 'svelte/store';
@@ -34,7 +35,7 @@
const consoleParamsMap = $derived(data.consoleParamsMap);
let showProvider = $state(false);
- let selectedProvider: Models.AuthProvider | null = $state(null);
+ let selectedProvider: AuthProvider | null = $state(null);
let isUpdatingAllAuthMethods = $state(false);
let showUpdateAuthMethodsDialog = $state(false);
let updateAuthMethodsEnabledMode = $state(null);
diff --git a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts
index 0aa058f7e7..8a22304400 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts
@@ -1,8 +1,9 @@
import { Dependencies } from '$lib/constants';
import { oAuthProviders } from '$lib/stores/oauth-providers';
import { sdk } from '$lib/stores/sdk';
-import type { Models, Models as ConsoleModels } from '@appwrite.io/console';
+import type { Models as ConsoleModels } from '@appwrite.io/console';
import type { PageLoad } from './$types';
+import type { AuthProvider } from '../updateOAuth';
/** Extract the appId equivalent from a typed OAuth2 provider model. */
function extractAppId(p: Record): string {
@@ -34,12 +35,13 @@ export const load: PageLoad = async ({ depends, params }) => {
consoleParamsMap.set(cp.$id, cp.parameters ?? []);
}
- const oauthProviders: Models.AuthProvider[] = providerList.providers
+ const oauthProviders: AuthProvider[] = providerList.providers
.filter((p) => p.$id !== 'mock')
.map((p) => {
const raw = p as unknown as Record;
return {
...raw,
+ $id: p.$id,
key: p.$id,
name: oAuthProviders[p.$id]?.name ?? p.$id,
appId: extractAppId(raw),
diff --git a/src/routes/(console)/project-[region]-[project]/auth/store.ts b/src/routes/(console)/project-[region]-[project]/auth/store.ts
index ae7e544db0..b281632222 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/store.ts
+++ b/src/routes/(console)/project-[region]-[project]/auth/store.ts
@@ -1,4 +1,4 @@
-import { page } from '$app/stores';
+import { page } from '$lib/stores/page';
import type { Models } from '@appwrite.io/console';
import { derived } from 'svelte/store';
diff --git a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/store.ts b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/store.ts
index 4da496a1d3..1a46a0882d 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/store.ts
+++ b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/store.ts
@@ -1,5 +1,5 @@
import { derived } from 'svelte/store';
-import { page } from '$app/stores';
+import { page } from '$lib/stores/page';
import type { Models } from '@appwrite.io/console';
export const team = derived(
diff --git a/src/routes/(console)/project-[region]-[project]/auth/templates/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/templates/+page.svelte
index 4d43e0ab4a..3069dc0be0 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/templates/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/templates/+page.svelte
@@ -1,5 +1,9 @@
From b4aadf7134aecd9d58a8a4dea0a000084c1b1129 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 11:41:32 +0530
Subject: [PATCH 024/320] aliased emails
---
src/lib/actions/analytics.ts | 2 +-
.../security/updateSignupEmailSecurity.svelte | 22 +++++++++----------
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts
index 8846d80f38..a03b956e4c 100644
--- a/src/lib/actions/analytics.ts
+++ b/src/lib/actions/analytics.ts
@@ -272,7 +272,7 @@ export enum Submit {
AuthPasswordHistoryUpdate = 'submit_auth_password_history_limit_update',
AuthPasswordDictionaryUpdate = 'submit_auth_password_dictionary_update',
AuthPersonalDataCheckUpdate = 'submit_auth_personal_data_check_update',
- AuthCanonicalEmailsUpdate = 'submit_auth_canonical_emails_update',
+ AuthAliasedEmailsUpdate = 'submit_auth_aliased_emails_update',
AuthDisposableEmailsUpdate = 'submit_auth_disposable_emails_update',
AuthFreeEmailsUpdate = 'submit_auth_free_emails_update',
AuthSessionAlertsUpdate = 'submit_auth_session_alerts_update',
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
index 29643649f2..ff4d301beb 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
@@ -27,34 +27,34 @@
denyFreeEmailPolicy: EnabledPolicy;
} = $props();
- let authCanonicalEmails = $state(false);
+ let authAliasedEmails = $state(false);
let authDisposableEmails = $state(false);
let authFreeEmails = $state(false);
onMount(() => {
- authCanonicalEmails = denyAliasedEmailPolicy.enabled;
+ authAliasedEmails = denyAliasedEmailPolicy.enabled;
authDisposableEmails = denyDisposableEmailPolicy.enabled;
authFreeEmails = denyFreeEmailPolicy.enabled;
});
const hasChanges = $derived.by(() => {
- const canonicalChanged = authCanonicalEmails !== denyAliasedEmailPolicy.enabled;
+ const aliasedChanged = authAliasedEmails !== denyAliasedEmailPolicy.enabled;
const disposableChanged = authDisposableEmails !== denyDisposableEmailPolicy.enabled;
const freeChanged = authFreeEmails !== denyFreeEmailPolicy.enabled;
- return canonicalChanged || disposableChanged || freeChanged;
+ return aliasedChanged || disposableChanged || freeChanged;
});
async function updateSignupEmailSecurity() {
- let currentSubmit = Submit.AuthCanonicalEmailsUpdate;
+ let currentSubmit = Submit.AuthAliasedEmailsUpdate;
let hasAppliedServerChange = false;
try {
const projectSdk = sdk.forProject(project.region, project.$id).project;
- currentSubmit = Submit.AuthCanonicalEmailsUpdate;
+ currentSubmit = Submit.AuthAliasedEmailsUpdate;
await projectSdk.updateDenyAliasedEmailPolicy({
- enabled: authCanonicalEmails
+ enabled: authAliasedEmails
});
hasAppliedServerChange = true;
@@ -76,7 +76,7 @@
type: 'success',
message: 'Updated signup email security settings.'
});
- trackEvent(Submit.AuthCanonicalEmailsUpdate);
+ trackEvent(Submit.AuthAliasedEmailsUpdate);
trackEvent(Submit.AuthDisposableEmailsUpdate);
trackEvent(Submit.AuthFreeEmailsUpdate);
} catch (error) {
@@ -117,9 +117,9 @@
+ bind:value={authAliasedEmails}
+ id="authAliasedEmails"
+ label="Block aliased email addresses">
From 4d7f3d33d516fe54d2fc89174f0759dd3f76eb19 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 12:07:04 +0530
Subject: [PATCH 025/320] pagination
---
.../organization-[organization]/+page.svelte | 17 +++++++---
.../organization-[organization]/+page.ts | 23 +++++++++----
.../project-[region]-[project]/+layout.ts | 6 ++--
.../auth/security/updateMockNumbers.svelte | 33 +++++++++++++++----
.../overview/(components)/table.svelte | 15 +++++++--
.../overview/api-keys/+page.svelte | 2 +-
.../overview/api-keys/+page.ts | 17 ++++++++--
.../overview/platforms/+page.svelte | 8 ++++-
.../overview/platforms/+page.ts | 18 ++++++++--
9 files changed, 107 insertions(+), 32 deletions(-)
diff --git a/src/routes/(console)/organization-[organization]/+page.svelte b/src/routes/(console)/organization-[organization]/+page.svelte
index 8f0889d7ec..0a7b4308cb 100644
--- a/src/routes/(console)/organization-[organization]/+page.svelte
+++ b/src/routes/(console)/organization-[organization]/+page.svelte
@@ -251,15 +251,22 @@
on:click={handleCreateProject}>
{#each data.projects.projects as project}
{@const projectPlatforms =
- (project as Models.Project & { platforms: Array<{ type: string }> })
- .platforms ?? []}
+ (
+ project as Models.Project & {
+ platforms: Array<{ type: string }>;
+ platformsTotal?: number;
+ }
+ ).platforms ?? []}
+ {@const platformsTotal =
+ (project as Models.Project & { platformsTotal?: number }).platformsTotal ??
+ projectPlatforms.length}
{@const platforms = filterPlatforms(
projectPlatforms.map((platform) => getPlatformInfo(platform.type))
)}
- {projectPlatforms.length ? projectPlatforms.length : 'No'} apps
+ {platformsTotal ? platformsTotal : 'No'} apps
{project.name}
@@ -284,10 +291,10 @@
{/each}
- {#if platforms.length > 3}
+ {#if platformsTotal > 2}
{/if}
diff --git a/src/routes/(console)/organization-[organization]/+page.ts b/src/routes/(console)/organization-[organization]/+page.ts
index 7f078b2b04..eb6f9990be 100644
--- a/src/routes/(console)/organization-[organization]/+page.ts
+++ b/src/routes/(console)/organization-[organization]/+page.ts
@@ -43,13 +43,22 @@ export const load: PageLoad = async ({ params, url, route, depends, parent }) =>
]
});
- // set `default` if no region!
- for (const project of activeProjects.projects) {
- project.region ??= 'default';
- (project as Models.Project & { platforms: Array<{ type: string }> }).platforms = (
- await sdk.forProject(project.region, project.$id).project.listPlatforms()
- ).platforms;
- }
+ await Promise.all(
+ activeProjects.projects.map(async (project) => {
+ project.region ??= 'default';
+ const platformList = await sdk
+ .forProject(project.region, project.$id)
+ .project.listPlatforms({ queries: [Query.limit(3)] });
+ (
+ project as Models.Project & {
+ platforms: Array<{ type: string }>;
+ platformsTotal: number;
+ }
+ ).platforms = platformList.platforms;
+ (project as Models.Project & { platformsTotal: number }).platformsTotal =
+ platformList.total;
+ })
+ );
return {
limit,
diff --git a/src/routes/(console)/project-[region]-[project]/+layout.ts b/src/routes/(console)/project-[region]-[project]/+layout.ts
index 169300d290..fedac9d430 100644
--- a/src/routes/(console)/project-[region]-[project]/+layout.ts
+++ b/src/routes/(console)/project-[region]-[project]/+layout.ts
@@ -8,7 +8,7 @@ import { get } from 'svelte/store';
import { headerAlert } from '$lib/stores/headerAlert';
import PaymentFailed from '$lib/components/billing/alerts/paymentFailed.svelte';
import { loadAvailableRegions } from '$routes/(console)/regions';
-import { type Models, Platform } from '@appwrite.io/console';
+import { Query, type Models, Platform } from '@appwrite.io/console';
import { redirect } from '@sveltejs/kit';
import { resolve } from '$app/paths';
import { generateFingerprintToken } from '$lib/helpers/fingerprint';
@@ -57,8 +57,8 @@ export const load: LayoutLoad = async ({ params, depends, parent }) => {
: null,
loadAvailableRegions(project.teamId),
- projectSdk.listPlatforms(),
- projectSdk.listKeys()
+ projectSdk.listPlatforms({ queries: [Query.limit(1)] }),
+ projectSdk.listKeys({ queries: [Query.limit(1)] })
]);
const regionalConsoleVariables = normalizeConsoleVariables(rawRegionalConsoleVariables);
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateMockNumbers.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateMockNumbers.svelte
index 3a7242cf4a..daebe7a8c0 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateMockNumbers.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateMockNumbers.svelte
@@ -1,6 +1,6 @@
-
+
diff --git a/src/routes/(console)/project-[region]-[project]/overview/api-keys/+page.ts b/src/routes/(console)/project-[region]-[project]/overview/api-keys/+page.ts
index 7628733e69..025777c187 100644
--- a/src/routes/(console)/project-[region]-[project]/overview/api-keys/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/overview/api-keys/+page.ts
@@ -1,10 +1,21 @@
-import { Dependencies } from '$lib/constants';
+import { CARD_LIMIT, Dependencies } from '$lib/constants';
+import { getLimit, getPage, pageToOffset } from '$lib/helpers/load';
import { sdk } from '$lib/stores/sdk';
+import { Query } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-export const load: PageLoad = async ({ params, depends }) => {
+export const load: PageLoad = async ({ params, depends, route, url }) => {
depends(Dependencies.KEYS);
+ const projectSdk = sdk.forProject(params.region, params.project).project;
+ const page = getPage(url);
+ const limit = getLimit(url, route, CARD_LIMIT);
+ const offset = pageToOffset(page, limit);
+
return {
- keys: await sdk.forProject(params.region, params.project).project.listKeys()
+ limit,
+ offset,
+ keys: await projectSdk.listKeys({
+ queries: [Query.limit(limit), Query.offset(offset)]
+ })
};
};
diff --git a/src/routes/(console)/project-[region]-[project]/overview/platforms/+page.svelte b/src/routes/(console)/project-[region]-[project]/overview/platforms/+page.svelte
index 4abffc8ae1..d0798f371a 100644
--- a/src/routes/(console)/project-[region]-[project]/overview/platforms/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/overview/platforms/+page.svelte
@@ -93,7 +93,8 @@
import {
type DeleteOperationState,
type DeleteOperation,
- MultiSelectionTable
+ MultiSelectionTable,
+ PaginationWithLimit
} from '$lib/components';
import { sdk } from '$lib/stores/sdk';
import { Submit, trackError } from '$lib/actions/analytics';
@@ -200,6 +201,11 @@
{/each}
{/snippet}
+
{:else}
{
- const { platforms } = await parent();
+export const load: PageLoad = async ({ depends, params, route, url }) => {
+ depends(Dependencies.PROJECT);
+ const page = getPage(url);
+ const limit = getLimit(url, route, CARD_LIMIT);
+ const offset = pageToOffset(page, limit);
+
return {
- platforms
+ limit,
+ offset,
+ platforms: await sdk.forProject(params.region, params.project).project.listPlatforms({
+ queries: [Query.limit(limit), Query.offset(offset)]
+ })
};
};
From 46bd13b8c9a7ca02d670143dc8bf0e6bcb70e33b Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 12:28:25 +0530
Subject: [PATCH 026/320] dont use as methodid
---
src/lib/stores/auth-methods.ts | 32 +++++++++----------
.../auth/settings/+page.svelte | 4 +--
2 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/src/lib/stores/auth-methods.ts b/src/lib/stores/auth-methods.ts
index 3276a6e6f2..190a7a2106 100644
--- a/src/lib/stores/auth-methods.ts
+++ b/src/lib/stores/auth-methods.ts
@@ -1,9 +1,9 @@
import { writable } from 'svelte/store';
-import { type Models, ProjectAuthMethodId as MethodId } from '@appwrite.io/console';
+import { type Models, ProjectAuthMethodId } from '@appwrite.io/console';
export type AuthMethod = {
label: string;
- method: MethodId;
+ method: ProjectAuthMethodId;
value: boolean | null;
};
@@ -15,38 +15,38 @@ const setAuthMethod = (project: Models.Project): AuthMethod[] => {
return [
{
label: 'Email/Password',
- method: MethodId.Emailpassword,
- value: authMethods.get(MethodId.Emailpassword) ?? null
+ method: ProjectAuthMethodId.Emailpassword,
+ value: authMethods.get(ProjectAuthMethodId.Emailpassword) ?? null
},
{
label: 'Phone',
- method: MethodId.Phone,
- value: authMethods.get(MethodId.Phone) ?? null
+ method: ProjectAuthMethodId.Phone,
+ value: authMethods.get(ProjectAuthMethodId.Phone) ?? null
},
{
label: 'Magic URL',
- method: MethodId.Magicurl,
- value: authMethods.get(MethodId.Magicurl) ?? null
+ method: ProjectAuthMethodId.Magicurl,
+ value: authMethods.get(ProjectAuthMethodId.Magicurl) ?? null
},
{
label: 'Email OTP',
- method: MethodId.Emailotp,
- value: authMethods.get(MethodId.Emailotp) ?? null
+ method: ProjectAuthMethodId.Emailotp,
+ value: authMethods.get(ProjectAuthMethodId.Emailotp) ?? null
},
{
label: 'Anonymous',
- method: MethodId.Anonymous,
- value: authMethods.get(MethodId.Anonymous) ?? null
+ method: ProjectAuthMethodId.Anonymous,
+ value: authMethods.get(ProjectAuthMethodId.Anonymous) ?? null
},
{
label: 'Team Invites',
- method: MethodId.Invites,
- value: authMethods.get(MethodId.Invites) ?? null
+ method: ProjectAuthMethodId.Invites,
+ value: authMethods.get(ProjectAuthMethodId.Invites) ?? null
},
{
label: 'JWT',
- method: MethodId.Jwt,
- value: authMethods.get(MethodId.Jwt) ?? null
+ method: ProjectAuthMethodId.Jwt,
+ value: authMethods.get(ProjectAuthMethodId.Jwt) ?? null
}
];
};
diff --git a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte
index 029effce65..54c8d2c021 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte
@@ -10,7 +10,7 @@
import { addNotification } from '$lib/stores/notifications';
import { oAuthProviders } from '$lib/stores/oauth-providers';
import { sdk } from '$lib/stores/sdk';
- import { ProjectAuthMethodId as MethodId } from '@appwrite.io/console';
+ import { ProjectAuthMethodId } from '@appwrite.io/console';
import { base } from '$app/paths';
import {
Avatar,
@@ -39,7 +39,7 @@
let isUpdatingAllAuthMethods = $state(false);
let showUpdateAuthMethodsDialog = $state(false);
let updateAuthMethodsEnabledMode = $state(null);
- let apiAuthMethodUpdates = new SvelteSet();
+ let apiAuthMethodUpdates = new SvelteSet();
const isAnyAuthMethodUpdating = $derived(apiAuthMethodUpdates.size > 0);
const isAnyUpdateInProgress = $derived(isUpdatingAllAuthMethods || isAnyAuthMethodUpdating);
From 20db8af61d9f874c277e5a2524e4b023038c18f6 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 12:32:36 +0530
Subject: [PATCH 027/320] use projectcreationdisabled
---
src/routes/(console)/organization-[organization]/+page.svelte | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/routes/(console)/organization-[organization]/+page.svelte b/src/routes/(console)/organization-[organization]/+page.svelte
index 0a7b4308cb..37687d65cb 100644
--- a/src/routes/(console)/organization-[organization]/+page.svelte
+++ b/src/routes/(console)/organization-[organization]/+page.svelte
@@ -86,7 +86,7 @@
}
function handleCreateProject() {
- if (!$canWriteProjects) return;
+ if (projectCreationDisabled) return;
if (isCloud) showCreateProjectCloud = true;
else showCreate = true;
}
From 316468c796beadf61759c142cc49bc24b1f4c93a Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 12:36:49 +0530
Subject: [PATCH 028/320] Project no longer has platforms
---
.../organization-[organization]/+page.svelte | 12 ++--------
.../organization-[organization]/+page.ts | 23 ++++++++++---------
2 files changed, 14 insertions(+), 21 deletions(-)
diff --git a/src/routes/(console)/organization-[organization]/+page.svelte b/src/routes/(console)/organization-[organization]/+page.svelte
index 37687d65cb..044e88d0bd 100644
--- a/src/routes/(console)/organization-[organization]/+page.svelte
+++ b/src/routes/(console)/organization-[organization]/+page.svelte
@@ -250,16 +250,8 @@
offset={data.offset}
on:click={handleCreateProject}>
{#each data.projects.projects as project}
- {@const projectPlatforms =
- (
- project as Models.Project & {
- platforms: Array<{ type: string }>;
- platformsTotal?: number;
- }
- ).platforms ?? []}
- {@const platformsTotal =
- (project as Models.Project & { platformsTotal?: number }).platformsTotal ??
- projectPlatforms.length}
+ {@const projectPlatforms = project.platforms}
+ {@const platformsTotal = project.platformsTotal}
{@const platforms = filterPlatforms(
projectPlatforms.map((platform) => getPlatformInfo(platform.type))
)}
diff --git a/src/routes/(console)/organization-[organization]/+page.ts b/src/routes/(console)/organization-[organization]/+page.ts
index eb6f9990be..926d2708ef 100644
--- a/src/routes/(console)/organization-[organization]/+page.ts
+++ b/src/routes/(console)/organization-[organization]/+page.ts
@@ -1,4 +1,4 @@
-import { Query, type Models } from '@appwrite.io/console';
+import { Query } from '@appwrite.io/console';
import { isCloud } from '$lib/system';
import { sdk } from '$lib/stores/sdk';
import { getLimit, getPage, getSearch, pageToOffset } from '$lib/helpers/load';
@@ -43,20 +43,18 @@ export const load: PageLoad = async ({ params, url, route, depends, parent }) =>
]
});
- await Promise.all(
+ const projects = await Promise.all(
activeProjects.projects.map(async (project) => {
project.region ??= 'default';
const platformList = await sdk
.forProject(project.region, project.$id)
.project.listPlatforms({ queries: [Query.limit(3)] });
- (
- project as Models.Project & {
- platforms: Array<{ type: string }>;
- platformsTotal: number;
- }
- ).platforms = platformList.platforms;
- (project as Models.Project & { platformsTotal: number }).platformsTotal =
- platformList.total;
+
+ return {
+ ...project,
+ platforms: platformList.platforms,
+ platformsTotal: platformList.total
+ };
})
);
@@ -64,6 +62,9 @@ export const load: PageLoad = async ({ params, url, route, depends, parent }) =>
limit,
offset,
search,
- projects: activeProjects
+ projects: {
+ ...activeProjects,
+ projects
+ }
};
};
From e2a0a84ee854fe8e23856fd833d8f219dc2d06eb Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 13:01:57 +0530
Subject: [PATCH 029/320] list policies
---
.../auth/security/+page.ts | 88 +++++++++----------
.../security/updateSignupEmailSecurity.svelte | 42 +++++----
2 files changed, 66 insertions(+), 64 deletions(-)
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/security/+page.ts
index 5889c60075..b8fb7a234f 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/+page.ts
@@ -14,56 +14,52 @@ const ProjectEmailPolicyId = {
DenyFreeEmail: 'deny-free-email'
} as const;
+type ProjectPolicy = Models.PolicyList['policies'][number] | EnabledPolicy;
+type EmailPolicyId = (typeof ProjectEmailPolicyId)[keyof typeof ProjectEmailPolicyId];
+
+const getDefaultEnabledPolicy = (policyId: EmailPolicyId): EnabledPolicy => ({
+ $id: policyId,
+ enabled: false
+});
+
export const load: PageLoad = async ({ depends, params }) => {
depends(Dependencies.PROJECT);
- const projectSdk = sdk.forProject(params.region, params.project).project;
- const [
- membershipPrivacyPolicy,
- passwordDictionaryPolicy,
- passwordHistoryPolicy,
- passwordPersonalDataPolicy,
- sessionAlertPolicy,
- sessionDurationPolicy,
- sessionInvalidationPolicy,
- sessionLimitPolicy,
- userLimitPolicy,
- denyAliasedEmailPolicy,
- denyDisposableEmailPolicy,
- denyFreeEmailPolicy
- ] = await Promise.all([
- projectSdk.getPolicy({ policyId: ProjectPolicyId.Membershipprivacy }),
- projectSdk.getPolicy({ policyId: ProjectPolicyId.Passworddictionary }),
- projectSdk.getPolicy({ policyId: ProjectPolicyId.Passwordhistory }),
- projectSdk.getPolicy({ policyId: ProjectPolicyId.Passwordpersonaldata }),
- projectSdk.getPolicy({ policyId: ProjectPolicyId.Sessionalert }),
- projectSdk.getPolicy({ policyId: ProjectPolicyId.Sessionduration }),
- projectSdk.getPolicy({ policyId: ProjectPolicyId.Sessioninvalidation }),
- projectSdk.getPolicy({ policyId: ProjectPolicyId.Sessionlimit }),
- projectSdk.getPolicy({ policyId: ProjectPolicyId.Userlimit }),
- projectSdk.getPolicy({
- policyId: ProjectEmailPolicyId.DenyAliasedEmail as ProjectPolicyId
- }),
- projectSdk.getPolicy({
- policyId: ProjectEmailPolicyId.DenyDisposableEmail as ProjectPolicyId
- }),
- projectSdk.getPolicy({
- policyId: ProjectEmailPolicyId.DenyFreeEmail as ProjectPolicyId
- })
- ]);
+ const { policies } = await sdk.forProject(params.region, params.project).project.listPolicies();
+ const policiesById = Object.fromEntries(
+ (policies as ProjectPolicy[]).map((policy) => [policy.$id, policy])
+ ) as Partial>;
return {
- membershipPrivacyPolicy: membershipPrivacyPolicy as Models.PolicyMembershipPrivacy,
- passwordDictionaryPolicy: passwordDictionaryPolicy as Models.PolicyPasswordDictionary,
- passwordHistoryPolicy: passwordHistoryPolicy as Models.PolicyPasswordHistory,
- passwordPersonalDataPolicy: passwordPersonalDataPolicy as Models.PolicyPasswordPersonalData,
- sessionAlertPolicy: sessionAlertPolicy as Models.PolicySessionAlert,
- sessionDurationPolicy: sessionDurationPolicy as Models.PolicySessionDuration,
- sessionInvalidationPolicy: sessionInvalidationPolicy as Models.PolicySessionInvalidation,
- sessionLimitPolicy: sessionLimitPolicy as Models.PolicySessionLimit,
- userLimitPolicy: userLimitPolicy as Models.PolicyUserLimit,
- denyAliasedEmailPolicy: denyAliasedEmailPolicy as EnabledPolicy,
- denyDisposableEmailPolicy: denyDisposableEmailPolicy as EnabledPolicy,
- denyFreeEmailPolicy: denyFreeEmailPolicy as EnabledPolicy
+ membershipPrivacyPolicy: policiesById[
+ ProjectPolicyId.Membershipprivacy
+ ] as Models.PolicyMembershipPrivacy,
+ passwordDictionaryPolicy: policiesById[
+ ProjectPolicyId.Passworddictionary
+ ] as Models.PolicyPasswordDictionary,
+ passwordHistoryPolicy: policiesById[
+ ProjectPolicyId.Passwordhistory
+ ] as Models.PolicyPasswordHistory,
+ passwordPersonalDataPolicy: policiesById[
+ ProjectPolicyId.Passwordpersonaldata
+ ] as Models.PolicyPasswordPersonalData,
+ sessionAlertPolicy: policiesById[ProjectPolicyId.Sessionalert] as Models.PolicySessionAlert,
+ sessionDurationPolicy: policiesById[
+ ProjectPolicyId.Sessionduration
+ ] as Models.PolicySessionDuration,
+ sessionInvalidationPolicy: policiesById[
+ ProjectPolicyId.Sessioninvalidation
+ ] as Models.PolicySessionInvalidation,
+ sessionLimitPolicy: policiesById[ProjectPolicyId.Sessionlimit] as Models.PolicySessionLimit,
+ userLimitPolicy: policiesById[ProjectPolicyId.Userlimit] as Models.PolicyUserLimit,
+ denyAliasedEmailPolicy:
+ (policiesById[ProjectEmailPolicyId.DenyAliasedEmail] as EnabledPolicy) ??
+ getDefaultEnabledPolicy(ProjectEmailPolicyId.DenyAliasedEmail),
+ denyDisposableEmailPolicy:
+ (policiesById[ProjectEmailPolicyId.DenyDisposableEmail] as EnabledPolicy) ??
+ getDefaultEnabledPolicy(ProjectEmailPolicyId.DenyDisposableEmail),
+ denyFreeEmailPolicy:
+ (policiesById[ProjectEmailPolicyId.DenyFreeEmail] as EnabledPolicy) ??
+ getDefaultEnabledPolicy(ProjectEmailPolicyId.DenyFreeEmail)
};
};
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
index ff4d301beb..61c501f90c 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
@@ -52,23 +52,32 @@
try {
const projectSdk = sdk.forProject(project.region, project.$id).project;
- currentSubmit = Submit.AuthAliasedEmailsUpdate;
- await projectSdk.updateDenyAliasedEmailPolicy({
- enabled: authAliasedEmails
- });
- hasAppliedServerChange = true;
+ if (authAliasedEmails !== denyAliasedEmailPolicy.enabled) {
+ currentSubmit = Submit.AuthAliasedEmailsUpdate;
+ await projectSdk.updateDenyAliasedEmailPolicy({
+ enabled: authAliasedEmails
+ });
+ hasAppliedServerChange = true;
+ trackEvent(Submit.AuthAliasedEmailsUpdate);
+ }
- currentSubmit = Submit.AuthDisposableEmailsUpdate;
- await projectSdk.updateDenyDisposableEmailPolicy({
- enabled: authDisposableEmails
- });
- hasAppliedServerChange = true;
+ if (authDisposableEmails !== denyDisposableEmailPolicy.enabled) {
+ currentSubmit = Submit.AuthDisposableEmailsUpdate;
+ await projectSdk.updateDenyDisposableEmailPolicy({
+ enabled: authDisposableEmails
+ });
+ hasAppliedServerChange = true;
+ trackEvent(Submit.AuthDisposableEmailsUpdate);
+ }
- currentSubmit = Submit.AuthFreeEmailsUpdate;
- await projectSdk.updateDenyFreeEmailPolicy({
- enabled: authFreeEmails
- });
- hasAppliedServerChange = true;
+ if (authFreeEmails !== denyFreeEmailPolicy.enabled) {
+ currentSubmit = Submit.AuthFreeEmailsUpdate;
+ await projectSdk.updateDenyFreeEmailPolicy({
+ enabled: authFreeEmails
+ });
+ hasAppliedServerChange = true;
+ trackEvent(Submit.AuthFreeEmailsUpdate);
+ }
await invalidate(Dependencies.PROJECT);
@@ -76,9 +85,6 @@
type: 'success',
message: 'Updated signup email security settings.'
});
- trackEvent(Submit.AuthAliasedEmailsUpdate);
- trackEvent(Submit.AuthDisposableEmailsUpdate);
- trackEvent(Submit.AuthFreeEmailsUpdate);
} catch (error) {
if (hasAppliedServerChange) {
await invalidate(Dependencies.PROJECT);
From 5a89912add7de7605611ee5bdd4fc9a3698cc524 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 13:05:34 +0530
Subject: [PATCH 030/320] fix projectProtocolID
---
src/lib/stores/project-protocols.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lib/stores/project-protocols.ts b/src/lib/stores/project-protocols.ts
index 91d82a1f18..1bab3701ef 100644
--- a/src/lib/stores/project-protocols.ts
+++ b/src/lib/stores/project-protocols.ts
@@ -1,5 +1,5 @@
import { writable } from 'svelte/store';
-import { ProjectProtocolId as ProjectProtocolId, type Models } from '@appwrite.io/console';
+import { ProjectProtocolId, type Models } from '@appwrite.io/console';
export type Protocol = {
label: string;
From e01d05cd45e926d84efb5f3cc8b096915970ba70 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 13:08:21 +0530
Subject: [PATCH 031/320] same fix
---
src/lib/stores/project-services.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lib/stores/project-services.ts b/src/lib/stores/project-services.ts
index 74ebff6add..20d38f0781 100644
--- a/src/lib/stores/project-services.ts
+++ b/src/lib/stores/project-services.ts
@@ -1,5 +1,5 @@
import { writable } from 'svelte/store';
-import { ProjectServiceId as ProjectServiceId, type Models } from '@appwrite.io/console';
+import { ProjectServiceId, type Models } from '@appwrite.io/console';
export type Service = {
label: string;
From dd6b6c8da72872d691040f60a5a988d6b3cfe66c Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 13:33:22 +0530
Subject: [PATCH 032/320] remove type
---
.../auth/settings/+page.ts | 34 +++----------------
.../auth/updateOAuth.ts | 18 +++++-----
2 files changed, 13 insertions(+), 39 deletions(-)
diff --git a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts
index 8a22304400..5b95fd590a 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts
@@ -5,23 +5,6 @@ import type { Models as ConsoleModels } from '@appwrite.io/console';
import type { PageLoad } from './$types';
import type { AuthProvider } from '../updateOAuth';
-/** Extract the appId equivalent from a typed OAuth2 provider model. */
-function extractAppId(p: Record): string {
- return (p['clientId'] ??
- p['appId'] ??
- p['oauthClientId'] ??
- p['oauth2ClientId'] ??
- p['applicationId'] ??
- p['serviceId'] ??
- p['apiKey'] ??
- p['publicKey'] ??
- p['appKey'] ??
- p['keyString'] ??
- p['customerKey'] ??
- p['key'] ??
- '') as string;
-}
-
export const load: PageLoad = async ({ depends, params }) => {
depends(Dependencies.PROJECT);
@@ -37,18 +20,11 @@ export const load: PageLoad = async ({ depends, params }) => {
const oauthProviders: AuthProvider[] = providerList.providers
.filter((p) => p.$id !== 'mock')
- .map((p) => {
- const raw = p as unknown as Record;
- return {
- ...raw,
- $id: p.$id,
- key: p.$id,
- name: oAuthProviders[p.$id]?.name ?? p.$id,
- appId: extractAppId(raw),
- secret: '',
- enabled: p.enabled
- };
- });
+ .map((p) => ({
+ ...p,
+ key: p.$id,
+ name: oAuthProviders[p.$id]?.name ?? p.$id
+ }));
return { oauthProviders, consoleParamsMap };
};
diff --git a/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts b/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts
index 9694a89376..59d50a55bc 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts
+++ b/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts
@@ -4,23 +4,21 @@ import { Dependencies } from '$lib/constants';
import { isValueOfStringEnum } from '$lib/helpers/types';
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
-import { OAuthProvider } from '@appwrite.io/console';
+import { OAuthProvider, type Models as ConsoleModels } from '@appwrite.io/console';
-export type AuthProvider = {
- $id: string;
- key: string;
+type ProjectOAuthProvider = ConsoleModels.OAuth2ProviderList['providers'][number];
+
+export type AuthProvider = ProjectOAuthProvider & {
+ key: ProjectOAuthProvider['$id'];
name: string;
- appId: string;
- secret: string;
- enabled: boolean;
-} & Record;
+};
type Args = {
region: string;
projectId: string;
provider: AuthProvider;
appId: string | null;
- secret: string;
+ secret: string | null;
details: Record;
enabled: boolean;
};
@@ -30,7 +28,7 @@ type Return = {
message?: string;
};
-function parseSecret(secret: string) {
+function parseSecret(secret: string | null) {
if (!secret) return {};
try {
From f95ce503af21bf8ab1a6684dffd097eaa0ecd418 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 13:44:05 +0530
Subject: [PATCH 033/320] more fixes
---
.../project-[region]-[project]/+layout.ts | 7 ++-
.../overview/(components)/create.svelte | 8 ++--
.../overview/(components)/keyDetails.svelte | 10 ++--
.../settings/migrations/+page.svelte | 36 +++++++--------
.../settings/migrations/exportModal.svelte | 46 +++++++++----------
5 files changed, 53 insertions(+), 54 deletions(-)
diff --git a/src/routes/(console)/project-[region]-[project]/+layout.ts b/src/routes/(console)/project-[region]-[project]/+layout.ts
index fedac9d430..7717597ee1 100644
--- a/src/routes/(console)/project-[region]-[project]/+layout.ts
+++ b/src/routes/(console)/project-[region]-[project]/+layout.ts
@@ -41,7 +41,7 @@ export const load: LayoutLoad = async ({ params, depends, parent }) => {
// organization can be null if not in the filtered list!
const includedInBasePlans = plansInfo.has(organization?.billingPlanId);
- const [org, rawRegionalConsoleVariables, rolesResult, , platformList, keyList] =
+ const [org, rawRegionalConsoleVariables, rolesResult, platformList, keyList] =
await Promise.all([
!organization
? // TODO: @itznotabug - teams.get with Models.Organization?
@@ -55,10 +55,9 @@ export const load: LayoutLoad = async ({ params, depends, parent }) => {
organizationId: project.teamId
})
: null,
-
- loadAvailableRegions(project.teamId),
projectSdk.listPlatforms({ queries: [Query.limit(1)] }),
- projectSdk.listKeys({ queries: [Query.limit(1)] })
+ projectSdk.listKeys({ queries: [Query.limit(1)] }),
+ loadAvailableRegions(project.teamId)
]);
const regionalConsoleVariables = normalizeConsoleVariables(rawRegionalConsoleVariables);
diff --git a/src/routes/(console)/project-[region]-[project]/overview/(components)/create.svelte b/src/routes/(console)/project-[region]-[project]/overview/(components)/create.svelte
index a75d2f90bf..67c5549798 100644
--- a/src/routes/(console)/project-[region]-[project]/overview/(components)/create.svelte
+++ b/src/routes/(console)/project-[region]-[project]/overview/(components)/create.svelte
@@ -13,8 +13,8 @@
import { Submit, trackError, trackEvent } from '$lib/actions/analytics';
import { addNotification } from '$lib/stores/notifications';
import { writable } from 'svelte/store';
- import Scopes from '../api-keys/scopes.svelte';
- import { ID, type ProjectKeyScopes as ScopesType } from '@appwrite.io/console';
+ import ScopesSelector from '../api-keys/scopes.svelte';
+ import { ID, type ProjectKeyScopes } from '@appwrite.io/console';
import { page } from '$app/state';
import { copy } from '$lib/helpers/copy';
@@ -22,7 +22,7 @@
let formComponent: Form;
let isSubmitting = writable(false);
- let scopes: ScopesType[] = [];
+ let scopes: ProjectKeyScopes[] = [];
let name = '';
let expire: string | null = null;
@@ -101,7 +101,7 @@
Choose which permission scopes to grant your application. It is best
practice to allow only the permissions you need to meet your project goals.
-
+
diff --git a/src/routes/(console)/project-[region]-[project]/overview/(components)/keyDetails.svelte b/src/routes/(console)/project-[region]-[project]/overview/(components)/keyDetails.svelte
index cc06f925cb..18f8861a1d 100644
--- a/src/routes/(console)/project-[region]-[project]/overview/(components)/keyDetails.svelte
+++ b/src/routes/(console)/project-[region]-[project]/overview/(components)/keyDetails.svelte
@@ -12,16 +12,16 @@
import { project } from '../../store';
import Delete from './delete.svelte';
import UpdateExpirationDate from './updateExpirationDate.svelte';
- import type { Models, ProjectKeyScopes as ScopesType } from '@appwrite.io/console';
+ import type { Models, ProjectKeyScopes } from '@appwrite.io/console';
import { symmetricDifference } from '$lib/helpers/array';
- import Scopes from '../api-keys/scopes.svelte';
+ import ScopesSelector from '../api-keys/scopes.svelte';
import { InteractiveText, Layout, Typography } from '@appwrite.io/pink-svelte';
export let key: Models.DevKey | Models.Key;
export let keyType: 'api' | 'dev' = 'api';
let name: string = null;
- let scopes: ScopesType[] = null;
+ let scopes: ProjectKeyScopes[] = null;
let showDelete = false;
const isApiKey = keyType === 'api';
@@ -32,7 +32,7 @@
onMount(() => {
name ??= key.name;
if (isApiKey) {
- scopes ??= (key as Models.Key).scopes as ScopesType[];
+ scopes ??= (key as Models.Key).scopes as ProjectKeyScopes[];
}
});
@@ -166,7 +166,7 @@
to allow only the permissions you need to meet your project goals.
{#if scopes !== null}
-
+
{/if}
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte
index ecf83bea29..fca01d2357 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte
@@ -14,7 +14,7 @@
import Details from './details.svelte';
import ExportModal from './exportModal.svelte';
import { readOnly } from '$lib/stores/billing';
- import { ID, ProjectKeyScopes as Scopes, type Models } from '@appwrite.io/console';
+ import { ID, ProjectKeyScopes, type Models } from '@appwrite.io/console';
import { canWriteProjects } from '$lib/stores/roles';
import {
IconCloud,
@@ -92,23 +92,23 @@
keyId: ID.unique(),
name: `[AUTO-GENERATED] Migration ${new Date().toISOString()}`,
scopes: [
- Scopes.UsersRead,
- Scopes.TeamsRead,
- Scopes.DatabasesRead,
- Scopes.CollectionsRead /* legacy */,
- Scopes.AttributesRead /* legacy */,
- Scopes.IndexesRead,
- Scopes.DocumentsRead /* legacy */,
- Scopes.TablesRead,
- Scopes.ColumnsRead,
- Scopes.RowsRead,
- Scopes.FilesRead,
- Scopes.BucketsRead,
- Scopes.FunctionsRead,
- Scopes.ExecutionsRead,
- Scopes.LocaleRead,
- Scopes.AvatarsRead,
- Scopes.HealthRead
+ ProjectKeyScopes.UsersRead,
+ ProjectKeyScopes.TeamsRead,
+ ProjectKeyScopes.DatabasesRead,
+ ProjectKeyScopes.CollectionsRead /* legacy */,
+ ProjectKeyScopes.AttributesRead /* legacy */,
+ ProjectKeyScopes.IndexesRead,
+ ProjectKeyScopes.DocumentsRead /* legacy */,
+ ProjectKeyScopes.TablesRead,
+ ProjectKeyScopes.ColumnsRead,
+ ProjectKeyScopes.RowsRead,
+ ProjectKeyScopes.FilesRead,
+ ProjectKeyScopes.BucketsRead,
+ ProjectKeyScopes.FunctionsRead,
+ ProjectKeyScopes.ExecutionsRead,
+ ProjectKeyScopes.LocaleRead,
+ ProjectKeyScopes.AvatarsRead,
+ ProjectKeyScopes.HealthRead
]
});
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte
index 758faca835..879d838efc 100644
--- a/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte
@@ -10,7 +10,7 @@
import { sdk } from '$lib/stores/sdk';
import { user } from '$lib/stores/user';
import { organization } from '$lib/stores/organization';
- import { ID, ProjectKeyScopes as Scopes } from '@appwrite.io/console';
+ import { ID, ProjectKeyScopes } from '@appwrite.io/console';
export let show = false;
@@ -94,28 +94,28 @@
keyId: ID.unique(),
name: `[AUTO-GENERATED] Migration ${new Date().toISOString()}`,
scopes: [
- Scopes.UsersRead,
- Scopes.TeamsRead,
- Scopes.DatabasesRead,
- Scopes.CollectionsRead /* legacy */,
- Scopes.AttributesRead /* legacy */,
- Scopes.IndexesRead,
- Scopes.DocumentsRead /* legacy */,
- Scopes.TablesRead,
- Scopes.ColumnsRead,
- Scopes.RowsRead,
- Scopes.FilesRead,
- Scopes.BucketsRead,
- Scopes.FunctionsRead,
- Scopes.ExecutionsRead,
- Scopes.SitesRead,
- Scopes.ProvidersRead,
- Scopes.TopicsRead,
- Scopes.SubscribersRead,
- Scopes.MessagesRead,
- Scopes.LocaleRead,
- Scopes.AvatarsRead,
- Scopes.HealthRead
+ ProjectKeyScopes.UsersRead,
+ ProjectKeyScopes.TeamsRead,
+ ProjectKeyScopes.DatabasesRead,
+ ProjectKeyScopes.CollectionsRead /* legacy */,
+ ProjectKeyScopes.AttributesRead /* legacy */,
+ ProjectKeyScopes.IndexesRead,
+ ProjectKeyScopes.DocumentsRead /* legacy */,
+ ProjectKeyScopes.TablesRead,
+ ProjectKeyScopes.ColumnsRead,
+ ProjectKeyScopes.RowsRead,
+ ProjectKeyScopes.FilesRead,
+ ProjectKeyScopes.BucketsRead,
+ ProjectKeyScopes.FunctionsRead,
+ ProjectKeyScopes.ExecutionsRead,
+ ProjectKeyScopes.SitesRead,
+ ProjectKeyScopes.ProvidersRead,
+ ProjectKeyScopes.TopicsRead,
+ ProjectKeyScopes.SubscribersRead,
+ ProjectKeyScopes.MessagesRead,
+ ProjectKeyScopes.LocaleRead,
+ ProjectKeyScopes.AvatarsRead,
+ ProjectKeyScopes.HealthRead
]
});
From 5ee037a0b8e0515692cc784215031401b9b17773 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Wed, 13 May 2026 18:05:47 +0530
Subject: [PATCH 034/320] fix: button state
---
.../security/updateSignupEmailSecurity.svelte | 34 +++++++++++--------
1 file changed, 19 insertions(+), 15 deletions(-)
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
index 61c501f90c..de5c1d4cd0 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
@@ -8,7 +8,6 @@
import { sdk } from '$lib/stores/sdk';
import { Layout, Typography } from '@appwrite.io/pink-svelte';
import type { Models } from '@appwrite.io/console';
- import { onMount } from 'svelte';
type EnabledPolicy = {
$id: string;
@@ -27,20 +26,22 @@
denyFreeEmailPolicy: EnabledPolicy;
} = $props();
- let authAliasedEmails = $state(false);
- let authDisposableEmails = $state(false);
- let authFreeEmails = $state(false);
+ const getInitialAliasedEmails = () => denyAliasedEmailPolicy.enabled;
+ const getInitialDisposableEmails = () => denyDisposableEmailPolicy.enabled;
+ const getInitialFreeEmails = () => denyFreeEmailPolicy.enabled;
- onMount(() => {
- authAliasedEmails = denyAliasedEmailPolicy.enabled;
- authDisposableEmails = denyDisposableEmailPolicy.enabled;
- authFreeEmails = denyFreeEmailPolicy.enabled;
- });
+ let savedAliasedEmails = $state(getInitialAliasedEmails());
+ let savedDisposableEmails = $state(getInitialDisposableEmails());
+ let savedFreeEmails = $state(getInitialFreeEmails());
+
+ let authAliasedEmails = $state(getInitialAliasedEmails());
+ let authDisposableEmails = $state(getInitialDisposableEmails());
+ let authFreeEmails = $state(getInitialFreeEmails());
const hasChanges = $derived.by(() => {
- const aliasedChanged = authAliasedEmails !== denyAliasedEmailPolicy.enabled;
- const disposableChanged = authDisposableEmails !== denyDisposableEmailPolicy.enabled;
- const freeChanged = authFreeEmails !== denyFreeEmailPolicy.enabled;
+ const aliasedChanged = authAliasedEmails !== savedAliasedEmails;
+ const disposableChanged = authDisposableEmails !== savedDisposableEmails;
+ const freeChanged = authFreeEmails !== savedFreeEmails;
return aliasedChanged || disposableChanged || freeChanged;
});
@@ -52,7 +53,7 @@
try {
const projectSdk = sdk.forProject(project.region, project.$id).project;
- if (authAliasedEmails !== denyAliasedEmailPolicy.enabled) {
+ if (authAliasedEmails !== savedAliasedEmails) {
currentSubmit = Submit.AuthAliasedEmailsUpdate;
await projectSdk.updateDenyAliasedEmailPolicy({
enabled: authAliasedEmails
@@ -61,7 +62,7 @@
trackEvent(Submit.AuthAliasedEmailsUpdate);
}
- if (authDisposableEmails !== denyDisposableEmailPolicy.enabled) {
+ if (authDisposableEmails !== savedDisposableEmails) {
currentSubmit = Submit.AuthDisposableEmailsUpdate;
await projectSdk.updateDenyDisposableEmailPolicy({
enabled: authDisposableEmails
@@ -70,7 +71,7 @@
trackEvent(Submit.AuthDisposableEmailsUpdate);
}
- if (authFreeEmails !== denyFreeEmailPolicy.enabled) {
+ if (authFreeEmails !== savedFreeEmails) {
currentSubmit = Submit.AuthFreeEmailsUpdate;
await projectSdk.updateDenyFreeEmailPolicy({
enabled: authFreeEmails
@@ -79,6 +80,9 @@
trackEvent(Submit.AuthFreeEmailsUpdate);
}
+ savedAliasedEmails = authAliasedEmails;
+ savedDisposableEmails = authDisposableEmails;
+ savedFreeEmails = authFreeEmails;
await invalidate(Dependencies.PROJECT);
addNotification({
From 13781d152a07573d908203cba0356145d29fc78b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matej=20Ba=C4=8Do?=
Date: Wed, 13 May 2026 16:45:51 +0200
Subject: [PATCH 035/320] Improve email policies copy
---
.../security/updateSignupEmailSecurity.svelte | 34 +++++++------------
1 file changed, 12 insertions(+), 22 deletions(-)
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
index de5c1d4cd0..433928ccd7 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
@@ -106,21 +106,15 @@
Email policies
- Control which email addresses can be used for signups and email updates. This does not affect
- existing sign-ins.
+ Control which email addresses can be used for user creation and email updates. This does not affect
+ session creation.
-
+
Only allow email addresses from custom domains.
-
- Examples: gmail.com , yahoo.com , outlook.com
+ >Block email addresses of free email providers. For example: user@gmail.com
@@ -129,15 +123,13 @@
+ label="Deny aliased emails">
- Disallow aliases, tags, and provider-specific email variations.
-
-
- Examples: jane+team@gmail.com , jane.smith@gmail.com
+ Block emails with aliases, tags, subaddresses, or any other
+ provider-specific email variations. For example: user+folder1@gmail.com
@@ -146,14 +138,12 @@
+ label="Deny disposable emails">
Disallow temporary and disposable email providers.
-
- Examples: mailinator.com , 10minutemail.com
+ >Block temporary and disposable email providers. For example: alex9734@mailinator.com
From 67da40e12af9b84b1016dd2b439d7f6ee3cdc6f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matej=20Ba=C4=8Do?=
Date: Wed, 13 May 2026 16:50:34 +0200
Subject: [PATCH 036/320] Improve copy
---
.../auth/security/updateSignupEmailSecurity.svelte | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
index 433928ccd7..35633cb7c0 100644
--- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
+++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSignupEmailSecurity.svelte
@@ -107,7 +107,7 @@
Email policies
Control which email addresses can be used for user creation and email updates. This does not affect
- session creation.
+ session creation (sign in)
From 51ad75657a5d726044806e67ecbe7d19f9e58983 Mon Sep 17 00:00:00 2001
From: Damodar Lohani
Date: Sun, 17 May 2026 03:53:03 +0000
Subject: [PATCH 037/320] fix: rename Models.Locale to Models.CloudLocale after
SDK bump
The console SDK bump in this PR renamed Locale to CloudLocale,
breaking svelte-check with 7 errors across billing/Soc2/address
components.
---
src/routes/(console)/account/payments/addressModal.svelte | 2 +-
src/routes/(console)/account/payments/billingAddress.svelte | 2 +-
src/routes/(console)/account/payments/editAddressModal.svelte | 2 +-
.../organization-[organization]/billing/billingAddress.svelte | 2 +-
.../organization-[organization]/billing/replaceAddress.svelte | 2 +-
.../(console)/organization-[organization]/settings/Soc2.svelte | 2 +-
.../organization-[organization]/settings/Soc2Modal.svelte | 2 +-
7 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/routes/(console)/account/payments/addressModal.svelte b/src/routes/(console)/account/payments/addressModal.svelte
index 57ea22c101..af186cb103 100644
--- a/src/routes/(console)/account/payments/addressModal.svelte
+++ b/src/routes/(console)/account/payments/addressModal.svelte
@@ -10,7 +10,7 @@
import type { Models } from '@appwrite.io/console';
export let show = false;
- export let locale: Models.Locale;
+ export let locale: Models.CloudLocale;
export let organization: string = null;
export let countryList: Models.CountryList;
diff --git a/src/routes/(console)/account/payments/billingAddress.svelte b/src/routes/(console)/account/payments/billingAddress.svelte
index 5e9b888376..703ad7e902 100644
--- a/src/routes/(console)/account/payments/billingAddress.svelte
+++ b/src/routes/(console)/account/payments/billingAddress.svelte
@@ -29,7 +29,7 @@
export let data: PageData;
- const locale: Models.Locale = data.locale;
+ const locale: Models.CloudLocale = data.locale;
const countryList: Models.CountryList = data.countryList;
let show = false;
diff --git a/src/routes/(console)/account/payments/editAddressModal.svelte b/src/routes/(console)/account/payments/editAddressModal.svelte
index 891b65103f..0fc1fdad9a 100644
--- a/src/routes/(console)/account/payments/editAddressModal.svelte
+++ b/src/routes/(console)/account/payments/editAddressModal.svelte
@@ -10,7 +10,7 @@
import type { Models } from '@appwrite.io/console';
export let show = false;
- export let locale: Models.Locale;
+ export let locale: Models.CloudLocale;
export let countryList: Models.CountryList;
export let selectedAddress: Models.BillingAddress;
diff --git a/src/routes/(console)/organization-[organization]/billing/billingAddress.svelte b/src/routes/(console)/organization-[organization]/billing/billingAddress.svelte
index ebecd52319..6dbc5bfabb 100644
--- a/src/routes/(console)/organization-[organization]/billing/billingAddress.svelte
+++ b/src/routes/(console)/organization-[organization]/billing/billingAddress.svelte
@@ -22,7 +22,7 @@
} from '@appwrite.io/pink-icons-svelte';
import type { Models } from '@appwrite.io/console';
- export let locale: Models.Locale;
+ export let locale: Models.CloudLocale;
export let countryList: Models.CountryList;
export let organization: Models.Organization;
export let billingAddress: Models.BillingAddress;
diff --git a/src/routes/(console)/organization-[organization]/billing/replaceAddress.svelte b/src/routes/(console)/organization-[organization]/billing/replaceAddress.svelte
index 56798f55b3..926f21319e 100644
--- a/src/routes/(console)/organization-[organization]/billing/replaceAddress.svelte
+++ b/src/routes/(console)/organization-[organization]/billing/replaceAddress.svelte
@@ -13,7 +13,7 @@
import type { Models } from '@appwrite.io/console';
export let show = false;
- export let locale: Models.Locale;
+ export let locale: Models.CloudLocale;
export let countryList: Models.CountryList;
let loading = true;
diff --git a/src/routes/(console)/organization-[organization]/settings/Soc2.svelte b/src/routes/(console)/organization-[organization]/settings/Soc2.svelte
index 167a802613..7d71dbd609 100644
--- a/src/routes/(console)/organization-[organization]/settings/Soc2.svelte
+++ b/src/routes/(console)/organization-[organization]/settings/Soc2.svelte
@@ -5,7 +5,7 @@
import type { Models } from '@appwrite.io/console';
let show = false;
- export let locale: Models.Locale;
+ export let locale: Models.CloudLocale;
export let countryList: Models.CountryList;
diff --git a/src/routes/(console)/organization-[organization]/settings/Soc2Modal.svelte b/src/routes/(console)/organization-[organization]/settings/Soc2Modal.svelte
index c4b3b645d1..34331de126 100644
--- a/src/routes/(console)/organization-[organization]/settings/Soc2Modal.svelte
+++ b/src/routes/(console)/organization-[organization]/settings/Soc2Modal.svelte
@@ -11,7 +11,7 @@
import type { Models } from '@appwrite.io/console';
export let show = false;
- export let locale: Models.Locale;
+ export let locale: Models.CloudLocale;
export let countryList: Models.CountryList;
let email = '';
From 41aca21b710703a39b09a693fcac246149e7b894 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Mon, 18 May 2026 11:14:25 +0530
Subject: [PATCH 038/320] fix: add impersonation params to resource urls
---
src/lib/appwrite/impersonation.ts | 27 ++++++++++++++-
.../billing/alerts/paymentAuthRequired.svelte | 11 +++++--
src/lib/components/filePicker.svelte | 19 +++++------
.../billing/paymentHistory.svelte | 11 +++++--
.../billing/retryPaymentModal.svelte | 13 +++++---
.../invoices/[invoiceId]/download/+page.ts | 5 ++-
.../invoices/[invoiceId]/view/+page.ts | 5 ++-
.../settings/invoicesTable.svelte | 11 +++++--
.../functions/function-[function]/store.ts | 11 ++++---
.../(components)/deploymentActionMenu.svelte | 11 ++++---
.../sites/(components)/siteCard.svelte | 17 ++++++----
.../sites/grid.svelte | 17 ++++++----
.../storage/bucket-[bucket]/+page.svelte | 21 ++++++------
.../bucket-[bucket]/file-[file]/+page.svelte | 33 +++++++++++--------
14 files changed, 141 insertions(+), 71 deletions(-)
diff --git a/src/lib/appwrite/impersonation.ts b/src/lib/appwrite/impersonation.ts
index 9339a99249..9f8d6b45f1 100644
--- a/src/lib/appwrite/impersonation.ts
+++ b/src/lib/appwrite/impersonation.ts
@@ -1,4 +1,4 @@
-import { writable } from 'svelte/store';
+import { derived, writable } from 'svelte/store';
import { building } from '$app/environment';
const KEY_TARGET_USER_ID = 'console.impersonation.targetUserId';
@@ -82,6 +82,31 @@ export function readImpersonationTargetUserId(): string | null {
return sessionStorage.getItem(KEY_TARGET_USER_ID);
}
+export function createImpersonatedResourceUrl(
+ url: string,
+ queryParams: Record = {}
+): string {
+ const parsedUrl = new URL(url, globalThis.location?.origin);
+ const targetUserId = readImpersonationTargetUserId();
+
+ for (const [key, value] of Object.entries(queryParams)) {
+ if (value !== undefined) {
+ parsedUrl.searchParams.set(key, value.toString());
+ }
+ }
+
+ if (!targetUserId) return parsedUrl.toString();
+
+ parsedUrl.searchParams.set('impersonateUserId', targetUserId);
+
+ return parsedUrl.toString();
+}
+
+export const impersonatedResourceUrl = derived(
+ impersonationRevision,
+ () => createImpersonatedResourceUrl
+);
+
export function readOperatorSnapshot(): OperatorSnapshot | null {
if (building) return null;
const raw = sessionStorage.getItem(KEY_OPERATOR);
diff --git a/src/lib/components/billing/alerts/paymentAuthRequired.svelte b/src/lib/components/billing/alerts/paymentAuthRequired.svelte
index a67537ab0e..2d6955e19b 100644
--- a/src/lib/components/billing/alerts/paymentAuthRequired.svelte
+++ b/src/lib/components/billing/alerts/paymentAuthRequired.svelte
@@ -3,10 +3,17 @@
import { page } from '$app/state';
import { Button } from '$lib/elements/forms';
import { HeaderAlert } from '$lib/layout';
+ import { impersonatedResourceUrl } from '$lib/appwrite/impersonation';
import { actionRequiredInvoices, hideBillingHeaderRoutes } from '$lib/stores/billing';
import { organization } from '$lib/stores/organization';
import { getApiEndpoint } from '$lib/stores/sdk';
const endpoint = getApiEndpoint();
+
+ function invoiceUrl(invoiceId: string) {
+ return $impersonatedResourceUrl(
+ `${endpoint}/organizations/${$organization.$id}/invoices/${invoiceId}/view`
+ );
+ }
{#if $actionRequiredInvoices && $actionRequiredInvoices?.invoices?.length && !hideBillingHeaderRoutes.includes(page.url.pathname)}
@@ -14,9 +21,7 @@
Please authorize your upcoming payment for {$organization.name}. Your bank requires this
security measure to proceed with payment.
-
+
View invoice
{
if (page.url.searchParams.get('type') === 'validate-invoice') {
window.history.replaceState({}, '', page.url.pathname);
@@ -155,12 +162,12 @@
+ href={invoiceUrl(invoice.$id, 'view')}>
View invoice
+ href={invoiceUrl(invoice.$id, 'download')}>
Download PDF
{#if status === 'overdue' || status === 'failed' || status === 'abandoned'}
diff --git a/src/routes/(console)/organization-[organization]/billing/retryPaymentModal.svelte b/src/routes/(console)/organization-[organization]/billing/retryPaymentModal.svelte
index 9f351e2cb1..7b7964542a 100644
--- a/src/routes/(console)/organization-[organization]/billing/retryPaymentModal.svelte
+++ b/src/routes/(console)/organization-[organization]/billing/retryPaymentModal.svelte
@@ -20,6 +20,7 @@
import { getApiEndpoint, sdk } from '$lib/stores/sdk';
import { formatCurrency } from '$lib/helpers/numbers';
import { resolve } from '$app/paths';
+ import { impersonatedResourceUrl } from '$lib/appwrite/impersonation';
import type { PaymentMethod as StripePaymentMethod } from '@stripe/stripe-js';
import type { Models } from '@appwrite.io/console';
@@ -37,6 +38,12 @@
const endpoint = getApiEndpoint();
+ function invoiceUrl(invoiceId: string) {
+ return $impersonatedResourceUrl(
+ `${endpoint}/organizations/${page.params.organization}/invoices/${invoiceId}/view`
+ );
+ }
+
onMount(async () => {
if (!$organization.paymentMethodId && !$organization.backupPaymentMethodId) {
paymentMethodId = $paymentMethods?.total ? $paymentMethods.paymentMethods[0].$id : null;
@@ -173,11 +180,7 @@
)} has failed. Retry your payment to avoid service interruptions with your projects.
-
- View invoice
-
+ View invoice
{
return redirect(
302,
- `${endpoint}/organizations/${params.organization}/invoices/${invoice.$id}/download`
+ createImpersonatedResourceUrl(
+ `${endpoint}/organizations/${params.organization}/invoices/${invoice.$id}/download`
+ )
);
};
diff --git a/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/view/+page.ts b/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/view/+page.ts
index 3a4576785e..9351393ae1 100644
--- a/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/view/+page.ts
+++ b/src/routes/(console)/organization-[organization]/invoices/[invoiceId]/view/+page.ts
@@ -1,4 +1,5 @@
import { getApiEndpoint, sdk } from '$lib/stores/sdk';
+import { createImpersonatedResourceUrl } from '$lib/appwrite/impersonation';
import { redirect } from '@sveltejs/kit';
import type { PageLoad } from './$types';
@@ -13,6 +14,8 @@ export const load: PageLoad = async ({ params }) => {
return redirect(
302,
- `${endpoint}/organizations/${params.organization}/invoices/${invoice.$id}/view`
+ createImpersonatedResourceUrl(
+ `${endpoint}/organizations/${params.organization}/invoices/${invoice.$id}/view`
+ )
);
};
diff --git a/src/routes/(console)/organization-[organization]/settings/invoicesTable.svelte b/src/routes/(console)/organization-[organization]/settings/invoicesTable.svelte
index 514e8a575a..100c23554e 100644
--- a/src/routes/(console)/organization-[organization]/settings/invoicesTable.svelte
+++ b/src/routes/(console)/organization-[organization]/settings/invoicesTable.svelte
@@ -5,6 +5,7 @@
import { Button } from '$lib/elements/forms';
import { formatCurrency } from '$lib/helpers/numbers';
import { trackEvent } from '$lib/actions/analytics';
+ import { impersonatedResourceUrl } from '$lib/appwrite/impersonation';
import { ActionMenu, Badge, Icon, Link, Popover, Table } from '@appwrite.io/pink-svelte';
import {
IconDotsHorizontal,
@@ -24,6 +25,12 @@
$selectedInvoice = invoice;
$showRetryModal = true;
}
+
+ function invoiceUrl(invoiceId: string, action: 'view' | 'download') {
+ return $impersonatedResourceUrl(
+ `${endpoint}/organizations/${page.params.organization}/invoices/${invoiceId}/${action}`
+ );
+ }
+ href={invoiceUrl(invoice.$id, 'view')}>
View invoice
+ href={invoiceUrl(invoice.$id, 'download')}>
Download PDF
{#if status === 'overdue' || status === 'failed'}
diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/store.ts b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/store.ts
index 42bf293ced..3f320daf13 100644
--- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/store.ts
+++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/store.ts
@@ -3,6 +3,7 @@ import { DeploymentDownloadType, type Models } from '@appwrite.io/console';
import type { Column } from '$lib/helpers/types';
import { sdk } from '$lib/stores/sdk';
import { page } from '$app/stores';
+import { createImpersonatedResourceUrl } from '$lib/appwrite/impersonation';
export const func = derived(page, ($page) => $page.data.function as Models.Function);
export const deploymentList = derived(
@@ -150,22 +151,24 @@ export const columns = writable([
export function getOutputDownload(funcId: string, deploymentId: string) {
const p = get(page);
- return (
+ return createImpersonatedResourceUrl(
sdk.forProject(p.params.region, p.params.project).functions.getDeploymentDownload({
functionId: funcId,
deploymentId,
type: DeploymentDownloadType.Output
- }) + '&mode=admin'
+ }),
+ { mode: 'admin' }
);
}
export function getSourceDownload(funcId: string, deploymentId: string) {
const p = get(page);
- return (
+ return createImpersonatedResourceUrl(
sdk.forProject(p.params.region, p.params.project).functions.getDeploymentDownload({
functionId: funcId,
deploymentId,
type: DeploymentDownloadType.Source
- }) + '&mode=admin'
+ }),
+ { mode: 'admin' }
);
}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/(components)/deploymentActionMenu.svelte b/src/routes/(console)/project-[region]-[project]/sites/(components)/deploymentActionMenu.svelte
index c0190429db..d3b6e657fa 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/(components)/deploymentActionMenu.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/(components)/deploymentActionMenu.svelte
@@ -17,6 +17,7 @@
import { ActionMenu, Icon, Tooltip } from '@appwrite.io/pink-svelte';
import { getEffectiveBuildStatus } from '$lib/helpers/buildTimeout';
import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
+ import { impersonatedResourceUrl } from '$lib/appwrite/impersonation';
export let selectedDeployment: Models.Deployment;
export let deployment: Models.Deployment;
@@ -28,21 +29,23 @@
export let inCard = false;
function getOutputDownload(deploymentId: string) {
- return (
+ return $impersonatedResourceUrl(
sdk.forProject(page.params.region, page.params.project).sites.getDeploymentDownload({
siteId: page.params.site,
deploymentId: deploymentId,
type: DeploymentDownloadType.Output
- }) + '&mode=admin'
+ }),
+ { mode: 'admin' }
);
}
function getSourceDownload(deploymentId: string) {
- return (
+ return $impersonatedResourceUrl(
sdk.forProject(page.params.region, page.params.project).sites.getDeploymentDownload({
siteId: page.params.site,
deploymentId: deploymentId,
type: DeploymentDownloadType.Source
- }) + '&mode=admin'
+ }),
+ { mode: 'admin' }
);
}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte b/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte
index f852159000..294027c171 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte
@@ -27,6 +27,7 @@
import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
import { regionalProtocol } from '$routes/(console)/project-[region]-[project]/store';
import type { Snippet } from 'svelte';
+ import { impersonatedResourceUrl } from '$lib/appwrite/impersonation';
let {
site,
@@ -71,13 +72,15 @@
}
function getFilePreview(fileId: string) {
- return sdk.forConsoleIn(page.params.region).storage.getFilePreview({
- bucketId: 'screenshots',
- fileId,
- width: 1024,
- height: 576,
- output: ImageFormat.Avif
- });
+ return $impersonatedResourceUrl(
+ sdk.forConsoleIn(page.params.region).storage.getFilePreview({
+ bucketId: 'screenshots',
+ fileId,
+ width: 1024,
+ height: 576,
+ output: ImageFormat.Avif
+ })
+ );
}
diff --git a/src/routes/(console)/project-[region]-[project]/sites/grid.svelte b/src/routes/(console)/project-[region]-[project]/sites/grid.svelte
index 99029389ea..704c20a165 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/grid.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/grid.svelte
@@ -14,6 +14,7 @@
import { IconExclamation } from '@appwrite.io/pink-icons-svelte';
import { Link } from '$lib/elements';
import { getFrameworkIcon } from '$lib/stores/sites';
+ import { impersonatedResourceUrl } from '$lib/appwrite/impersonation';
export let siteList: Models.SiteList;
@@ -33,13 +34,15 @@
}
function getFilePreview(fileId: string) {
- return sdk.forConsoleIn(page.params.region).storage.getFilePreview({
- bucketId: 'screenshots',
- fileId,
- width: 1024,
- height: 576,
- output: ImageFormat.Avif
- });
+ return $impersonatedResourceUrl(
+ sdk.forConsoleIn(page.params.region).storage.getFilePreview({
+ bucketId: 'screenshots',
+ fileId,
+ width: 1024,
+ height: 576,
+ output: ImageFormat.Avif
+ })
+ );
}
diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte
index ef5988aeec..7e18d3e1f9 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte
@@ -34,6 +34,7 @@
import { isSmallViewport } from '$lib/stores/viewport';
import { ID } from '@appwrite.io/console';
import { addNotification } from '$lib/stores/notifications';
+ import { impersonatedResourceUrl } from '$lib/appwrite/impersonation';
import type { PageProps } from './$types';
const { data }: PageProps = $props();
@@ -44,17 +45,15 @@
let isDragging = $state(false);
function getPreview(fileId: string) {
- return (
- sdk
- .forProject(page.params.region, page.params.project)
- .storage.getFilePreview({
- bucketId: page.params.bucket,
- fileId,
- height: 128,
- width: 128,
- output: ImageFormat.Avif
- })
- .toString() + '&mode=admin'
+ return $impersonatedResourceUrl(
+ sdk.forProject(page.params.region, page.params.project).storage.getFilePreview({
+ bucketId: page.params.bucket,
+ fileId,
+ height: 128,
+ width: 128,
+ output: ImageFormat.Avif
+ }),
+ { mode: 'admin' }
);
}
diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte
index a940dc8f6f..557bed67ff 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/file-[file]/+page.svelte
@@ -38,6 +38,7 @@
import { ImageFormat, type Models } from '@appwrite.io/console';
import { isSmallViewport } from '$lib/stores/viewport';
import { Menu } from '$lib/components/menu';
+ import { impersonatedResourceUrl } from '$lib/appwrite/impersonation';
let showFileAlert = true;
@@ -50,33 +51,39 @@
let showCopyUrlModal = false;
let selectedFileToken: Models.ResourceToken | null = null;
- const getPreview = (fileId: string) =>
- sdk
- .forProject(page.params.region, page.params.project)
- .storage.getFilePreview({
+ function getPreview(fileId: string) {
+ return $impersonatedResourceUrl(
+ sdk.forProject(page.params.region, page.params.project).storage.getFilePreview({
bucketId: $file.bucketId,
fileId,
width: 640,
height: 300,
output: ImageFormat.Avif
- })
- .toString() + '&mode=admin';
- const getView = (fileId: string) =>
- sdk
- .forProject(page.params.region, page.params.project)
- .storage.getFileView({ bucketId: $file.bucketId, fileId })
- .toString() + '&mode=admin';
+ }),
+ { mode: 'admin' }
+ );
+ }
+
+ function getView(fileId: string) {
+ return $impersonatedResourceUrl(
+ sdk
+ .forProject(page.params.region, page.params.project)
+ .storage.getFileView({ bucketId: $file.bucketId, fileId }),
+ { mode: 'admin' }
+ );
+ }
$: if (filePermissions) {
arePermsDisabled = !symmetricDifference(filePermissions, $file.$permissions).length;
}
function downloadFile() {
- return (
+ return $impersonatedResourceUrl(
sdk
.forProject(page.params.region, page.params.project)
.storage.getFileDownload({ bucketId: $file.bucketId, fileId: $file.$id })
- .toString() + '&mode=admin'
+ .toString(),
+ { mode: 'admin' }
);
}
From b70adc86e715470768b4490fec5975195491d5a4 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Mon, 18 May 2026 11:24:24 +0530
Subject: [PATCH 039/320] fix: resolve codemirror editor type mismatch
---
.../(components)/editor/view.svelte | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/editor/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/editor/view.svelte
index 6c3432a643..bf53caa0b9 100644
--- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/editor/view.svelte
+++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/editor/view.svelte
@@ -20,6 +20,8 @@
lineNumbers,
highlightActiveLine,
highlightActiveLineGutter,
+ type Command,
+ type KeyBinding,
type ViewUpdate
} from '@codemirror/view';
import { history, undo } from '@codemirror/commands';
@@ -147,6 +149,8 @@
const wrapCompartment = new Compartment();
const readOnlyCompartment = new Compartment();
+ const unfoldAllCommand: Command = (view) => unfoldAll(view as never);
+ const foldAllCommand: Command = (view) => foldAll(view as never);
let tooltipMessage = $state('Copy document');
@@ -942,7 +946,7 @@
// JSON5 linter using the parse cache; preserves errorInPlace behavior.
async function json5Linter(view: EditorView): Promise {
if (isUpdatingFromEditor) return [];
- const result = await baseJson5Linter(view);
+ const result = await baseJson5Linter(view as never);
if (!result.length) {
errorMessage = null;
return [];
@@ -1198,17 +1202,17 @@
{
key: 'Mod-=',
preventDefault: true,
- run: unfoldAll
+ run: unfoldAllCommand
},
{
key: 'Mod-+',
preventDefault: true,
- run: unfoldAll
+ run: unfoldAllCommand
},
{
key: 'Mod--',
preventDefault: true,
- run: foldAll
+ run: foldAllCommand
},
{
key: 'Mod-a',
@@ -1244,7 +1248,7 @@
}
}
]),
- keymap.of(secondaryKeymaps),
+ keymap.of(secondaryKeymaps as readonly KeyBinding[]),
json5(),
customSyntaxHighlighting,
customTheme,
From e9f3292f8167bcb34c6d2bd6d2993e7c5e951333 Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Mon, 18 May 2026 11:27:17 +0530
Subject: [PATCH 040/320] update dependencies
---
bun.lock | 114 ++++++++++++++++++++++++++++-----------------------
package.json | 54 ++++++++++++------------
2 files changed, 90 insertions(+), 78 deletions(-)
diff --git a/bun.lock b/bun.lock
index 4a4eb7f6bc..5eb76f6c2d 100644
--- a/bun.lock
+++ b/bun.lock
@@ -100,9 +100,9 @@
"packages": {
"@adobe/css-tools": ["@adobe/css-tools@4.4.4", "", {}, "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg=="],
- "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.80", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-uM7kpZB5l977lW7+2X1+klBUxIZQ78+1a9jHlaHFEzcOcmmslTl3sdP0QqfuuBcO0YBM2gwOiqVdp8i4TRQYcw=="],
+ "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.115", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@vercel/oidc": "3.2.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-xonmGfN9pt54WdKqMzWe68BRYS3rsYvraBzioyA0gfNcecHs8Ir5qk/X8grJSyZ95hghjWiOphrK6bAc11E6SA=="],
- "@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="],
+ "@ai-sdk/provider": ["@ai-sdk/provider@3.0.10", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw=="],
"@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.13", "", { "dependencies": { "@ai-sdk/provider": "1.0.11", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-kLjqsfOdONr6DGcGEntFYM1niXz1H05vyZNf9OAzK+KKKc64izyP4/q/9HX7W4+6g8hm6BnmKxu8vkr6FSOqDg=="],
@@ -170,19 +170,19 @@
"@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="],
- "@codemirror/autocomplete": ["@codemirror/autocomplete@6.20.1", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A=="],
+ "@codemirror/autocomplete": ["@codemirror/autocomplete@6.20.2", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "sha512-G5FPkgIiLjOgZMjqVjvuKQ1rGPtHogLldJr33eFJdVLtmwY+giGrlv/ewljLz6b9BSQLkjxuwBc6g6omDM+YxQ=="],
"@codemirror/commands": ["@codemirror/commands@6.10.3", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.6.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q=="],
"@codemirror/language": ["@codemirror/language@6.12.3", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.5.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" } }, "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA=="],
- "@codemirror/lint": ["@codemirror/lint@6.9.5", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.35.0", "crelt": "^1.0.5" } }, "sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA=="],
+ "@codemirror/lint": ["@codemirror/lint@6.9.6", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.42.0", "crelt": "^1.0.5" } }, "sha512-6Kp7r6XfCi/D/5sdXieMfg9pJU1bUEx96WITuLU6ESaKizCz0QHFMjY/TaFSbigDdEAIgi93itLBIUETP4oK+A=="],
- "@codemirror/search": ["@codemirror/search@6.6.0", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.37.0", "crelt": "^1.0.5" } }, "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw=="],
+ "@codemirror/search": ["@codemirror/search@6.7.0", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.37.0", "crelt": "^1.0.5" } }, "sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg=="],
"@codemirror/state": ["@codemirror/state@6.6.0", "", { "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ=="],
- "@codemirror/view": ["@codemirror/view@6.41.1", "", { "dependencies": { "@codemirror/state": "^6.6.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg=="],
+ "@codemirror/view": ["@codemirror/view@6.43.0", "", { "dependencies": { "@codemirror/state": "^6.6.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-V7ZCLQO3Jus9hzh2jVCCPW3mO4IBMr43O37PqSUYautJSnnJF41YlgLw21x0fLJTYvJ+Vkm6Gp+qKGH9pltgXA=="],
"@csstools/color-helpers": ["@csstools/color-helpers@5.1.0", "", {}, "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA=="],
@@ -364,9 +364,9 @@
"@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.6", "", { "os": "win32", "cpu": "x64" }, "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw=="],
- "@plausible-analytics/tracker": ["@plausible-analytics/tracker@0.4.4", "", {}, "sha512-fz0NOYUEYXtg1TBaPEEvtcBq3FfmLFuTe1VZw4M8sTWX129br5dguu3M15+plOQnc181ShYe67RfwhKgK89VnA=="],
+ "@plausible-analytics/tracker": ["@plausible-analytics/tracker@0.4.5", "", {}, "sha512-6BfAGejXY+YA3Cw6LYT2Zpn4hTxDtPQAawFsYUsQCOg78wIS5C4deAGXTfJffa5VleMWITv5lpJ/EYuQBl1tPA=="],
- "@playwright/test": ["@playwright/test@1.58.2", "", { "dependencies": { "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" } }, "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA=="],
+ "@playwright/test": ["@playwright/test@1.60.0", "", { "dependencies": { "playwright": "1.60.0" }, "bin": { "playwright": "cli.js" } }, "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag=="],
"@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="],
@@ -402,17 +402,17 @@
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.53", "", {}, "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ=="],
- "@sentry-internal/browser-utils": ["@sentry-internal/browser-utils@8.55.1", "", { "dependencies": { "@sentry/core": "8.55.1" } }, "sha512-SipXiwVhJrxzy3/4kf+YIFmpYlLKtGSRD+er7SBCcuSBtv31Fee8IXMDvk+bq24gRXxyjOLUmT//GGXjy2LL6w=="],
+ "@sentry-internal/browser-utils": ["@sentry-internal/browser-utils@8.55.2", "", { "dependencies": { "@sentry/core": "8.55.2" } }, "sha512-GnKod+gL/Y+1FUM/RGV8q6le1CoyiGbT40MitEK7eVwWe+bfTRq1gN7ioupyHFMUg1RlQkDQ4/sENmio/uow5A=="],
- "@sentry-internal/feedback": ["@sentry-internal/feedback@8.55.1", "", { "dependencies": { "@sentry/core": "8.55.1" } }, "sha512-9iFHaT/ijtzB0ffZhXMnt2rPNIXO/dDiCL1G1Bc55rQMPXgawR9AIaAWciyqQjYcbL1DDOhWbzdVqB+kVs5gXw=="],
+ "@sentry-internal/feedback": ["@sentry-internal/feedback@8.55.2", "", { "dependencies": { "@sentry/core": "8.55.2" } }, "sha512-XQy//NWbL0mLLM5w8wNDWMNpXz39VUyW2397dUrH8++kR63WhUVAvTOtL0o0GMVadSAzl1b08oHP9zSUNFQwcg=="],
- "@sentry-internal/replay": ["@sentry-internal/replay@8.55.1", "", { "dependencies": { "@sentry-internal/browser-utils": "8.55.1", "@sentry/core": "8.55.1" } }, "sha512-XaX6r8pXeX47rfiQrSQUwkgxHsDkOKzIT++zfTwrmveVlYSqAhp3x+AKhxAXGmKG62wlmAKQz54GJKcG4cgyKQ=="],
+ "@sentry-internal/replay": ["@sentry-internal/replay@8.55.2", "", { "dependencies": { "@sentry-internal/browser-utils": "8.55.2", "@sentry/core": "8.55.2" } }, "sha512-+W43Z697EVe/OgpGW07B773sa8xO1UbpnW0Cr+E+3FMDb6ZbXlaBUoagPTUkkQPdwBe35SDh6r8y2M3EOPGbxg=="],
- "@sentry-internal/replay-canvas": ["@sentry-internal/replay-canvas@8.55.1", "", { "dependencies": { "@sentry-internal/replay": "8.55.1", "@sentry/core": "8.55.1" } }, "sha512-2sKRu96Qe70y6TiYdYbwkhg4um2prgzH/ZJRItuoSEAjPjoFYYlP+1qjE2CcBw4RPS8/PimV7SFheSaeZs2GCw=="],
+ "@sentry-internal/replay-canvas": ["@sentry-internal/replay-canvas@8.55.2", "", { "dependencies": { "@sentry-internal/replay": "8.55.2", "@sentry/core": "8.55.2" } }, "sha512-P/jGiuR7dRLG9IzD/463fLgiibyYceauav/9prRG0ZxJm1AtuO02OKball2Fs3bbzdzwHCTlcsUuL2ivDF4b5A=="],
"@sentry/babel-plugin-component-annotate": ["@sentry/babel-plugin-component-annotate@2.22.6", "", {}, "sha512-V2g1Y1I5eSe7dtUVMBvAJr8BaLRr4CLrgNgtPaZyMT4Rnps82SrZ5zqmEkLXPumlXhLUWR6qzoMNN2u+RXVXfQ=="],
- "@sentry/browser": ["@sentry/browser@8.55.1", "", { "dependencies": { "@sentry-internal/browser-utils": "8.55.1", "@sentry-internal/feedback": "8.55.1", "@sentry-internal/replay": "8.55.1", "@sentry-internal/replay-canvas": "8.55.1", "@sentry/core": "8.55.1" } }, "sha512-OEn2eg8h3Mr7BmBGQ28BqbWehYA/NklZ0pAZB1FypPPl+kMd85AbaRdGTnaSjgmpc8bKbBO64edq4Y14sbCs5w=="],
+ "@sentry/browser": ["@sentry/browser@8.55.2", "", { "dependencies": { "@sentry-internal/browser-utils": "8.55.2", "@sentry-internal/feedback": "8.55.2", "@sentry-internal/replay": "8.55.2", "@sentry-internal/replay-canvas": "8.55.2", "@sentry/core": "8.55.2" } }, "sha512-xHuPIEKhx9zw5quWvv4YgZprnwoVMCfxIhmOIf6KJ9iizyUHeUDcKpLS59xERroqwX4RpvK+l/27AZu4zfZlzQ=="],
"@sentry/bundler-plugin-core": ["@sentry/bundler-plugin-core@2.22.6", "", { "dependencies": { "@babel/core": "^7.18.5", "@sentry/babel-plugin-component-annotate": "2.22.6", "@sentry/cli": "^2.36.1", "dotenv": "^16.3.1", "find-up": "^5.0.0", "glob": "^9.3.2", "magic-string": "0.30.8", "unplugin": "1.0.1" } }, "sha512-1esQdgSUCww9XAntO4pr7uAM5cfGhLsgTK9MEwAKNfvpMYJi9NUTYa3A7AZmdA8V6107Lo4OD7peIPrDRbaDCg=="],
@@ -434,15 +434,15 @@
"@sentry/cli-win32-x64": ["@sentry/cli-win32-x64@2.58.5", "", { "os": "win32", "cpu": "x64" }, "sha512-IZf+XIMiQwj+5NzqbOQfywlOitmCV424Vtf9c+ep61AaVScUFD1TSrQbOcJJv5xGxhlxNOMNgMeZhdexdzrKZg=="],
- "@sentry/core": ["@sentry/core@8.55.1", "", {}, "sha512-0ea+yDOgaijR3ba2al1QZxY0bZ9MBZq2a0G+2A0uCBpBkiXnpLFGVAo9UAlEikN1C4M8ROZYiuFU7yZCqacgLQ=="],
+ "@sentry/core": ["@sentry/core@8.55.2", "", {}, "sha512-YlEBwybUcOQ/KjMHDmof1vwweVnBtBxYlQp7DE3fOdtW4pqqdHWTnTntQs4VgYfxzjJYgtkd9LHlGtg8qy+JVQ=="],
- "@sentry/node": ["@sentry/node@8.55.1", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1", "@opentelemetry/core": "^1.30.1", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/instrumentation-amqplib": "^0.46.0", "@opentelemetry/instrumentation-connect": "0.43.0", "@opentelemetry/instrumentation-dataloader": "0.16.0", "@opentelemetry/instrumentation-express": "0.47.0", "@opentelemetry/instrumentation-fastify": "0.44.1", "@opentelemetry/instrumentation-fs": "0.19.0", "@opentelemetry/instrumentation-generic-pool": "0.43.0", "@opentelemetry/instrumentation-graphql": "0.47.0", "@opentelemetry/instrumentation-hapi": "0.45.1", "@opentelemetry/instrumentation-http": "0.57.1", "@opentelemetry/instrumentation-ioredis": "0.47.0", "@opentelemetry/instrumentation-kafkajs": "0.7.0", "@opentelemetry/instrumentation-knex": "0.44.0", "@opentelemetry/instrumentation-koa": "0.47.0", "@opentelemetry/instrumentation-lru-memoizer": "0.44.0", "@opentelemetry/instrumentation-mongodb": "0.51.0", "@opentelemetry/instrumentation-mongoose": "0.46.0", "@opentelemetry/instrumentation-mysql": "0.45.0", "@opentelemetry/instrumentation-mysql2": "0.45.0", "@opentelemetry/instrumentation-nestjs-core": "0.44.0", "@opentelemetry/instrumentation-pg": "0.50.0", "@opentelemetry/instrumentation-redis-4": "0.46.0", "@opentelemetry/instrumentation-tedious": "0.18.0", "@opentelemetry/instrumentation-undici": "0.10.0", "@opentelemetry/resources": "^1.30.1", "@opentelemetry/sdk-trace-base": "^1.30.1", "@opentelemetry/semantic-conventions": "^1.28.0", "@prisma/instrumentation": "5.22.0", "@sentry/core": "8.55.1", "@sentry/opentelemetry": "8.55.1", "import-in-the-middle": "^1.11.2" } }, "sha512-s8ydn/OxZFIxc9Fvt23gJkrXkCvPnUu2bDKwjQBCx0M1b4DdNdp4FaimT6B9reya7buj+tsNkZAoT11KqFhG/g=="],
+ "@sentry/node": ["@sentry/node@8.55.2", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1", "@opentelemetry/core": "^1.30.1", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/instrumentation-amqplib": "^0.46.0", "@opentelemetry/instrumentation-connect": "0.43.0", "@opentelemetry/instrumentation-dataloader": "0.16.0", "@opentelemetry/instrumentation-express": "0.47.0", "@opentelemetry/instrumentation-fastify": "0.44.1", "@opentelemetry/instrumentation-fs": "0.19.0", "@opentelemetry/instrumentation-generic-pool": "0.43.0", "@opentelemetry/instrumentation-graphql": "0.47.0", "@opentelemetry/instrumentation-hapi": "0.45.1", "@opentelemetry/instrumentation-http": "0.57.1", "@opentelemetry/instrumentation-ioredis": "0.47.0", "@opentelemetry/instrumentation-kafkajs": "0.7.0", "@opentelemetry/instrumentation-knex": "0.44.0", "@opentelemetry/instrumentation-koa": "0.47.0", "@opentelemetry/instrumentation-lru-memoizer": "0.44.0", "@opentelemetry/instrumentation-mongodb": "0.51.0", "@opentelemetry/instrumentation-mongoose": "0.46.0", "@opentelemetry/instrumentation-mysql": "0.45.0", "@opentelemetry/instrumentation-mysql2": "0.45.0", "@opentelemetry/instrumentation-nestjs-core": "0.44.0", "@opentelemetry/instrumentation-pg": "0.50.0", "@opentelemetry/instrumentation-redis-4": "0.46.0", "@opentelemetry/instrumentation-tedious": "0.18.0", "@opentelemetry/instrumentation-undici": "0.10.0", "@opentelemetry/resources": "^1.30.1", "@opentelemetry/sdk-trace-base": "^1.30.1", "@opentelemetry/semantic-conventions": "^1.28.0", "@prisma/instrumentation": "5.22.0", "@sentry/core": "8.55.2", "@sentry/opentelemetry": "8.55.2", "import-in-the-middle": "^1.11.2" } }, "sha512-x3Whryb4TytiIhH9ABLVuASfBvwA50v6PpJYvq0Y9dUMi9Eb0cfuqvRCB3e+oVntZHQpnXor2U/gRBIdG2jp4w=="],
- "@sentry/opentelemetry": ["@sentry/opentelemetry@8.55.1", "", { "dependencies": { "@sentry/core": "8.55.1" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1", "@opentelemetry/core": "^1.30.1", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/sdk-trace-base": "^1.30.1", "@opentelemetry/semantic-conventions": "^1.28.0" } }, "sha512-ipiM/k3Hzt8visoBfkDb4AQBWHkJeou3SjoPec7NlDabH/Jj8x6VlK5Hex4z+WOv99rRy+5MUtga/CZnOjvh0A=="],
+ "@sentry/opentelemetry": ["@sentry/opentelemetry@8.55.2", "", { "dependencies": { "@sentry/core": "8.55.2" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1", "@opentelemetry/core": "^1.30.1", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/sdk-trace-base": "^1.30.1", "@opentelemetry/semantic-conventions": "^1.28.0" } }, "sha512-pbhXi4cS1W4l392yEfIx3UD28OYAl9JkYOmh/Cpm6cPTtRMPxi3hWeujGbcXV9T/RkWYjqd+JdUDJjqsWSww9A=="],
- "@sentry/svelte": ["@sentry/svelte@8.55.1", "", { "dependencies": { "@sentry/browser": "8.55.1", "@sentry/core": "8.55.1", "magic-string": "^0.30.0" }, "peerDependencies": { "svelte": "3.x || 4.x || 5.x" } }, "sha512-INuwEscDDkHY3rnZyYiRCBtI8vz9qkTprTpegMC01W7mWE2vh9bNft8V/c41una8m8m6JLREy+1eYRvd/uDr3A=="],
+ "@sentry/svelte": ["@sentry/svelte@8.55.2", "", { "dependencies": { "@sentry/browser": "8.55.2", "@sentry/core": "8.55.2", "magic-string": "^0.30.0" }, "peerDependencies": { "svelte": "3.x || 4.x || 5.x" } }, "sha512-q5aN6lwYiReZcwQfzIQyipBVtfu5ZmE237ivKiTp1VZqPetWLZO4PMWzP9kzG+lz1OIdRhEGm6GBvJi4NBS/9A=="],
- "@sentry/sveltekit": ["@sentry/sveltekit@8.55.1", "", { "dependencies": { "@sentry/core": "8.55.1", "@sentry/node": "8.55.1", "@sentry/opentelemetry": "8.55.1", "@sentry/svelte": "8.55.1", "@sentry/vite-plugin": "2.22.6", "magic-string": "0.30.7", "magicast": "0.2.8", "sorcery": "1.0.0" }, "peerDependencies": { "@sveltejs/kit": "1.x || 2.x", "vite": "*" }, "optionalPeers": ["vite"] }, "sha512-Kt05HMaWvbtvUYFF5gmZmNBY2Wn1kJnyTXDjYusTxsAtM9RfU05UbOSqedBcOqhSALohZUwHA4/QO3lqgXEsAg=="],
+ "@sentry/sveltekit": ["@sentry/sveltekit@8.55.2", "", { "dependencies": { "@sentry/core": "8.55.2", "@sentry/node": "8.55.2", "@sentry/opentelemetry": "8.55.2", "@sentry/svelte": "8.55.2", "@sentry/vite-plugin": "2.22.6", "magic-string": "0.30.7", "magicast": "0.2.8", "sorcery": "1.0.0" }, "peerDependencies": { "@sveltejs/kit": "1.x || 2.x", "vite": "*" }, "optionalPeers": ["vite"] }, "sha512-ypl/St8erGso2z2IBLiRv9nRdH1HQ3rXDaI71mkj9PjUhcdiC7k7COFUs6j8knmgPIsRc7ByU23vsfotyCxFvA=="],
"@sentry/vite-plugin": ["@sentry/vite-plugin@2.22.6", "", { "dependencies": { "@sentry/bundler-plugin-core": "2.22.6", "unplugin": "1.0.1" } }, "sha512-zIieP1VLWQb3wUjFJlwOAoaaJygJhXeUoGd0e/Ha2RLb2eW2S+4gjf6y6NqyY71tZ74LYVZKg/4prB6FAZSMXQ=="],
@@ -468,7 +468,7 @@
"@sveltejs/adapter-static": ["@sveltejs/adapter-static@3.0.10", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew=="],
- "@sveltejs/kit": ["@sveltejs/kit@2.57.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.6.4", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3 || ^6.0.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-VRdSbB96cI1EnRh09CqmnQqP/YJvET5buj8S6k7CxaJqBJD4bw4fRKDjcarAj/eX9k2eHifQfDH8NtOh+ZxxPw=="],
+ "@sveltejs/kit": ["@sveltejs/kit@2.60.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.8.1", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3 || ^6.0.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-mQjlkNo+rJvpln7V2IGY2j99BqhcFbS4UN0AQNKNYfhBAFZTuCDAdW3a1sgf330mvtNvsBXn3HpAhcmvdJTcIQ=="],
"@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@5.1.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.1", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.17", "vitefu": "^1.0.6" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ=="],
@@ -492,9 +492,9 @@
"@threejs-kit/instanced-sprite-mesh": ["@threejs-kit/instanced-sprite-mesh@2.5.1", "", { "dependencies": { "diet-sprite": "^0.0.1", "earcut": "^2.2.4", "maath": "^0.10.7", "three-instanced-uniforms-mesh": "^0.52.4", "troika-three-utils": "^0.52.4" }, "peerDependencies": { "three": ">=0.170.0" } }, "sha512-pmt1ALRhbHhCJQTj2FuthH6PeLIeaM4hOuS2JO3kWSwlnvx/9xuUkjFR3JOi/myMqsH7pSsLIROSaBxDfttjeA=="],
- "@threlte/core": ["@threlte/core@8.5.2", "", { "dependencies": { "mitt": "^3.0.1" }, "peerDependencies": { "svelte": ">=5", "three": ">=0.160" } }, "sha512-noxIsYlEYRFBo0U3T8Z4PWkfe23VCDxaHIlSzSWlOlBgd+mhKrhyM8lFmeznmZQS78z4obkWUJeYxx/jauD+rw=="],
+ "@threlte/core": ["@threlte/core@8.5.14", "", { "peerDependencies": { "svelte": ">=5", "three": ">=0.160" } }, "sha512-9UPW8zgkXPk6zEaJSvNuL9mDa0fHqCBzDXioUDt6flRUEvhh+nR8Q6XMjea6s+frReFw7WnKcDobPsGNPbtdLg=="],
- "@threlte/extras": ["@threlte/extras@9.13.0", "", { "dependencies": { "@threejs-kit/instanced-sprite-mesh": "^2.5.1", "camera-controls": "^3.1.2", "three-mesh-bvh": "^0.9.1", "three-perf": "^1.0.11", "three-viewport-gizmo": "^2.2.0", "troika-three-text": "^0.52.4" }, "peerDependencies": { "svelte": ">=5", "three": ">=0.160" } }, "sha512-fHt5VcOoXyBT+wuytRHlKa1SUxNEI15L/kpudVWE9Z0G+U5TWIf01mt0BdQBGJOqwVJYxwFzRJQxfS2/kLAl9Q=="],
+ "@threlte/extras": ["@threlte/extras@9.18.0", "", { "dependencies": { "@threejs-kit/instanced-sprite-mesh": "^2.5.1", "camera-controls": "^3.1.2", "three-mesh-bvh": "^0.9.1", "three-perf": "^1.0.11", "three-viewport-gizmo": "^2.2.0", "troika-three-text": "^0.52.4" }, "peerDependencies": { "svelte": ">=5", "three": ">=0.160" } }, "sha512-dy3po3S+aA1HFdJ+n3iY//efe12Z0F1ffIBliZf8tR1rqUAerFWIwbNK4+/+JujFHXKVwh5DwSAib+dq7V0BSQ=="],
"@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="],
@@ -550,29 +550,29 @@
"@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="],
- "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.57.2", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/type-utils": "8.57.2", "@typescript-eslint/utils": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.57.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w=="],
+ "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.59.3", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.59.3", "@typescript-eslint/type-utils": "8.59.3", "@typescript-eslint/utils": "8.59.3", "@typescript-eslint/visitor-keys": "8.59.3", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.59.3", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw=="],
- "@typescript-eslint/parser": ["@typescript-eslint/parser@8.57.2", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/types": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA=="],
+ "@typescript-eslint/parser": ["@typescript-eslint/parser@8.59.3", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.59.3", "@typescript-eslint/types": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3", "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg=="],
- "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.57.2", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.57.2", "@typescript-eslint/types": "^8.57.2", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw=="],
+ "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.59.3", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.59.3", "@typescript-eslint/types": "^8.59.3", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng=="],
- "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.57.2", "", { "dependencies": { "@typescript-eslint/types": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2" } }, "sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw=="],
+ "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.59.3", "", { "dependencies": { "@typescript-eslint/types": "8.59.3", "@typescript-eslint/visitor-keys": "8.59.3" } }, "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA=="],
- "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.57.2", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw=="],
+ "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.59.3", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw=="],
- "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.57.2", "", { "dependencies": { "@typescript-eslint/types": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2", "@typescript-eslint/utils": "8.57.2", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg=="],
+ "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.59.3", "", { "dependencies": { "@typescript-eslint/types": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3", "@typescript-eslint/utils": "8.59.3", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ=="],
- "@typescript-eslint/types": ["@typescript-eslint/types@8.57.2", "", {}, "sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA=="],
+ "@typescript-eslint/types": ["@typescript-eslint/types@8.59.3", "", {}, "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg=="],
- "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.57.2", "", { "dependencies": { "@typescript-eslint/project-service": "8.57.2", "@typescript-eslint/tsconfig-utils": "8.57.2", "@typescript-eslint/types": "8.57.2", "@typescript-eslint/visitor-keys": "8.57.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA=="],
+ "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.59.3", "", { "dependencies": { "@typescript-eslint/project-service": "8.59.3", "@typescript-eslint/tsconfig-utils": "8.59.3", "@typescript-eslint/types": "8.59.3", "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg=="],
- "@typescript-eslint/utils": ["@typescript-eslint/utils@8.57.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/types": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg=="],
+ "@typescript-eslint/utils": ["@typescript-eslint/utils@8.59.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.59.3", "@typescript-eslint/types": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg=="],
- "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.57.2", "", { "dependencies": { "@typescript-eslint/types": "8.57.2", "eslint-visitor-keys": "^5.0.0" } }, "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw=="],
+ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.3", "", { "dependencies": { "@typescript-eslint/types": "8.59.3", "eslint-visitor-keys": "^5.0.0" } }, "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg=="],
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
- "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="],
+ "@vercel/oidc": ["@vercel/oidc@3.2.0", "", {}, "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug=="],
"@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="],
@@ -600,7 +600,7 @@
"agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
- "ai": ["ai@6.0.138", "", { "dependencies": { "@ai-sdk/gateway": "3.0.80", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-49OfPe0f5uxJ6jUdA5BBXjIinP6+ZdYfAtpF2aEH64GA5wPcxH2rf/TBUQQ0bbamBz/D+TLMV18xilZqOC+zaA=="],
+ "ai": ["ai@6.0.184", "", { "dependencies": { "@ai-sdk/gateway": "3.0.115", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@opentelemetry/api": "^1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-j//zHkKvj5ra27l8izHco8cj1g1Pr7vx1ZK+hrzrkHvndgIRmdfZKOb6+RAPpvbk42qGIsuYvlYbGlVAu3erNQ=="],
"ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="],
@@ -800,7 +800,7 @@
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
- "devalue": ["devalue@5.6.4", "", {}, "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA=="],
+ "devalue": ["devalue@5.8.1", "", {}, "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw=="],
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
@@ -842,7 +842,7 @@
"eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="],
- "eslint-plugin-svelte": ["eslint-plugin-svelte@3.16.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.6.1", "@jridgewell/sourcemap-codec": "^1.5.0", "esutils": "^2.0.3", "globals": "^16.0.0", "known-css-properties": "^0.37.0", "postcss": "^8.4.49", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^7.0.0", "semver": "^7.6.3", "svelte-eslint-parser": "^1.4.0" }, "peerDependencies": { "eslint": "^8.57.1 || ^9.0.0 || ^10.0.0", "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["svelte"] }, "sha512-DJXxqpYZUxcE0SfYo8EJzV2ZC+zAD7fJp1n1HwcEMRR1cOEUYvjT9GuzJeNghMjgb7uxuK3IJAzI+x6zzUxO5A=="],
+ "eslint-plugin-svelte": ["eslint-plugin-svelte@3.17.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.6.1", "@jridgewell/sourcemap-codec": "^1.5.0", "esutils": "^2.0.3", "globals": "^16.0.0", "known-css-properties": "^0.37.0", "postcss": "^8.4.49", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^7.0.0", "semver": "^7.6.3", "svelte-eslint-parser": "^1.4.0" }, "peerDependencies": { "eslint": "^8.57.1 || ^9.0.0 || ^10.0.0", "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["svelte"] }, "sha512-NyiXHtS3Ni7e532RBwS9OXlMKDIrENg3gY+/+ODjZzQx2xhU3NlJ+nIl1a93iUUQeiJL3lS8KLmY+W8hklzweQ=="],
"eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
@@ -1118,8 +1118,6 @@
"minipass": ["minipass@4.2.8", "", {}, "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ=="],
- "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="],
-
"module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="],
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
@@ -1128,7 +1126,7 @@
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
- "nanoid": ["nanoid@5.1.7", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ=="],
+ "nanoid": ["nanoid@5.1.11", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg=="],
"nanotar": ["nanotar@0.3.0", "", {}, "sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg=="],
@@ -1186,9 +1184,9 @@
"picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
- "playwright": ["playwright@1.58.2", "", { "dependencies": { "playwright-core": "1.58.2" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A=="],
+ "playwright": ["playwright@1.60.0", "", { "dependencies": { "playwright-core": "1.60.0" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA=="],
- "playwright-core": ["playwright-core@1.58.2", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg=="],
+ "playwright-core": ["playwright-core@1.60.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA=="],
"popmotion": ["popmotion@11.0.5", "", { "dependencies": { "framesync": "6.1.2", "hey-listen": "^1.0.8", "style-value-types": "5.1.2", "tslib": "2.4.0" } }, "sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA=="],
@@ -1214,9 +1212,9 @@
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
- "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="],
+ "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="],
- "prettier-plugin-svelte": ["prettier-plugin-svelte@3.5.1", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, "sha512-65+fr5+cgIKWKiqM1Doum4uX6bY8iFCdztvvp2RcF+AJoieaw9kJOFMNcJo/bkmKYsxFaM9OsVZK/gWauG/5mg=="],
+ "prettier-plugin-svelte": ["prettier-plugin-svelte@3.5.2", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" } }, "sha512-ItFouLvzSFE3ulNl4DKoWM3BGcbDCNVpIyy/Y3F2gC3aNiGLxtFUdffVqO5Z5hhYG+DFT5KULWaxmeFFpdbvaQ=="],
"pretty-bytes": ["pretty-bytes@6.1.1", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="],
@@ -1270,7 +1268,7 @@
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
- "sass": ["sass@1.98.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A=="],
+ "sass": ["sass@1.99.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q=="],
"saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="],
@@ -1336,9 +1334,9 @@
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
- "svelte": ["svelte@5.55.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-SThllKq6TRMBwPtat7ASnm/9CDXnIhBR0NPGw0ujn2DVYx9rVwsPZxDaDQcYGdUz/3BYVsCzdq7pZarRQoGvtw=="],
+ "svelte": ["svelte@5.55.7", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.8.1", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-ymI5ykLPwIHW839E053FQbI1G+jnRFJEw3Kv5Y4njixVWywQBx+NUFpkkKyk5LIb36Fg9DVXSYpqiGekLD0hyw=="],
- "svelte-check": ["svelte-check@4.4.5", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-1bSwIRCvvmSHrlK52fOlZmVtUZgil43jNL/2H18pRpa+eQjzGt6e3zayxhp1S7GajPFKNM/2PMCG+DZFHlG9fw=="],
+ "svelte-check": ["svelte-check@4.4.8", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-67adfgBox5eNSNIvIIwgFizKGdcRrGpiMoNO2obHcYuLz7iTa8Xgm/NGU3ntMFnNm8K1grFOIG6HhMLX/vcN8w=="],
"svelte-confetti": ["svelte-confetti@1.4.0", "", { "peerDependencies": { "svelte": "^4.0.0" } }, "sha512-B0woNwpsFGwhkEoP48BIDQgvW0bMxPhavLVD+E+tsTWevlpr1aiz1S2wA8ArIXX957BiaZWHRHKmI5/pFRDbdg=="],
@@ -1386,9 +1384,9 @@
"tippy.js": ["tippy.js@6.3.7", "", { "dependencies": { "@popperjs/core": "^2.9.0" } }, "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ=="],
- "tldts": ["tldts@7.0.27", "", { "dependencies": { "tldts-core": "^7.0.27" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg=="],
+ "tldts": ["tldts@7.0.30", "", { "dependencies": { "tldts-core": "^7.0.30" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw=="],
- "tldts-core": ["tldts-core@7.0.27", "", {}, "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg=="],
+ "tldts-core": ["tldts-core@7.0.30", "", {}, "sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q=="],
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
@@ -1406,7 +1404,7 @@
"troika-worker-utils": ["troika-worker-utils@0.52.0", "", {}, "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw=="],
- "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="],
+ "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
@@ -1416,7 +1414,7 @@
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
- "typescript-eslint": ["typescript-eslint@8.57.2", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.57.2", "@typescript-eslint/parser": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2", "@typescript-eslint/utils": "8.57.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A=="],
+ "typescript-eslint": ["typescript-eslint@8.59.3", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.59.3", "@typescript-eslint/parser": "8.59.3", "@typescript-eslint/typescript-estree": "8.59.3", "@typescript-eslint/utils": "8.59.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg=="],
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
@@ -1504,7 +1502,7 @@
"zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
- "@ai-sdk/gateway/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+ "@ai-sdk/gateway/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
"@ai-sdk/provider-utils/@ai-sdk/provider": ["@ai-sdk/provider@1.0.11", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-CPyImHGiT3svyfmvPvAFTianZzWFtm0qK82XjwlQIA1C3IQ2iku/PMQXi7aFyrX0TyMh3VTkJPB03tjU2VXVrw=="],
@@ -1522,12 +1520,18 @@
"@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+ "@codemirror/commands/@codemirror/view": ["@codemirror/view@6.41.1", "", { "dependencies": { "@codemirror/state": "^6.6.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg=="],
+
+ "@codemirror/language/@codemirror/view": ["@codemirror/view@6.41.1", "", { "dependencies": { "@codemirror/state": "^6.6.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg=="],
+
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
"@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
"@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
+ "@melt-ui/svelte/nanoid": ["nanoid@5.1.7", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ=="],
+
"@opentelemetry/core/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="],
"@opentelemetry/instrumentation-http/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.1", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-SgHEKXoVxOjc20ZYusPG3Fh+RLIZTSa4x8QtD3NfgAUDyqdFFS9W1F2ZVbZkqDCdyMcQG02Ok4duUGLHJXHgbA=="],
@@ -1554,10 +1558,12 @@
"@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="],
- "ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.21", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MtFUYI1/8mgDvRmaBDjbLJPFFrMG777AvSgyIFQtZHIMzm88R/12vYBBpnk7pfiWLFE1DSZzY4WDYzGbKAcmiw=="],
+ "ai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.27", "", { "dependencies": { "@ai-sdk/provider": "3.0.10", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw=="],
"chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+ "codemirror-json5/@codemirror/view": ["@codemirror/view@6.41.1", "", { "dependencies": { "@codemirror/state": "^6.6.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg=="],
+
"echarts/tslib": ["tslib@2.3.0", "", {}, "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="],
"eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
@@ -1592,12 +1598,16 @@
"zrender/tslib": ["tslib@2.3.0", "", {}, "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="],
+ "@ai-sdk/gateway/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.8", "", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="],
+
"@opentelemetry/instrumentation-http/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.1", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg=="],
"@prisma/instrumentation/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.53.0", "", { "dependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw=="],
"@sentry/cli/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="],
+ "ai/@ai-sdk/provider-utils/eventsource-parser": ["eventsource-parser@3.0.8", "", {}, "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ=="],
+
"chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
"node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
@@ -1606,6 +1616,8 @@
"svelte-sequential-preprocessor/svelte/aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="],
+ "svelte-sequential-preprocessor/svelte/devalue": ["devalue@5.6.4", "", {}, "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA=="],
+
"tough-cookie/tldts/tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="],
"unplugin/chokidar/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="],
diff --git a/package.json b/package.json
index 9172b8189d..1c107fdcf9 100644
--- a/package.json
+++ b/package.json
@@ -25,22 +25,22 @@
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
"@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17",
- "@codemirror/autocomplete": "^6.19.0",
- "@codemirror/commands": "^6.9.0",
- "@codemirror/language": "^6.11.3",
- "@codemirror/lint": "^6.9.0",
- "@codemirror/search": "^6.5.11",
- "@codemirror/state": "^6.5.2",
- "@codemirror/view": "^6.38.6",
+ "@codemirror/autocomplete": "^6.20.2",
+ "@codemirror/commands": "^6.10.3",
+ "@codemirror/language": "^6.12.3",
+ "@codemirror/lint": "^6.9.6",
+ "@codemirror/search": "^6.7.0",
+ "@codemirror/state": "^6.6.0",
+ "@codemirror/view": "^6.43.0",
"@faker-js/faker": "^9.9.0",
- "@lezer/highlight": "^1.2.1",
- "@plausible-analytics/tracker": "^0.4.4",
+ "@lezer/highlight": "^1.2.3",
+ "@plausible-analytics/tracker": "^0.4.5",
"@popperjs/core": "^2.11.8",
- "@sentry/sveltekit": "^8.55.1",
+ "@sentry/sveltekit": "^8.55.2",
"@stripe/stripe-js": "^3.5.0",
- "@threlte/core": "^8.5.2",
- "@threlte/extras": "^9.13.0",
- "ai": "^6.0.138",
+ "@threlte/core": "^8.5.14",
+ "@threlte/extras": "^9.18.0",
+ "ai": "^6.0.184",
"analytics": "^0.8.19",
"codemirror-json5": "^1.0.3",
"cron-parser": "^4.9.0",
@@ -50,7 +50,7 @@
"flatted": "^3.4.2",
"ignore": "^6.0.2",
"json5": "^2.2.3",
- "nanoid": "^5.1.7",
+ "nanoid": "^5.1.11",
"nanotar": "^0.3.0",
"pretty-bytes": "^6.1.1",
"remarkable": "^2.0.1",
@@ -61,12 +61,12 @@
"devDependencies": {
"@eslint/compat": "^1.4.1",
"@eslint/js": "^9.39.4",
- "@lezer/common": "^1.5.0",
+ "@lezer/common": "^1.5.2",
"@melt-ui/pp": "^0.3.2",
"@melt-ui/svelte": "^0.86.6",
- "@playwright/test": "^1.58.2",
+ "@playwright/test": "^1.60.0",
"@sveltejs/adapter-static": "^3.0.10",
- "@sveltejs/kit": "^2.57.1",
+ "@sveltejs/kit": "^2.60.1",
"@sveltejs/vite-plugin-svelte": "^5.1.1",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.9.1",
@@ -75,27 +75,27 @@
"@types/deep-equal": "^1.0.4",
"@types/remarkable": "^2.0.8",
"@types/three": "^0.182.0",
- "@typescript-eslint/eslint-plugin": "^8.57.2",
- "@typescript-eslint/parser": "^8.57.2",
+ "@typescript-eslint/eslint-plugin": "^8.59.3",
+ "@typescript-eslint/parser": "^8.59.3",
"@vitest/ui": "^3.2.4",
"color": "^5.0.3",
"eslint": "^9.39.4",
"eslint-config-prettier": "^10.1.8",
- "eslint-plugin-svelte": "^3.16.0",
+ "eslint-plugin-svelte": "^3.17.1",
"globals": "^16.5.0",
"jsdom": "^26.1.0",
"kleur": "^4.1.5",
- "prettier": "^3.8.1",
- "prettier-plugin-svelte": "^3.5.1",
- "sass": "^1.98.0",
- "svelte": "^5.55.0",
- "svelte-check": "^4.4.5",
+ "prettier": "^3.8.3",
+ "prettier-plugin-svelte": "^3.5.2",
+ "sass": "^1.99.0",
+ "svelte": "^5.55.7",
+ "svelte-check": "^4.4.8",
"svelte-preprocess": "^6.0.3",
"svelte-sequential-preprocessor": "^2.0.3",
- "tldts": "^7.0.27",
+ "tldts": "^7.0.30",
"tslib": "^2.8.1",
"typescript": "^5.9.3",
- "typescript-eslint": "^8.57.2",
+ "typescript-eslint": "^8.59.3",
"vite": "^7.3.1",
"vitest": "^3.2.4"
},
From b3466481dbc91d268b986bfbf924854c86c8c58e Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Mon, 18 May 2026 11:30:31 +0530
Subject: [PATCH 041/320] fix: make impersonated resource urls reactive
---
src/lib/appwrite/impersonation.ts | 30 +++++++++++++++++++++---------
1 file changed, 21 insertions(+), 9 deletions(-)
diff --git a/src/lib/appwrite/impersonation.ts b/src/lib/appwrite/impersonation.ts
index 9f8d6b45f1..5db970dbc6 100644
--- a/src/lib/appwrite/impersonation.ts
+++ b/src/lib/appwrite/impersonation.ts
@@ -1,5 +1,5 @@
import { derived, writable } from 'svelte/store';
-import { building } from '$app/environment';
+import { browser, building } from '$app/environment';
const KEY_TARGET_USER_ID = 'console.impersonation.targetUserId';
const KEY_OPERATOR = 'console.impersonation.operator';
@@ -17,6 +17,9 @@ export type TargetSnapshot = {
email: string;
};
+type ResourceUrl = string | URL;
+type ResourceQueryParams = Record;
+
/**
* Incrementing revision triggers reactive re-fetches after impersonation changes.
* Consumers can depend() on this or subscribe to it.
@@ -67,7 +70,7 @@ export function clearPersistedImpersonation(): void {
}
export function readTargetSnapshot(): TargetSnapshot | null {
- if (building) return null;
+ if (building || !browser) return null;
const raw = sessionStorage.getItem(KEY_TARGET);
if (!raw) return null;
try {
@@ -78,15 +81,17 @@ export function readTargetSnapshot(): TargetSnapshot | null {
}
export function readImpersonationTargetUserId(): string | null {
- if (building) return null;
+ if (building || !browser) return null;
return sessionStorage.getItem(KEY_TARGET_USER_ID);
}
export function createImpersonatedResourceUrl(
- url: string,
- queryParams: Record = {}
+ url: ResourceUrl,
+ queryParams: ResourceQueryParams = {}
): string {
- const parsedUrl = new URL(url, globalThis.location?.origin);
+ const urlString = url.toString();
+ const baseUrl = browser ? window.location.origin : 'http://localhost';
+ const parsedUrl = new URL(urlString, baseUrl);
const targetUserId = readImpersonationTargetUserId();
for (const [key, value] of Object.entries(queryParams)) {
@@ -95,7 +100,13 @@ export function createImpersonatedResourceUrl(
}
}
- if (!targetUserId) return parsedUrl.toString();
+ const isAbsoluteUrl = /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(urlString);
+ const serializedUrl =
+ !browser && !isAbsoluteUrl
+ ? `${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`
+ : parsedUrl.toString();
+
+ if (!targetUserId) return serializedUrl;
parsedUrl.searchParams.set('impersonateUserId', targetUserId);
@@ -104,11 +115,12 @@ export function createImpersonatedResourceUrl(
export const impersonatedResourceUrl = derived(
impersonationRevision,
- () => createImpersonatedResourceUrl
+ () => (url: ResourceUrl, queryParams?: ResourceQueryParams) =>
+ createImpersonatedResourceUrl(url, queryParams)
);
export function readOperatorSnapshot(): OperatorSnapshot | null {
- if (building) return null;
+ if (building || !browser) return null;
const raw = sessionStorage.getItem(KEY_OPERATOR);
if (!raw) return null;
try {
From cf9dba6da20c55cac8eb6ebaf58f686ceb22f26d Mon Sep 17 00:00:00 2001
From: harsh mahajan
Date: Mon, 18 May 2026 11:32:54 +0530
Subject: [PATCH 042/320] fix: override vulnerable devalue version
---
bun.lock | 57 ++++++++++++++++++++++++++--------------------------
package.json | 1 +
2 files changed, 29 insertions(+), 29 deletions(-)
diff --git a/bun.lock b/bun.lock
index 5eb76f6c2d..c85d19e7c4 100644
--- a/bun.lock
+++ b/bun.lock
@@ -11,22 +11,22 @@
"@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3",
"@appwrite.io/pink-legacy": "^1.0.3",
"@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17",
- "@codemirror/autocomplete": "^6.19.0",
- "@codemirror/commands": "^6.9.0",
- "@codemirror/language": "^6.11.3",
- "@codemirror/lint": "^6.9.0",
- "@codemirror/search": "^6.5.11",
- "@codemirror/state": "^6.5.2",
- "@codemirror/view": "^6.38.6",
+ "@codemirror/autocomplete": "^6.20.2",
+ "@codemirror/commands": "^6.10.3",
+ "@codemirror/language": "^6.12.3",
+ "@codemirror/lint": "^6.9.6",
+ "@codemirror/search": "^6.7.0",
+ "@codemirror/state": "^6.6.0",
+ "@codemirror/view": "^6.43.0",
"@faker-js/faker": "^9.9.0",
- "@lezer/highlight": "^1.2.1",
- "@plausible-analytics/tracker": "^0.4.4",
+ "@lezer/highlight": "^1.2.3",
+ "@plausible-analytics/tracker": "^0.4.5",
"@popperjs/core": "^2.11.8",
- "@sentry/sveltekit": "^8.55.1",
+ "@sentry/sveltekit": "^8.55.2",
"@stripe/stripe-js": "^3.5.0",
- "@threlte/core": "^8.5.2",
- "@threlte/extras": "^9.13.0",
- "ai": "^6.0.138",
+ "@threlte/core": "^8.5.14",
+ "@threlte/extras": "^9.18.0",
+ "ai": "^6.0.184",
"analytics": "^0.8.19",
"codemirror-json5": "^1.0.3",
"cron-parser": "^4.9.0",
@@ -36,7 +36,7 @@
"flatted": "^3.4.2",
"ignore": "^6.0.2",
"json5": "^2.2.3",
- "nanoid": "^5.1.7",
+ "nanoid": "^5.1.11",
"nanotar": "^0.3.0",
"pretty-bytes": "^6.1.1",
"remarkable": "^2.0.1",
@@ -47,12 +47,12 @@
"devDependencies": {
"@eslint/compat": "^1.4.1",
"@eslint/js": "^9.39.4",
- "@lezer/common": "^1.5.0",
+ "@lezer/common": "^1.5.2",
"@melt-ui/pp": "^0.3.2",
"@melt-ui/svelte": "^0.86.6",
- "@playwright/test": "^1.58.2",
+ "@playwright/test": "^1.60.0",
"@sveltejs/adapter-static": "^3.0.10",
- "@sveltejs/kit": "^2.57.1",
+ "@sveltejs/kit": "^2.60.1",
"@sveltejs/vite-plugin-svelte": "^5.1.1",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.9.1",
@@ -61,27 +61,27 @@
"@types/deep-equal": "^1.0.4",
"@types/remarkable": "^2.0.8",
"@types/three": "^0.182.0",
- "@typescript-eslint/eslint-plugin": "^8.57.2",
- "@typescript-eslint/parser": "^8.57.2",
+ "@typescript-eslint/eslint-plugin": "^8.59.3",
+ "@typescript-eslint/parser": "^8.59.3",
"@vitest/ui": "^3.2.4",
"color": "^5.0.3",
"eslint": "^9.39.4",
"eslint-config-prettier": "^10.1.8",
- "eslint-plugin-svelte": "^3.16.0",
+ "eslint-plugin-svelte": "^3.17.1",
"globals": "^16.5.0",
"jsdom": "^26.1.0",
"kleur": "^4.1.5",
- "prettier": "^3.8.1",
- "prettier-plugin-svelte": "^3.5.1",
- "sass": "^1.98.0",
- "svelte": "^5.55.0",
- "svelte-check": "^4.4.5",
+ "prettier": "^3.8.3",
+ "prettier-plugin-svelte": "^3.5.2",
+ "sass": "^1.99.0",
+ "svelte": "^5.55.7",
+ "svelte-check": "^4.4.8",
"svelte-preprocess": "^6.0.3",
"svelte-sequential-preprocessor": "^2.0.3",
- "tldts": "^7.0.27",
+ "tldts": "^7.0.30",
"tslib": "^2.8.1",
"typescript": "^5.9.3",
- "typescript-eslint": "^8.57.2",
+ "typescript-eslint": "^8.59.3",
"vite": "^7.3.1",
"vitest": "^3.2.4",
},
@@ -90,6 +90,7 @@
"overrides": {
"brace-expansion": ">=5.0.5",
"cookie": "^0.7.0",
+ "devalue": "^5.8.1",
"flatted": "^3.4.2",
"immutable": "^5.1.5",
"minimatch": "10.2.3",
@@ -1616,8 +1617,6 @@
"svelte-sequential-preprocessor/svelte/aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="],
- "svelte-sequential-preprocessor/svelte/devalue": ["devalue@5.6.4", "", {}, "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA=="],
-
"tough-cookie/tldts/tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="],
"unplugin/chokidar/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="],
diff --git a/package.json b/package.json
index 1c107fdcf9..c1b9df8208 100644
--- a/package.json
+++ b/package.json
@@ -105,6 +105,7 @@
"brace-expansion": ">=5.0.5",
"immutable": "^5.1.5",
"flatted": "^3.4.2",
+ "devalue": "^5.8.1",
"yaml": "^1.10.3",
"picomatch": "^4.0.4",
"cookie": "^0.7.0"
From c68e1108b9be46be856b809649fc698df8dddf34 Mon Sep 17 00:00:00 2001
From: Atharva Deosthale
Date: Mon, 18 May 2026 13:21:14 +0530
Subject: [PATCH 043/320] feat: replace console banner with relationships GA
announcement
Swap Terraform provider promo for the "Database relationships are out of
beta" announcement, linking to the GA blog post.
---
.../promos/relationships-out-of-beta.png | Bin 0 -> 129547 bytes
src/lib/images/promos/terraform-provider.png | Bin 26055 -> 0 bytes
src/routes/(console)/bottomAlerts.ts | 18 +++++++++---------
3 files changed, 9 insertions(+), 9 deletions(-)
create mode 100644 src/lib/images/promos/relationships-out-of-beta.png
delete mode 100644 src/lib/images/promos/terraform-provider.png
diff --git a/src/lib/images/promos/relationships-out-of-beta.png b/src/lib/images/promos/relationships-out-of-beta.png
new file mode 100644
index 0000000000000000000000000000000000000000..180ca1d844239574deac7ac1811b2da5113a9c26
GIT binary patch
literal 129547
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 kiLhVS21$ZZjshh>F?M%
zn>x+$gp?y`+d&&ioyO=RiRDsBr%LvO^c4UB?*ocQKIOf8YI@7HtxG
z197M)^p9YU*X^%={p)bXng16akZV5pfFIb6m8sd#!Siq5k9}h3!$FJ-c_LU}$|gLt
z>9ln`qrG5#$Mx1(cUZrcr_3q?Qhz90>fPO<&(Y??8u_H2n;th(`lQ(+Q+M8RXShdp
z>7FhaEF~YWMu{xZM}m*GZ}Kum(Lah#aJI-VM(j9%C*{m0AOFLLMR|`lfPC3Oe9I^C
z*H~kXaMM5jsrX7Fs`H>f(l-75Z+{QZ%F-;PPx}mhcF_Nzzpxn(%N$&A!3Byjy2*Sg
zt0knoDNEYDBjlqG`K7J1w2ki}zJ$m7M6aIw*kg(lyij-8+~mQBAJY0y-q0hG2eVR$
zi@e_=SgZasm;f?(`yF?vF2zS@$S-q6~d2R^M
z;1TKc^1qhug5T1s9N3ck))MqY6&zit(QTIJU)ZB>#*p(3DQ9q`FdhpVo?R;SRR_!8Iz
z?^XPdpKxl_{^Y*`gvEJJ2gdcwQf5TE^$Lk=E!5=0z
zWY+jlMl<}wVENho4p2`u7K`fNI*TX}Vh~
z0|KUlvS!W$4?U<}g47?BMZA_6_>Nz!;;j^C4<&HV4}D12Si`Vnfpi#{a^|oQ;{>kc
zm-0IJGoMwX)rn$sAwSTXCw$`xI75`|E5sP^+u#0H%Z+J@92m1ugef=97<%yRLTN>2
zM#^9jLjmhqF&NnI6Q2sxUz>`BM%f{K_=$NkK8reoNv#0h46a$Y{0m?BLioXP$AyuL
zR}^&=bQJejr@j`>IQy({kr?XMnzTk(cinZvGRrKZo~kJ8)Qd+Rc|?t-FUyoX2G)3!
zf(aieUXb#9=iA<{-b$~%^h#h?;ifvvS{W(9Gs^YQLk|r<{pnBD`UtOp5Q}3uJ3@~XAsQ=VC3@MZea>amehI|=OM~)QrQsPmD3?6@W$wlE(F$k|K?aI1qt*wJB41AOmMncv@yF)yf
zC~s&oup}L>$paoP$TbEV+OSpvbfH0ef`{{;WKFGCr%%
zVP$ET>jn6&7if1dqEdF`;cHT6v=Nv6_BWNC=4l&+4tcxtzI$|P_QbRPPi2Iul^A`g
zPtX1LSsmaa8yL6nMy3qFOIqyk>Ps(&_lt4r3rBpu;?XVMp0rJQ2C$<3v(dxn4?jZd
zIGY~8%Y69&D*~nUe~QQohKOIurdjlH%Pzm18kHHe^6W7&E=-Y+ImjP0F?2GR#n1*u
zVqpr$eD$dCE@>ZVmx)6#ypeGN=Xnx;@4Y^v#$uKj-~$x0%d_#~arfkN{|%>~b!NEa
z(o41fqOZl^fboiQ=Zs+xoG~6R;9bF#O?7U&?KY*OiDmdl-DSG+__5>kgVYGg7kb3N
z*a6)n<>b>&4NHw5zV0q$;bFgh_YM2)w_oMshTza_Am1F*r^*Ib;{A(f`;U%4UfK~^
z