From 9941e3ce49d769b717a4f2fbadf12a187861f0f1 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 25 Jan 2026 16:12:10 +0530 Subject: [PATCH 1/7] fix: bigint and number conflicts. --- package.json | 6 +- pnpm-lock.yaml | 57 ++++++++++++------- src/lib/elements/forms/inputNumber.svelte | 6 +- src/lib/helpers/faker.ts | 11 ++-- src/lib/helpers/numbers.ts | 4 ++ .../table-[table]/columns/integer.svelte | 4 +- .../rows/columns/types/integer.svelte | 6 -- 7 files changed, 55 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index 2aa9397735..96897871ff 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,11 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@e621876", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95675c4", "@appwrite.io/pink-icons": "0.25.0", - "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bbad65f", + "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@b2b1cfe", "@appwrite.io/pink-legacy": "^1.0.3", - "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@bbad65f", + "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@b2b1cfe", "@faker-js/faker": "^9.9.0", "@plausible-analytics/tracker": "^0.4.4", "@popperjs/core": "^2.11.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b77df6078..06876e537b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,20 +12,20 @@ importers: specifier: ^1.1.24 version: 1.1.24(svelte@5.25.3)(zod@3.24.3) '@appwrite.io/console': - specifier: https://pkg.vc/-/@appwrite/@appwrite.io/console@e621876 - version: https://pkg.vc/-/@appwrite/@appwrite.io/console@e621876 + specifier: https://pkg.vc/-/@appwrite/@appwrite.io/console@95675c4 + version: https://pkg.vc/-/@appwrite/@appwrite.io/console@95675c4 '@appwrite.io/pink-icons': specifier: 0.25.0 version: 0.25.0 '@appwrite.io/pink-icons-svelte': - specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bbad65f - version: https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bbad65f(svelte@5.25.3) + specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@b2b1cfe + version: https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@b2b1cfe(svelte@5.25.3) '@appwrite.io/pink-legacy': specifier: ^1.0.3 version: 1.0.3 '@appwrite.io/pink-svelte': - specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@bbad65f - version: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@bbad65f(svelte@5.25.3) + specifier: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@b2b1cfe + version: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@b2b1cfe(svelte@5.25.3) '@faker-js/faker': specifier: ^9.9.0 version: 9.9.0 @@ -272,8 +272,8 @@ packages: '@analytics/type-utils@0.6.2': resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==} - '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@e621876': - resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/console@e621876} + '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@95675c4': + resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/console@95675c4} version: 2.1.0 '@appwrite.io/pink-icons-svelte@2.0.0-RC.1': @@ -281,8 +281,8 @@ packages: peerDependencies: svelte: ^4.0.0 - '@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bbad65f': - resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bbad65f} + '@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@b2b1cfe': + resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@b2b1cfe} version: 2.0.0-RC.1 peerDependencies: svelte: ^4.0.0 @@ -296,8 +296,8 @@ packages: '@appwrite.io/pink-legacy@1.0.3': resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==} - '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@bbad65f': - resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@bbad65f} + '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@b2b1cfe': + resolution: {tarball: https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@b2b1cfe} version: 2.0.0-RC.2 peerDependencies: svelte: ^4.0.0 @@ -1730,6 +1730,12 @@ packages: bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + bignumber.js@9.0.0: + resolution: {integrity: sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -1885,9 +1891,6 @@ packages: resolution: {integrity: sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==} engines: {node: '>=18'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -2603,6 +2606,9 @@ packages: engines: {node: '>=6'} hasBin: true + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -3828,13 +3834,16 @@ snapshots: '@analytics/type-utils@0.6.2': {} - '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@e621876': {} + '@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@95675c4': + dependencies: + bignumber.js: 9.0.0 + json-bigint: 1.0.0 '@appwrite.io/pink-icons-svelte@2.0.0-RC.1(svelte@5.25.3)': dependencies: svelte: 5.25.3 - '@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bbad65f(svelte@5.25.3)': + '@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@b2b1cfe(svelte@5.25.3)': dependencies: svelte: 5.25.3 @@ -3847,7 +3856,7 @@ snapshots: '@appwrite.io/pink-icons': 1.0.0 the-new-css-reset: 1.11.3 - '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@bbad65f(svelte@5.25.3)': + '@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@b2b1cfe(svelte@5.25.3)': dependencies: '@appwrite.io/pink-icons-svelte': 2.0.0-RC.1(svelte@5.25.3) '@floating-ui/dom': 1.6.13 @@ -5063,7 +5072,7 @@ snapshots: '@types/react@18.3.23': dependencies: '@types/prop-types': 15.7.15 - csstype: 3.1.3 + csstype: 3.2.3 '@types/remarkable@2.0.8': {} @@ -5467,6 +5476,10 @@ snapshots: dependencies: require-from-string: 2.0.2 + bignumber.js@9.0.0: {} + + bignumber.js@9.3.1: {} + binary-extensions@2.3.0: {} brace-expansion@1.1.11: @@ -5625,8 +5638,6 @@ snapshots: '@asamuzakjp/css-color': 3.1.1 rrweb-cssom: 0.8.0 - csstype@3.1.3: {} - csstype@3.2.3: {} d3-array@3.2.4: @@ -6418,6 +6429,10 @@ snapshots: jsesc@3.1.0: {} + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} diff --git a/src/lib/elements/forms/inputNumber.svelte b/src/lib/elements/forms/inputNumber.svelte index a95f156fe4..0a465e5054 100644 --- a/src/lib/elements/forms/inputNumber.svelte +++ b/src/lib/elements/forms/inputNumber.svelte @@ -5,15 +5,15 @@ export let label: string = null; export let id: string; export let name = id; - export let value: number = null; + export let value: number | bigint = null; export let placeholder = ''; export let required = false; export let nullable = false; export let disabled = false; export let readonly = false; export let autofocus = false; - export let min: number = null; - export let max: number = null; + export let min: number | bigint = null; + export let max: number | bigint = null; export let step: number | 'any' = 1; export let helper: string = undefined; export let leadingIcon: ComponentType | undefined = undefined; diff --git a/src/lib/helpers/faker.ts b/src/lib/helpers/faker.ts index 99444f81e3..e05cbc85d3 100644 --- a/src/lib/helpers/faker.ts +++ b/src/lib/helpers/faker.ts @@ -2,8 +2,8 @@ import { sdk } from '$lib/stores/sdk'; import { faker } from '@faker-js/faker'; import type { NestedNumberArray } from './types'; import { ID, type Models } from '@appwrite.io/console'; -import { isWithinSafeRange } from '$lib/helpers/numbers'; import type { DatabaseType, Field } from '$database/(entity)'; +import { coerceToNumber, isWithinSafeRange } from '$lib/helpers/numbers'; export async function generateFields( project: Models.Project, @@ -213,10 +213,13 @@ function generateSingleValue(field: Field): string | number | boolean | NestedNu case 'integer': { const intAttr = field as Models.ColumnInteger; - const min = isWithinSafeRange(intAttr.min) ? intAttr.min : 0; + const minCompat = coerceToNumber(intAttr.min); + const maxCompat = coerceToNumber(intAttr.max); + + const min = isWithinSafeRange(minCompat) ? minCompat : 0; const fallbackMax = Math.max(min + 100, 100); - const max = isWithinSafeRange(intAttr.max) - ? intAttr.max + const max = isWithinSafeRange(maxCompat) + ? maxCompat : Math.min(fallbackMax, Number.MAX_SAFE_INTEGER); return faker.number.int({ min, max }); } diff --git a/src/lib/helpers/numbers.ts b/src/lib/helpers/numbers.ts index a3ad303b51..42651e2b6d 100644 --- a/src/lib/helpers/numbers.ts +++ b/src/lib/helpers/numbers.ts @@ -42,6 +42,10 @@ export function isWithinSafeRange(val: number) { return Math.abs(val) < Number.MAX_SAFE_INTEGER; } +export function coerceToNumber(val: number | bigint) { + return Number(val); +} + /** * Clamps a number to a minimum value * diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/integer.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/integer.svelte index 38a0335e44..3367a3af9c 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/integer.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/integer.svelte @@ -33,8 +33,8 @@ key: originalKey, required: data.required, xdefault: data.default, - min: Math.abs(data.min) > Number.MAX_SAFE_INTEGER ? undefined : data.min, - max: Math.abs(data.max) > Number.MAX_SAFE_INTEGER ? undefined : data.max, + min: data.min, + max: data.max, newKey: data.key !== originalKey ? data.key : undefined }); } diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/integer.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/integer.svelte index 6f17fba8a7..a23779af92 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/integer.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/integer.svelte @@ -1,7 +1,6 @@ Date: Sun, 25 Jan 2026 16:13:12 +0530 Subject: [PATCH 2/7] fix: type issue. --- .../database-[database]/table-[table]/createColumn.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/createColumn.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/createColumn.svelte index 71c691564d..6de8d61ff8 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/createColumn.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/createColumn.svelte @@ -48,7 +48,7 @@ array: column?.array ?? false, default: column?.default ?? null, ...column - }); + } as Partial); let ColumnComponent = $derived( columnOptions.find((option) => option.name === selectedOption).component From 031f497433d225562ac05695e3ddd9630e9a47c1 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 25 Jan 2026 16:13:36 +0530 Subject: [PATCH 3/7] remove: documentsDB sdk, for now. --- src/lib/stores/sdk.ts | 4 ++-- .../database-[database]/(entity)/helpers/sdk.ts | 15 ++------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/lib/stores/sdk.ts b/src/lib/stores/sdk.ts index bfe73f6080..b932c7e12c 100644 --- a/src/lib/stores/sdk.ts +++ b/src/lib/stores/sdk.ts @@ -23,7 +23,7 @@ import { Tokens, TablesDB, Domains, - DocumentsDB, + /*DocumentsDB,*/ Realtime, Organizations } from '@appwrite.io/console'; @@ -138,7 +138,7 @@ const sdkForProject = { migrations: new Migrations(clientProject), sites: new Sites(clientProject), tablesDB: new TablesDB(clientProject), - documentsDB: new DocumentsDB(clientProject), + /*documentsDB: new DocumentsDB(clientProject),*/ console: new Console(clientProject) // for suggestions API }; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts index f062a13e74..34c5a65872 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts @@ -66,12 +66,8 @@ export function useDatabaseSdk( const { total, tables } = await baseSdk.tablesDB.listTables(params); return { total, entities: tables.map(toSupportiveEntity) }; } - case 'documentsdb': { - const { total, collections } = - await baseSdk.documentsDB.listCollections(params); - return { total, entities: collections.map(toSupportiveEntity) }; - } case 'vectordb': + case 'documentsdb': throw new Error(`Database type not supported yet`); default: throw new Error(`Unknown database type`); @@ -88,13 +84,7 @@ export function useDatabaseSdk( }); return toSupportiveEntity(table); } - case 'documentsdb': { - const table = await baseSdk.documentsDB.getCollection({ - databaseId: params.databaseId, - collectionId: params.entityId - }); - return toSupportiveEntity(table); - } + case 'documentsdb': case 'vectordb': throw new Error(`Database type not supported yet`); default: @@ -108,7 +98,6 @@ export function useDatabaseSdk( case 'tablesdb': return await baseSdk.tablesDB.delete(params); case 'documentsdb': - return await baseSdk.documentsDB.delete(params); case 'vectordb': throw new Error(`Database type not supported yet`); default: From b84fa6d746bdfdcba3a5cefd4c589b42b6520239 Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 26 Jan 2026 14:59:23 +0530 Subject: [PATCH 4/7] add: bigint view logic on columns sheet. --- src/lib/helpers/numbers.test.ts | 39 ++++++++++- src/lib/helpers/numbers.ts | 32 +++++++++ .../table-[table]/columns/+page.svelte | 66 ++++++++++++++++--- 3 files changed, 126 insertions(+), 11 deletions(-) diff --git a/src/lib/helpers/numbers.test.ts b/src/lib/helpers/numbers.test.ts index e62800d1b5..33d66f0d45 100644 --- a/src/lib/helpers/numbers.test.ts +++ b/src/lib/helpers/numbers.test.ts @@ -3,7 +3,8 @@ import { abbreviateNumber, formatCurrency, formatNumberWithCommas, - toDecimals + toDecimals, + toExponential } from '$lib/helpers/numbers'; /* @@ -83,3 +84,39 @@ test('format number according to specified locale and currency', () => { test('return the input as a string if it is not a number', () => { expect(formatCurrency(NaN)).toEqual('NaN'); }); + +test('format regular numbers correctly', () => { + expect(toExponential(1234567)).toEqual('1.23e+6'); + expect(toExponential(900719925474103)).toEqual('9.01e+14'); +}); + +test('format bigint correctly without precision loss', () => { + expect(toExponential(900719925474103n)).toEqual('9.00e+14'); + expect(toExponential(123456789012345678901234567890n)).toEqual('1.23e+29'); +}); + +test('handle negative numbers correctly', () => { + expect(toExponential(-1234567)).toEqual('-1.23e+6'); + expect(toExponential(-900719925474103n)).toEqual('-9.00e+14'); +}); + +test('handle small numbers correctly', () => { + expect(toExponential(123)).toEqual('1.23e+2'); +}); + +test('handle zero correctly', () => { + expect(toExponential(0)).toEqual('0.00e+0'); + expect(toExponential(0n)).toEqual('0.00e+0'); + expect(toExponential(0n, 0)).toEqual('0e+0'); +}); + +test('validate fractionDigits range', () => { + expect(() => toExponential(123, -1)).toThrow(RangeError); + expect(() => toExponential(123, 101)).toThrow(RangeError); + expect(() => toExponential(123n, -1)).toThrow(RangeError); +}); + +test('truncate non-integer fractionDigits', () => { + expect(toExponential(123456, 2.9)).toEqual('1.23e+5'); + expect(toExponential(123456n, 2.9)).toEqual('1.23e+5'); +}); diff --git a/src/lib/helpers/numbers.ts b/src/lib/helpers/numbers.ts index 42651e2b6d..9014e36c88 100644 --- a/src/lib/helpers/numbers.ts +++ b/src/lib/helpers/numbers.ts @@ -1,3 +1,5 @@ +export const LARGE_NUMBER_THRESHOLD = 1_000_000n; + export function abbreviateNumber(num: number, decimals: number = 1): string { if (isNaN(num)) return String(num); if (num >= 1_000_000_000) { @@ -46,6 +48,36 @@ export function coerceToNumber(val: number | bigint) { return Number(val); } +/** + * Converts a bigint to exponential notation without precision loss. + */ +export function toExponential(value: number | bigint, fractionDigits: number = 2): string { + fractionDigits = Math.trunc(fractionDigits); + if (fractionDigits < 0 || fractionDigits > 100) { + throw new RangeError('toExponential() argument must be between 0 and 100'); + } + + if (typeof value === 'number') { + return value.toExponential(fractionDigits); + } + + if (value === 0n) { + return fractionDigits === 0 ? '0e+0' : `0.${'0'.repeat(fractionDigits)}e+0`; + } + + const bigIntString = value.toString(); + + // split to get sign and value as string! + const [sign, digits] = !bigIntString.startsWith('-') + ? ['', bigIntString] + : ['-', bigIntString.slice(1)]; + + const fraction = digits.slice(1, 1 + fractionDigits).padEnd(fractionDigits, '0'); + + // example: 900719925474103n => "9.00e+14" + return `${sign}${digits[0]}.${fraction}e+${digits.length - 1}`; +} + /** * Clamps a number to a minimum value * diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte index ab6eb7e417..ad2cd0fce3 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte @@ -52,6 +52,7 @@ import { preferences } from '$lib/stores/preferences'; import { page } from '$app/state'; import { debounce } from '$lib/helpers/debounce'; + import { LARGE_NUMBER_THRESHOLD, toExponential } from '$lib/helpers/numbers'; import type { PageData } from './$types'; import { realtime } from '$lib/stores/sdk'; import { invalidate } from '$app/navigation'; @@ -166,10 +167,22 @@ } } - function getMinMaxSizeForColumn(column: Columns): string | undefined { + function formatLargeNumber(num: number | bigint): string { + const absNum = typeof num === 'bigint' ? (num < 0n ? -num : num) : BigInt(Math.abs(num)); + + if (absNum < LARGE_NUMBER_THRESHOLD) { + return num.toString(); + } + + return toExponential(num); + } + + function getMinMaxSizeForColumn( + column: Columns + ): { display: string; tooltip?: string } | undefined { if (column.type === 'string' && !column['format'] && column.key !== '$id') { const stringColumn = column as Models.ColumnString; - return `Size: ${stringColumn.size}`; + return { display: `Size: ${stringColumn.size}` }; } else if (column.type === 'integer' || column.type === 'double') { const numbersColumn = column as Models.ColumnInteger | Models.ColumnFloat; const { min, max } = numbersColumn; @@ -177,13 +190,35 @@ const hasValidMin = min > Number.MIN_SAFE_INTEGER; const hasValidMax = max < Number.MAX_SAFE_INTEGER; + let display: string | undefined; + let tooltip: string | undefined; + if (hasValidMin && hasValidMax) { - return `Min: ${min}, Max: ${max}`; + display = `Min: ${formatLargeNumber(min)}, Max: ${formatLargeNumber(max)}`; + const minAbs = + typeof min === 'bigint' ? (min < 0n ? -min : min) : BigInt(Math.abs(min)); + const maxAbs = + typeof max === 'bigint' ? (max < 0n ? -max : max) : BigInt(Math.abs(max)); + if (minAbs >= LARGE_NUMBER_THRESHOLD || maxAbs >= LARGE_NUMBER_THRESHOLD) { + tooltip = `Min: ${min.toLocaleString()}, Max: ${max.toLocaleString()}`; + } } else if (hasValidMin) { - return `Min: ${min}`; + display = `Min: ${formatLargeNumber(min)}`; + const minAbs = + typeof min === 'bigint' ? (min < 0n ? -min : min) : BigInt(Math.abs(min)); + if (minAbs >= LARGE_NUMBER_THRESHOLD) { + tooltip = `Min: ${min.toLocaleString()}`; + } } else if (hasValidMax) { - return `Max: ${max}`; + display = `Max: ${formatLargeNumber(max)}`; + const maxAbs = + typeof max === 'bigint' ? (max < 0n ? -max : max) : BigInt(Math.abs(max)); + if (maxAbs >= LARGE_NUMBER_THRESHOLD) { + tooltip = `Max: ${max.toLocaleString()}`; + } } + + return display ? { display, tooltip } : undefined; } else { return undefined; } @@ -413,11 +448,22 @@ {@const minMaxSize = getMinMaxSizeForColumn(column)} {@const relationType = getRelationshipTypeForColumn(column)} {#if minMaxSize} - - {minMaxSize} - + {#if minMaxSize.tooltip} + + + {minMaxSize.display} + +
{minMaxSize.tooltip}
+
+ {:else} + + {minMaxSize.display} + + {/if} {:else if relationType} Date: Mon, 26 Jan 2026 15:00:10 +0530 Subject: [PATCH 5/7] fix: `json-bigint` based crash. --- src/lib/components/sidebar.svelte | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/lib/components/sidebar.svelte b/src/lib/components/sidebar.svelte index 937c67c386..8375b208c7 100644 --- a/src/lib/components/sidebar.svelte +++ b/src/lib/components/sidebar.svelte @@ -101,11 +101,7 @@ style:--overlay-on-neutral={$app.themeInUse === 'dark' ? 'var(--neutral-750)' : 'var(--neutral-100)'}> - updateSidebarState(event.detail)} - resizable> + updateSidebarState(event.detail)}>
From 3bf194c7f77b6518e1b98d6dc41a953744dc551b Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 26 Jan 2026 15:21:30 +0530 Subject: [PATCH 6/7] update: address comments. --- src/lib/helpers/numbers.ts | 6 +++ .../table-[table]/columns/+page.svelte | 50 +++++++++++++------ 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/lib/helpers/numbers.ts b/src/lib/helpers/numbers.ts index 9014e36c88..0a0657436a 100644 --- a/src/lib/helpers/numbers.ts +++ b/src/lib/helpers/numbers.ts @@ -1,4 +1,5 @@ export const LARGE_NUMBER_THRESHOLD = 1_000_000n; +export const LARGE_NUMBER_THRESHOLD_NUM = 1_000_000; export function abbreviateNumber(num: number, decimals: number = 1): string { if (isNaN(num)) return String(num); @@ -72,6 +73,11 @@ export function toExponential(value: number | bigint, fractionDigits: number = 2 ? ['', bigIntString] : ['-', bigIntString.slice(1)]; + // when no decimal + if (fractionDigits === 0) { + return `${sign}${digits[0]}e+${digits.length - 1}`; + } + const fraction = digits.slice(1, 1 + fractionDigits).padEnd(fractionDigits, '0'); // example: 900719925474103n => "9.00e+14" diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte index ad2cd0fce3..4d585fd108 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte @@ -52,7 +52,11 @@ import { preferences } from '$lib/stores/preferences'; import { page } from '$app/state'; import { debounce } from '$lib/helpers/debounce'; - import { LARGE_NUMBER_THRESHOLD, toExponential } from '$lib/helpers/numbers'; + import { + LARGE_NUMBER_THRESHOLD, + LARGE_NUMBER_THRESHOLD_NUM, + toExponential + } from '$lib/helpers/numbers'; import type { PageData } from './$types'; import { realtime } from '$lib/stores/sdk'; import { invalidate } from '$app/navigation'; @@ -168,10 +172,17 @@ } function formatLargeNumber(num: number | bigint): string { - const absNum = typeof num === 'bigint' ? (num < 0n ? -num : num) : BigInt(Math.abs(num)); - - if (absNum < LARGE_NUMBER_THRESHOLD) { - return num.toString(); + // type-safe abs comparison + if (typeof num === 'bigint') { + const absNum = num < 0n ? -num : num; + if (absNum < LARGE_NUMBER_THRESHOLD) { + return num.toString(); + } + } else { + const absNum = Math.abs(num); + if (absNum < LARGE_NUMBER_THRESHOLD_NUM) { + return num.toString(); + } } return toExponential(num); @@ -195,25 +206,32 @@ if (hasValidMin && hasValidMax) { display = `Min: ${formatLargeNumber(min)}, Max: ${formatLargeNumber(max)}`; - const minAbs = - typeof min === 'bigint' ? (min < 0n ? -min : min) : BigInt(Math.abs(min)); - const maxAbs = - typeof max === 'bigint' ? (max < 0n ? -max : max) : BigInt(Math.abs(max)); - if (minAbs >= LARGE_NUMBER_THRESHOLD || maxAbs >= LARGE_NUMBER_THRESHOLD) { + const shouldShowTooltip = + (typeof min === 'bigint' + ? (min < 0n ? -min : min) >= LARGE_NUMBER_THRESHOLD + : Math.abs(min) >= LARGE_NUMBER_THRESHOLD_NUM) || + (typeof max === 'bigint' + ? (max < 0n ? -max : max) >= LARGE_NUMBER_THRESHOLD + : Math.abs(max) >= LARGE_NUMBER_THRESHOLD_NUM); + if (shouldShowTooltip) { tooltip = `Min: ${min.toLocaleString()}, Max: ${max.toLocaleString()}`; } } else if (hasValidMin) { display = `Min: ${formatLargeNumber(min)}`; - const minAbs = - typeof min === 'bigint' ? (min < 0n ? -min : min) : BigInt(Math.abs(min)); - if (minAbs >= LARGE_NUMBER_THRESHOLD) { + const shouldShowTooltip = + typeof min === 'bigint' + ? (min < 0n ? -min : min) >= LARGE_NUMBER_THRESHOLD + : Math.abs(min) >= LARGE_NUMBER_THRESHOLD_NUM; + if (shouldShowTooltip) { tooltip = `Min: ${min.toLocaleString()}`; } } else if (hasValidMax) { display = `Max: ${formatLargeNumber(max)}`; - const maxAbs = - typeof max === 'bigint' ? (max < 0n ? -max : max) : BigInt(Math.abs(max)); - if (maxAbs >= LARGE_NUMBER_THRESHOLD) { + const shouldShowTooltip = + typeof max === 'bigint' + ? (max < 0n ? -max : max) >= LARGE_NUMBER_THRESHOLD + : Math.abs(max) >= LARGE_NUMBER_THRESHOLD_NUM; + if (shouldShowTooltip) { tooltip = `Max: ${max.toLocaleString()}`; } } From 7530f5d1d8784dfb11f0644927a941d6c3f5f066 Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 26 Jan 2026 16:01:57 +0530 Subject: [PATCH 7/7] address comment. --- .../table-[table]/columns/+page.svelte | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte index 4d585fd108..3da4ae2414 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte @@ -198,8 +198,11 @@ const numbersColumn = column as Models.ColumnInteger | Models.ColumnFloat; const { min, max } = numbersColumn; - const hasValidMin = min > Number.MIN_SAFE_INTEGER; - const hasValidMax = max < Number.MAX_SAFE_INTEGER; + const isMinBigInt = typeof min === 'bigint'; + const isMaxBigInt = typeof max === 'bigint'; + + const hasValidMin = isMinBigInt || min > Number.MIN_SAFE_INTEGER; + const hasValidMax = isMaxBigInt || max < Number.MAX_SAFE_INTEGER; let display: string | undefined; let tooltip: string | undefined; @@ -207,10 +210,10 @@ if (hasValidMin && hasValidMax) { display = `Min: ${formatLargeNumber(min)}, Max: ${formatLargeNumber(max)}`; const shouldShowTooltip = - (typeof min === 'bigint' + (isMinBigInt ? (min < 0n ? -min : min) >= LARGE_NUMBER_THRESHOLD : Math.abs(min) >= LARGE_NUMBER_THRESHOLD_NUM) || - (typeof max === 'bigint' + (isMaxBigInt ? (max < 0n ? -max : max) >= LARGE_NUMBER_THRESHOLD : Math.abs(max) >= LARGE_NUMBER_THRESHOLD_NUM); if (shouldShowTooltip) { @@ -218,19 +221,17 @@ } } else if (hasValidMin) { display = `Min: ${formatLargeNumber(min)}`; - const shouldShowTooltip = - typeof min === 'bigint' - ? (min < 0n ? -min : min) >= LARGE_NUMBER_THRESHOLD - : Math.abs(min) >= LARGE_NUMBER_THRESHOLD_NUM; + const shouldShowTooltip = isMinBigInt + ? (min < 0n ? -min : min) >= LARGE_NUMBER_THRESHOLD + : Math.abs(min) >= LARGE_NUMBER_THRESHOLD_NUM; if (shouldShowTooltip) { tooltip = `Min: ${min.toLocaleString()}`; } } else if (hasValidMax) { display = `Max: ${formatLargeNumber(max)}`; - const shouldShowTooltip = - typeof max === 'bigint' - ? (max < 0n ? -max : max) >= LARGE_NUMBER_THRESHOLD - : Math.abs(max) >= LARGE_NUMBER_THRESHOLD_NUM; + const shouldShowTooltip = isMaxBigInt + ? (max < 0n ? -max : max) >= LARGE_NUMBER_THRESHOLD + : Math.abs(max) >= LARGE_NUMBER_THRESHOLD_NUM; if (shouldShowTooltip) { tooltip = `Max: ${max.toLocaleString()}`; }