From 90057188f2ebce0327dca2ab6af9380f6ba9fb44 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 21 Jul 2026 17:33:31 +0530 Subject: [PATCH 1/8] fix(databases): remove leftover per-table Usage tab Same cleanup as #3128, one level down: the per-table Usage tab still called tablesDB.getTableUsage(), which is going away with the backend usage-endpoint removal and is already showing empty data on cloud. --- .../table-[table]/header.svelte | 6 ------ .../usage/[[period]]/+page.svelte | 11 ----------- .../table-[table]/usage/[[period]]/+page.ts | 18 ------------------ 3 files changed, 35 deletions(-) delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/usage/[[period]]/+page.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/usage/[[period]]/+page.ts diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/header.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/header.svelte index b408f6d22b..5c4463f04b 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/header.svelte @@ -32,12 +32,6 @@ title: 'Indexes', event: 'indexes' }, - { - href: `${path}/usage`, - title: 'Usage', - event: 'usage', - hasChildren: true - }, { href: `${path}/settings`, title: 'Settings', diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/usage/[[period]]/+page.svelte deleted file mode 100644 index a8d8fdb0b0..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/usage/[[period]]/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/usage/[[period]]/+page.ts deleted file mode 100644 index 2881862b8f..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/usage/[[period]]/+page.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { isValueOfStringEnum } from '$lib/helpers/types'; -import { sdk } from '$lib/stores/sdk'; -import { UsageRange } from '@appwrite.io/console'; -import type { PageLoad } from './$types'; - -export const load: PageLoad = async ({ params }) => { - const period = isValueOfStringEnum(UsageRange, params.period) - ? params.period - : UsageRange.ThirtyDays; - - return { - ...(await sdk.forProject(params.region, params.project).tablesDB.getTableUsage({ - databaseId: params.database, - tableId: params.table, - range: period - })) - }; -}; From 6c104c03d79569e9de3cd089c2da64a3b0686692 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 21 Jul 2026 17:38:05 +0530 Subject: [PATCH 2/8] fix(databases): remove dangling table usage command-center shortcut The "Go to usage" (g u) shortcut pointed at the table usage route removed earlier in this branch, leaving a broken command. --- .../database-[database]/table-[table]/+layout.svelte | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte index 6bd8212f66..57e32165ba 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte @@ -204,15 +204,6 @@ disabled: page.url.pathname.endsWith('indexes'), group: 'tables' }, - { - label: 'Go to usage', - keys: ['g', 'u'], - callback() { - goto(withPath(basePath, '/usage')); - }, - disabled: page.url.pathname.endsWith('usage'), - group: 'tables' - }, { label: 'Go to settings', keys: ['g', 's'], From 8d5f6cbac4245ec3e8901ce9cac548ed0cb97d52 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 21 Jul 2026 17:41:01 +0530 Subject: [PATCH 3/8] fix(databases): remove orphaned shared entity Usage view Only the table usage page consumed this component; it's now dead code after removing that route. --- .../database-[database]/(entity)/index.ts | 1 - .../(entity)/views/usage/view.svelte | 47 ------------------- 2 files changed, 48 deletions(-) delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/usage/view.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts index 8437673d36..e2964fbdd6 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts @@ -7,6 +7,5 @@ export * from './views/settings'; export { default as Header } from './views/header.svelte'; export { default as Breadcrumbs } from './views/breadcrumbs.svelte'; -export { default as Usage } from './views/usage/view.svelte'; export { default as CreateEntity } from './views/create.svelte'; export { default as FailedModal } from './views/failedModal.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/usage/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/usage/view.svelte deleted file mode 100644 index c47c8da008..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/usage/view.svelte +++ /dev/null @@ -1,47 +0,0 @@ - - -
- - - -
From ac4672ec6cc6bfce3f93d24a3fb386780ad24dd8 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 21 Jul 2026 17:41:40 +0530 Subject: [PATCH 4/8] fix(databases): remove leftover per-database Usage tab Same cleanup as #3128/#3130: removes the per-database Usage tab (database-[database]/usage) and its command-center shortcut. It called tablesDB.getUsage(), which is going away with the backend usage-endpoint removal. --- .../database-[database]/+layout.svelte | 12 ------ .../database-[database]/header.svelte | 6 --- .../usage/[[period]]/+page.svelte | 41 ------------------- .../usage/[[period]]/+page.ts | 17 -------- 4 files changed, 76 deletions(-) delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/usage/[[period]]/+page.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/usage/[[period]]/+page.ts diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.svelte index 5109887944..05312ab837 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.svelte @@ -147,18 +147,6 @@ keys: ['g', 'c'], group: 'databases' }, - { - label: 'Go to usage', - callback() { - goto( - `${base}/project-${page.params.region}-${project}/databases/database-${databaseId}/usage` - ); - }, - disabled: - page.url.pathname.includes('/usage') || page.url.pathname.includes('table-'), - keys: ['g', 'u'], - group: 'databases' - }, { label: 'Go to backups', callback() { diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte index 1d3ded6c0d..7bd3d0756a 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte @@ -34,12 +34,6 @@ event: 'backups', hasChildren: true }, - { - href: withPath(baseDatabasePath, '/usage'), - title: 'Usage', - event: 'usage', - hasChildren: true - }, { href: withPath(baseDatabasePath, '/settings'), event: 'settings', diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/usage/[[period]]/+page.svelte deleted file mode 100644 index 3563aba6ed..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/usage/[[period]]/+page.svelte +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/usage/[[period]]/+page.ts deleted file mode 100644 index 9391c5451a..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/usage/[[period]]/+page.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { isValueOfStringEnum } from '$lib/helpers/types'; -import { sdk } from '$lib/stores/sdk'; -import { UsageRange } from '@appwrite.io/console'; -import type { PageLoad } from './$types'; - -export const load: PageLoad = async ({ params }) => { - const period = isValueOfStringEnum(UsageRange, params.period) - ? params.period - : UsageRange.ThirtyDays; - - return { - ...(await sdk.forProject(params.region, params.project).tablesDB.getUsage({ - databaseId: params.database, - range: period - })) - }; -}; From de3deb88c0bb003be5a2a3c1b5048b10d866a792 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 21 Jul 2026 17:47:59 +0530 Subject: [PATCH 5/8] fix: remove remaining per-resource Usage tabs and shortcuts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes the Usage tab/route and its g-u command-center shortcut for buckets, functions, sites, and auth — the same cleanup already done for databases (#3128/#3130/#3131). Project-level billing usage (settings/usage) is untouched. --- src/lib/commandCenter/searchers/functions.ts | 10 ---- .../auth/+layout.svelte | 10 ---- .../auth/header.svelte | 6 -- .../auth/usage/[[period]]/+page.svelte | 20 ------- .../auth/usage/[[period]]/+page.ts | 14 ----- .../function-[function]/+layout.svelte | 12 ---- .../function-[function]/header.svelte | 6 -- .../usage/[[period]]/+page.svelte | 56 ------------------- .../usage/[[period]]/+page.ts | 17 ------ .../site-[site]/deployments/+layout.svelte | 12 ---- .../site-[site]/usage/[[period]]/+page.svelte | 7 --- .../site-[site]/usage/[[period]]/+page.ts | 3 - .../storage/bucket-[bucket]/+layout.svelte | 12 ---- .../usage/[[period]]/+page.svelte | 5 -- .../bucket-[bucket]/usage/[[period]]/+page.ts | 3 - 15 files changed, 193 deletions(-) delete mode 100644 src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.ts delete mode 100644 src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.ts delete mode 100644 src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts delete mode 100644 src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts diff --git a/src/lib/commandCenter/searchers/functions.ts b/src/lib/commandCenter/searchers/functions.ts index d28992964e..0e708d5a96 100644 --- a/src/lib/commandCenter/searchers/functions.ts +++ b/src/lib/commandCenter/searchers/functions.ts @@ -56,16 +56,6 @@ export const functionsSearcher = (async (query: string) => { }, group: 'functions' }, - { - label: 'Go to usage', - nested: true, - callback() { - goto( - `${base}/project-${page.params.region}-${projectId}/functions/function-${func.$id}/usage` - ); - }, - group: 'functions' - }, { label: 'Go to executions', nested: true, diff --git a/src/routes/(console)/project-[region]-[project]/auth/+layout.svelte b/src/routes/(console)/project-[region]-[project]/auth/+layout.svelte index 2c8c7a904d..ddfdd3d56a 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/+layout.svelte @@ -58,16 +58,6 @@ rank: 1, disabled: page.url.pathname.endsWith('teams') }, - { - label: 'Go to usage', - keys: ['g', 'u'], - callback: async () => { - await goto(withPath(authProjectRoute, '/usage')); - }, - group: 'navigation', - rank: 1, - disabled: page.url.pathname.endsWith('usage') - }, { label: 'Go to security', keys: ['g', 'e'], diff --git a/src/routes/(console)/project-[region]-[project]/auth/header.svelte b/src/routes/(console)/project-[region]-[project]/auth/header.svelte index bb425c2b54..4c2cddbb39 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/header.svelte @@ -34,12 +34,6 @@ event: 'templates', disabled: !$canWriteProjects }, - { - href: `${path}/usage`, - title: 'Usage', - hasChildren: true, - event: 'usage' - }, { href: `${path}/settings`, title: 'Settings', diff --git a/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.svelte deleted file mode 100644 index 9879c54e4d..0000000000 --- a/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - - - - diff --git a/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.ts deleted file mode 100644 index 7356f8c309..0000000000 --- a/src/routes/(console)/project-[region]-[project]/auth/usage/[[period]]/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { isValueOfStringEnum } from '$lib/helpers/types'; -import { sdk } from '$lib/stores/sdk'; -import { UsageRange } from '@appwrite.io/console'; -import type { PageLoad } from './$types'; - -export const load: PageLoad = async ({ params }) => { - const period = isValueOfStringEnum(UsageRange, params.period) - ? params.period - : UsageRange.ThirtyDays; - - return { - ...(await sdk.forProject(params.region, params.project).users.getUsage({ range: period })) - }; -}; diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/+layout.svelte index 24aadfb532..5bbf865c2f 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/+layout.svelte @@ -131,18 +131,6 @@ rank: 10, disabled: page.url.pathname.endsWith($func.$id) }, - { - label: 'Go to usage', - callback() { - goto( - `${base}/project-${page.params.region}-${page.params.project}/functions/function-${$func.$id}/usage` - ); - }, - keys: ['g', 'u'], - group: 'navigation', - rank: 10, - disabled: page.url.pathname.endsWith('usage') - }, { label: 'Go to executions', callback() { diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/header.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/header.svelte index 22f1ac8671..2dbc394bd4 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/header.svelte @@ -28,12 +28,6 @@ title: 'Domains', event: 'domains' }, - { - href: `${path}/usage`, - title: 'Usage', - event: 'usage', - hasChildren: true - }, { href: `${path}/settings`, event: 'settings', diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte deleted file mode 100644 index 4a1316b98e..0000000000 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte +++ /dev/null @@ -1,56 +0,0 @@ - - - - - {#if count.length} - - {/if} - - {#if executionsTime.length} - - {/if} - - diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.ts deleted file mode 100644 index 3ac7b0bde9..0000000000 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { sdk } from '$lib/stores/sdk'; -import { UsageRange } from '@appwrite.io/console'; -import type { PageLoad } from './$types'; -import { isValueOfStringEnum } from '$lib/helpers/types'; - -export const load: PageLoad = async ({ params }) => { - const period = isValueOfStringEnum(UsageRange, params.period) - ? params.period - : UsageRange.ThirtyDays; - - return { - ...(await sdk.forProject(params.region, params.project).functions.getUsage({ - functionId: params.function, - range: period - })) - }; -}; diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+layout.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+layout.svelte index 64a7454fa3..a0452b110d 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+layout.svelte @@ -90,18 +90,6 @@ rank: 10, disabled: page.url.pathname.endsWith('deployments') }, - { - label: 'Go to usage', - callback() { - goto( - `${base}/project-${$project.region}-${$project.$id}/sites/site-${page.params.site}/usage` - ); - }, - keys: ['g', 'u'], - group: 'navigation', - rank: 10, - disabled: page.url.pathname.endsWith('usage') - }, { label: 'Go to logs', callback() { diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.svelte deleted file mode 100644 index cb464c166c..0000000000 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts deleted file mode 100644 index 80b1ec6bf5..0000000000 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { PageLoad } from './$types'; - -export const load: PageLoad = async () => ({}); diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+layout.svelte index 5988aa94c1..b919dc87ea 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+layout.svelte @@ -74,18 +74,6 @@ group: 'navigation', rank: 10 }, - { - label: 'Go to usage', - callback() { - goto( - `${base}/project-${$project.region}-${$project.$id}/storage/bucket-${$bucket.$id}/usage` - ); - }, - disabled: page.url.pathname.endsWith('usage'), - keys: ['g', 'u'], - group: 'navigation', - rank: 10 - }, { label: 'Go to settings', callback() { diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.svelte deleted file mode 100644 index 3ef899e530..0000000000 --- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts deleted file mode 100644 index 80b1ec6bf5..0000000000 --- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { PageLoad } from './$types'; - -export const load: PageLoad = async () => ({}); From 7d3815284b406e766ba7734761bc29d0b3311681 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 21 Jul 2026 17:52:23 +0530 Subject: [PATCH 6/8] fix: bump brace-expansion/js-yaml overrides to clear high-severity audit bun audit --audit-level high was failing CI on transitive deps pulled in by eslint and @sentry/vite-plugin. Existing brace-expansion override didn't cover the patched range; added a js-yaml override. --- bun.lock | 13 +++++++------ package.json | 3 ++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/bun.lock b/bun.lock index 03a18eb5a5..21c500a1a3 100644 --- a/bun.lock +++ b/bun.lock @@ -90,11 +90,12 @@ }, }, "overrides": { - "brace-expansion": ">=5.0.5", + "brace-expansion": ">=5.0.7", "cookie": "^0.7.0", "devalue": "^5.8.1", "flatted": "^3.4.2", "immutable": "^5.1.5", + "js-yaml": "^4.3.0", "minimatch": "10.2.3", "picomatch": "^4.0.4", "vite": "npm:rolldown-vite@latest", @@ -128,15 +129,15 @@ "@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@6be9e62", { "dependencies": { "json-bigint": "1.0.0" } }, "sha512-XvEyYAb9HtcySeLgn5ZxVCEBhzxSCXfQurcSVp6Wnj1amBFx5CWsKhfWHelG9DxFG9SkeHmY+bTcZneOAhgBkw=="], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@6be9e62", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], - "@appwrite.io/pink-icons-svelte": ["@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", { "peerDependencies": { "svelte": "^4.0.0" } }, "sha512-2HYl/CC2OlfZIR7LzbLXuSPBn0iNkjbnxpaeGCkZ7UNZ/hFeSeeWjDJqTBMdZ8+X95uuZqHx62XPTiE/svuSXQ=="], + "@appwrite.io/pink-icons-svelte": ["@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", { "peerDependencies": { "svelte": "^4.0.0" } }], "@appwrite.io/pink-legacy": ["@appwrite.io/pink-legacy@1.0.3", "", { "dependencies": { "@appwrite.io/pink-icons": "1.0.0", "the-new-css-reset": "^1.11.2" } }, "sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ=="], - "@appwrite.io/pink-svelte": ["@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17", { "dependencies": { "@appwrite.io/pink-icons-svelte": "2.0.0-RC.1", "@floating-ui/dom": "^1.6.13", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.6", "@tanstack/svelte-virtual": "^3.13.10", "ansicolor": "^2.0.3", "d3": "^7.9.0", "fuse.js": "^7.1.0", "pretty-bytes": "^6.1.1", "shiki": "^1.18.0", "svelte-motion": "^0.12.2", "svelte-sonner": "^0.3.28" }, "peerDependencies": { "svelte": "^4.0.0" } }, "sha512-rw3zXN7/cUciCnhj0FR8M0H5Db+LYYMaKtPxvOAIMxNTBmStzU8kTw6grqIvdtFu9vybIsjKtIwm9QLHpNDBjA=="], + "@appwrite.io/pink-svelte": ["@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17", { "dependencies": { "@appwrite.io/pink-icons-svelte": "2.0.0-RC.1", "@floating-ui/dom": "^1.6.13", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.6", "@tanstack/svelte-virtual": "^3.13.10", "ansicolor": "^2.0.3", "d3": "^7.9.0", "fuse.js": "^7.1.0", "pretty-bytes": "^6.1.1", "shiki": "^1.18.0", "svelte-motion": "^0.12.2", "svelte-sonner": "^0.3.28" }, "peerDependencies": { "svelte": "^4.0.0" } }], "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.2.0", "", { "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw=="], @@ -648,7 +649,7 @@ "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], - "brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], + "brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], @@ -1022,7 +1023,7 @@ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + "js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], "jsdom": ["jsdom@26.1.0", "", { "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.5.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.16", "parse5": "^7.2.1", "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.1.1", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.1.1", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg=="], diff --git a/package.json b/package.json index 1623eb16e0..ccde1e9adc 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,8 @@ "overrides": { "vite": "npm:rolldown-vite@latest", "minimatch": "10.2.3", - "brace-expansion": ">=5.0.5", + "brace-expansion": ">=5.0.7", + "js-yaml": "^4.3.0", "immutable": "^5.1.5", "flatted": "^3.4.2", "devalue": "^5.8.1", From a0ee4324ef9631007421cb5173ea2eee4ceaabaa Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 21 Jul 2026 18:02:14 +0530 Subject: [PATCH 7/8] fix: remove orphaned shared usage components and breadcrumb entry Removing every remaining usage/[[period]] route in this branch left the shared Usage/UsageMultiple components (src/lib/layout) with no consumers, which also broke type-checking since no route defines a `period` param anymore. Extracted the still-used helper functions (periodToDates, total, etc.) to a plain usageHelpers.ts and deleted the dead components. Also removed a leftover "Usage" sub-navigation entry in the database store. --- src/lib/layout/index.ts | 3 +- src/lib/layout/usage.svelte | 145 ------------------ src/lib/layout/usageHelpers.ts | 68 ++++++++ src/lib/layout/usageMultiple.svelte | 99 ------------ .../usage/[[invoice]]/+page.svelte | 2 +- .../databases/database-[database]/store.ts | 3 +- .../overview/+layout.svelte | 2 +- .../settings/usage/[[invoice]]/+page.svelte | 2 +- 8 files changed, 73 insertions(+), 251 deletions(-) delete mode 100644 src/lib/layout/usage.svelte create mode 100644 src/lib/layout/usageHelpers.ts delete mode 100644 src/lib/layout/usageMultiple.svelte diff --git a/src/lib/layout/index.ts b/src/lib/layout/index.ts index d280202090..004b68fbb7 100644 --- a/src/lib/layout/index.ts +++ b/src/lib/layout/index.ts @@ -10,8 +10,7 @@ export { default as WizardWithSteps } from './wizardWithSteps.svelte'; export { default as WizardStep } from './wizardStep.svelte'; export { default as Breadcrumbs } from './breadcrumbs.svelte'; export { default as Unauthenticated } from './unauthenticated.svelte'; -export { default as Usage, type UsagePeriods } from './usage.svelte'; -export { default as UsageMultiple } from './usageMultiple.svelte'; +export type { UsagePeriods } from './usageHelpers'; export { default as Progress } from './progress.svelte'; export { default as GridHeader } from './gridHeader.svelte'; export { default as ContainerHeader } from './containerHeader.svelte'; diff --git a/src/lib/layout/usage.svelte b/src/lib/layout/usage.svelte deleted file mode 100644 index 9f5889b046..0000000000 --- a/src/lib/layout/usage.svelte +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - {#if !hidePeriodSelect} -
- goto(`${path}/${e.detail}`)} - id="period" - options={[ - { - label: '24 hours', - value: '24h' - }, - { - label: '30 days', - value: '30d' - }, - { - label: '90 days', - value: '90d' - } - ]} - value={page.params.period ?? '30d'} /> -
- {/if} - - {#if count} - - {formatNumberWithCommas(total)} - {countMetadata.title} - -
- [m.date, m.value]) - : accumulateFromEndingTotal(count, total) - } - ]} /> -
- {/if} -
-
- - diff --git a/src/lib/layout/usageHelpers.ts b/src/lib/layout/usageHelpers.ts new file mode 100644 index 0000000000..61c457ef39 --- /dev/null +++ b/src/lib/layout/usageHelpers.ts @@ -0,0 +1,68 @@ +import { ProjectUsageRange, type Models } from '@appwrite.io/console'; + +export type UsagePeriods = '24h' | '30d' | '90d'; + +export function periodToDates(period: UsagePeriods): { + start: string; + end: string; + period: ProjectUsageRange; +} { + const start = new Date(); + switch (period) { + case '24h': + start.setUTCHours(start.getHours() - 24); + break; + case '30d': + start.setUTCHours(0, 0, 0, 0); + start.setUTCDate(start.getDate() - 30); + break; + case '90d': + start.setUTCHours(0, 0, 0, 0); + start.setUTCDate(start.getDate() - 90); + break; + } + const end = new Date(); + end.setUTCDate(end.getUTCDate() + 1); + end.setUTCHours(0, 0, 0, 0); + return { + start: start.toISOString(), + end: end.toISOString(), + period: period === '24h' ? ProjectUsageRange.OneHour : ProjectUsageRange.OneDay + }; +} + +export function last(set: Models.Metric[]): Models.Metric | null { + if (!set) return null; + return set.slice(-1)[0] ?? null; +} + +export function total(set: Models.Metric[]): number { + return set?.reduce((prev, curr) => prev + curr.value, 0) ?? 0; +} + +export function accumulateFromEndingTotal( + metrics: Models.Metric[], + endingTotal: number, + startingDayToFillZero: Date = null +): Array<[string, number]> { + return (metrics ?? []).reduceRight( + (acc, curr) => { + if (startingDayToFillZero !== null && startingDayToFillZero instanceof Date) { + const date = new Date(curr.date); + if (date > startingDayToFillZero) { + acc.data.unshift([date.toISOString(), 0]); + acc.total -= 0; + + return acc; + } + } + acc.data.unshift([curr.date, acc.total]); + acc.total -= curr.value; + return acc; + }, + { + total: endingTotal, + data: [] + } + ).data; +} diff --git a/src/lib/layout/usageMultiple.svelte b/src/lib/layout/usageMultiple.svelte deleted file mode 100644 index ff1789c49a..0000000000 --- a/src/lib/layout/usageMultiple.svelte +++ /dev/null @@ -1,99 +0,0 @@ - - -
- {#if showHeader} -
- {title} - - {#if path} - - - 24h - - - 30d - - - 90d - - - {/if} -
- {/if} - - - {#if count} - - {formatNumberWithCommas(totalCount)} - Total {title.toLocaleLowerCase()} - -
- - - {#if legendData} - - {/if} -
- {/if} -
-
- - diff --git a/src/routes/(console)/organization-[organization]/usage/[[invoice]]/+page.svelte b/src/routes/(console)/organization-[organization]/usage/[[invoice]]/+page.svelte index 874cc23ec1..cdee868486 100644 --- a/src/routes/(console)/organization-[organization]/usage/[[invoice]]/+page.svelte +++ b/src/routes/(console)/organization-[organization]/usage/[[invoice]]/+page.svelte @@ -15,7 +15,7 @@ import { organization } from '$lib/stores/organization'; import ProjectBreakdown from './ProjectBreakdown.svelte'; import { formatNum } from '$lib/helpers/string'; - import { accumulateFromEndingTotal, total } from '$lib/layout/usage.svelte'; + import { accumulateFromEndingTotal, total } from '$lib/layout/usageHelpers'; import { Click, trackEvent } from '$lib/actions/analytics'; import TotalMembers from './totalMembers.svelte'; import { formatCurrency, formatNumberWithCommas } from '$lib/helpers/numbers'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/store.ts index a34a5d001d..1a378fe435 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/store.ts @@ -1,6 +1,6 @@ import { writable } from 'svelte/store'; import type { Column } from '$lib/helpers/types'; -import { IconChartBar, IconCloudUpload, IconCog } from '@appwrite.io/pink-icons-svelte'; +import { IconCloudUpload, IconCog } from '@appwrite.io/pink-icons-svelte'; import { resolveRoute, withPath } from '$lib/stores/navigation'; import type { Page } from '@sveltejs/kit'; import { type Models, Query } from '@appwrite.io/console'; @@ -104,7 +104,6 @@ export const customRetainingOptions = [ export const databaseSubNavigationItems = [ { title: 'Backups', href: 'backups', icon: IconCloudUpload }, - { title: 'Usage', href: 'usage', icon: IconChartBar }, { title: 'Settings', href: 'settings', icon: IconCog } ]; diff --git a/src/routes/(console)/project-[region]-[project]/overview/+layout.svelte b/src/routes/(console)/project-[region]-[project]/overview/+layout.svelte index 6f52422be6..059310af00 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/+layout.svelte @@ -22,7 +22,7 @@ import Bandwidth from './bandwidth.svelte'; import Requests from './requests.svelte'; import { usage } from './store'; - import { periodToDates } from '$lib/layout/usage.svelte'; + import { periodToDates } from '$lib/layout/usageHelpers'; import { canWriteProjects } from '$lib/stores/roles'; import { Card, Layout, Typography } from '@appwrite.io/pink-svelte'; import { writable, type Writable } from 'svelte/store'; diff --git a/src/routes/(console)/project-[region]-[project]/settings/usage/[[invoice]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/usage/[[invoice]]/+page.svelte index b6d5350784..085865d6de 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/usage/[[invoice]]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/usage/[[invoice]]/+page.svelte @@ -12,7 +12,7 @@ import { bytesToSize, humanFileSize, mbSecondsToGBHours } from '$lib/helpers/sizeConvertion'; import { BarChart, Legend } from '$lib/charts'; import { formatNum } from '$lib/helpers/string'; - import { total } from '$lib/layout/usage.svelte'; + import { total } from '$lib/layout/usageHelpers'; import { base } from '$app/paths'; import { formatCurrency, formatNumberWithCommas, clampMin } from '$lib/helpers/numbers'; import { getCountryName } from '$lib/helpers/diallingCodes.js'; From cbd4e8d4e9a099ada804acd13f109eea83185059 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 21 Jul 2026 18:08:25 +0530 Subject: [PATCH 8/8] fix: restore integrity checksums for pkg.vc-hosted packages in bun.lock A prior bun update/install cycle on this branch stripped the sha512 checksums for @appwrite.io/console, pink-icons-svelte, and pink-svelte (flagged in review). Restored them to match main's pinned versions. --- bun.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 21c500a1a3..8db6da9fae 100644 --- a/bun.lock +++ b/bun.lock @@ -129,15 +129,15 @@ "@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@6be9e62", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@6be9e62", { "dependencies": { "json-bigint": "1.0.0" } }, "sha512-XvEyYAb9HtcySeLgn5ZxVCEBhzxSCXfQurcSVp6Wnj1amBFx5CWsKhfWHelG9DxFG9SkeHmY+bTcZneOAhgBkw=="], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], - "@appwrite.io/pink-icons-svelte": ["@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", { "peerDependencies": { "svelte": "^4.0.0" } }], + "@appwrite.io/pink-icons-svelte": ["@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", { "peerDependencies": { "svelte": "^4.0.0" } }, "sha512-2HYl/CC2OlfZIR7LzbLXuSPBn0iNkjbnxpaeGCkZ7UNZ/hFeSeeWjDJqTBMdZ8+X95uuZqHx62XPTiE/svuSXQ=="], "@appwrite.io/pink-legacy": ["@appwrite.io/pink-legacy@1.0.3", "", { "dependencies": { "@appwrite.io/pink-icons": "1.0.0", "the-new-css-reset": "^1.11.2" } }, "sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ=="], - "@appwrite.io/pink-svelte": ["@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17", { "dependencies": { "@appwrite.io/pink-icons-svelte": "2.0.0-RC.1", "@floating-ui/dom": "^1.6.13", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.6", "@tanstack/svelte-virtual": "^3.13.10", "ansicolor": "^2.0.3", "d3": "^7.9.0", "fuse.js": "^7.1.0", "pretty-bytes": "^6.1.1", "shiki": "^1.18.0", "svelte-motion": "^0.12.2", "svelte-sonner": "^0.3.28" }, "peerDependencies": { "svelte": "^4.0.0" } }], + "@appwrite.io/pink-svelte": ["@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17", { "dependencies": { "@appwrite.io/pink-icons-svelte": "2.0.0-RC.1", "@floating-ui/dom": "^1.6.13", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.6", "@tanstack/svelte-virtual": "^3.13.10", "ansicolor": "^2.0.3", "d3": "^7.9.0", "fuse.js": "^7.1.0", "pretty-bytes": "^6.1.1", "shiki": "^1.18.0", "svelte-motion": "^0.12.2", "svelte-sonner": "^0.3.28" }, "peerDependencies": { "svelte": "^4.0.0" } }, "sha512-rw3zXN7/cUciCnhj0FR8M0H5Db+LYYMaKtPxvOAIMxNTBmStzU8kTw6grqIvdtFu9vybIsjKtIwm9QLHpNDBjA=="], "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.2.0", "", { "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw=="],