From b9d1548422aa322b6d97aae99ec3dc5e2a437f1f Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 3 Feb 2026 02:14:20 +1300 Subject: [PATCH 01/12] Add new text types --- bun.lock | 4 +- package.json | 2 +- src/lib/components/filters/store.ts | 52 ++++++++- src/lib/helpers/faker.ts | 18 ++- src/lib/helpers/types.ts | 4 + .../(suggestions)/empty.svelte | 2 +- .../(suggestions)/indexes.svelte | 5 +- .../(suggestions)/store.ts | 2 +- .../table-[table]/+layout.svelte | 2 +- .../table-[table]/columns/+page.svelte | 6 +- .../table-[table]/columns/longtext.svelte | 99 +++++++++++++++++ .../table-[table]/columns/mediumtext.svelte | 99 +++++++++++++++++ .../table-[table]/columns/store.ts | 64 +++++++++-- .../table-[table]/columns/text.svelte | 95 ++++++++++++++++ .../table-[table]/columns/varchar.svelte | 103 ++++++++++++++++++ .../table-[table]/createColumn.svelte | 6 +- .../table-[table]/rows/columns/column.svelte | 4 + .../rows/columns/types/string.svelte | 2 +- .../table-[table]/rows/store.ts | 6 + .../table-[table]/settings/displayName.svelte | 3 +- 20 files changed, 554 insertions(+), 24 deletions(-) create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/longtext.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/mediumtext.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/text.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte diff --git a/bun.lock b/bun.lock index 8a28be835..7fe21da58 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@95675c4", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@98058b2", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@c1feb89", "@appwrite.io/pink-legacy": "^1.0.3", @@ -107,7 +107,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@95675c4", { "dependencies": { "bignumber.js": "9.0.0", "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@98058b2", { "dependencies": { "bignumber.js": "9.0.0", "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 604624d1d..4d8b9af18 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@95675c4", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@98058b2", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@c1feb89", "@appwrite.io/pink-legacy": "^1.0.3", diff --git a/src/lib/components/filters/store.ts b/src/lib/components/filters/store.ts index fde630607..734f5e581 100644 --- a/src/lib/components/filters/store.ts +++ b/src/lib/components/filters/store.ts @@ -156,6 +156,10 @@ export enum ValidOperators { export enum ValidTypes { String = 'string', + Varchar = 'varchar', + Text = 'text', + Mediumtext = 'mediumtext', + Longtext = 'longtext', Integer = 'integer', Double = 'double', Boolean = 'boolean', @@ -175,8 +179,32 @@ const operatorsDefault = new Map< hideInput?: boolean; } >([ - [ValidOperators.StartsWith, { query: Query.startsWith, types: [ValidTypes.String] }], - [ValidOperators.EndsWith, { query: Query.endsWith, types: [ValidTypes.String] }], + [ + ValidOperators.StartsWith, + { + query: Query.startsWith, + types: [ + ValidTypes.String, + ValidTypes.Varchar, + ValidTypes.Text, + ValidTypes.Mediumtext, + ValidTypes.Longtext + ] + } + ], + [ + ValidOperators.EndsWith, + { + query: Query.endsWith, + types: [ + ValidTypes.String, + ValidTypes.Varchar, + ValidTypes.Text, + ValidTypes.Mediumtext, + ValidTypes.Longtext + ] + } + ], [ ValidOperators.GreaterThan, { @@ -211,6 +239,10 @@ const operatorsDefault = new Map< query: Query.equal, types: [ ValidTypes.String, + ValidTypes.Varchar, + ValidTypes.Text, + ValidTypes.Mediumtext, + ValidTypes.Longtext, ValidTypes.Integer, ValidTypes.Double, ValidTypes.Boolean, @@ -227,6 +259,10 @@ const operatorsDefault = new Map< query: Query.notEqual, types: [ ValidTypes.String, + ValidTypes.Varchar, + ValidTypes.Text, + ValidTypes.Mediumtext, + ValidTypes.Longtext, ValidTypes.Integer, ValidTypes.Double, ValidTypes.Boolean, @@ -242,6 +278,10 @@ const operatorsDefault = new Map< query: Query.isNotNull, types: [ ValidTypes.String, + ValidTypes.Varchar, + ValidTypes.Text, + ValidTypes.Mediumtext, + ValidTypes.Longtext, ValidTypes.Integer, ValidTypes.Double, ValidTypes.Boolean, @@ -260,6 +300,10 @@ const operatorsDefault = new Map< query: Query.isNull, types: [ ValidTypes.String, + ValidTypes.Varchar, + ValidTypes.Text, + ValidTypes.Mediumtext, + ValidTypes.Longtext, ValidTypes.Integer, ValidTypes.Double, ValidTypes.Boolean, @@ -278,6 +322,10 @@ const operatorsDefault = new Map< query: Query.contains, types: [ ValidTypes.String, + ValidTypes.Varchar, + ValidTypes.Text, + ValidTypes.Mediumtext, + ValidTypes.Longtext, ValidTypes.Integer, ValidTypes.Double, ValidTypes.Boolean, diff --git a/src/lib/helpers/faker.ts b/src/lib/helpers/faker.ts index c7ce16e9d..7abd56c62 100644 --- a/src/lib/helpers/faker.ts +++ b/src/lib/helpers/faker.ts @@ -183,7 +183,8 @@ function generateValueForField( function generateSingleValue(field: Field): string | number | boolean | NestedNumberArray | null { switch (field.type) { - case 'string': { + case 'string': + case 'varchar': { if ('format' in field && field.format) { switch (field.format) { case 'email': { @@ -214,6 +215,21 @@ function generateSingleValue(field: Field): string | number | boolean | NestedNu } } + case 'text': { + // TEXT type max size is 16,383 characters (utf8mb4) + return generateStringValue(field.key, 1000); + } + + case 'mediumtext': { + // MEDIUMTEXT type max size is 4,194,303 characters (utf8mb4) + return generateStringValue(field.key, 1000); + } + + case 'longtext': { + // LONGTEXT type max size is 1,073,741,823 characters (utf8mb4) + return generateStringValue(field.key, 1000); + } + case 'integer': { const intAttr = field as Models.ColumnInteger; const minCompat = coerceToNumber(intAttr.min); diff --git a/src/lib/helpers/types.ts b/src/lib/helpers/types.ts index df6fba0d9..3c3218a40 100644 --- a/src/lib/helpers/types.ts +++ b/src/lib/helpers/types.ts @@ -30,6 +30,10 @@ export type Prettify = T & {}; const columnTypes = [ 'string', + 'varchar', + 'text', + 'mediumtext', + 'longtext', 'integer', 'double', 'boolean', diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte index b7b90e70c..7355bf9df 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte @@ -1504,7 +1504,7 @@ id="type" required label="Type" - value={selectedOption?.name || 'String'} + value={selectedOption?.name || 'Text'} on:change={(e) => { const newOption = columnOptions.find( (opt) => opt.name === e.detail diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte index 836ea3b9c..722db32d5 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte @@ -222,7 +222,10 @@ const usedKeys = new Set(); const columnMap: Map = new Map( table.fields - .filter((field) => field.type === 'string' && 'size' in field) + .filter( + (field) => + (field.type === 'string' || field.type === 'varchar') && 'size' in field + ) .map((field) => [field.key, field['size']]) ); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/store.ts index 0e8daa036..bfc99c432 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/store.ts @@ -146,7 +146,7 @@ export function mapSuggestedColumns(columns: T[]): Sugges required: col.required ?? false, array: false, default: col.default ?? null, - size: col.type === 'string' ? (col.size ?? undefined) : undefined, + size: col.type === 'string' || col.type === 'varchar' ? (col.size ?? undefined) : undefined, min: col.type === 'integer' || col.type === 'double' ? (col.min ?? col.formatOptions?.min ?? undefined) 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 8bf9dee80..cd99973a9 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 @@ -90,7 +90,7 @@ let createIndex: CreateIndex; let createColumn: CreateColumn; - let selectedOption: Option['name'] = 'String'; + let selectedOption: Option['name'] = 'Text'; let createMoreColumns = false; /* terminology */ 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 a4649c505..e300431a3 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 @@ -191,7 +191,11 @@ function getMinMaxSizeForColumn( column: Columns ): { display: string; tooltip?: string } | undefined { - if (column.type === 'string' && !column['format'] && column.key !== '$id') { + if ( + (column.type === 'string' || column.type === 'varchar') && + !column['format'] && + column.key !== '$id' + ) { const stringColumn = column as Models.ColumnString; return { display: `Size: ${stringColumn.size}` }; } else if (column.type === 'integer' || column.type === 'double') { diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/longtext.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/longtext.svelte new file mode 100644 index 000000000..dc18391cf --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/longtext.svelte @@ -0,0 +1,99 @@ + + + + + + + Maximum size: 1,073,741,823 characters + + + + + + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/mediumtext.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/mediumtext.svelte new file mode 100644 index 000000000..b853be3dd --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/mediumtext.svelte @@ -0,0 +1,99 @@ + + + + + + + Maximum size: 4,194,303 characters + + + + + + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/store.ts index 0a29d12ef..0b94d185d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/store.ts @@ -7,6 +7,10 @@ import Float, { submitFloat, updateFloat } from './float.svelte'; import Integer, { submitInteger, updateInteger } from './integer.svelte'; import Ip, { submitIp, updateIp } from './ip.svelte'; import String, { submitString, updateString } from './string.svelte'; +import Varchar, { submitVarchar, updateVarchar } from './varchar.svelte'; +import Text, { submitText, updateText } from './text.svelte'; +import Mediumtext, { submitMediumtext, updateMediumtext } from './mediumtext.svelte'; +import Longtext, { submitLongtext, updateLongtext } from './longtext.svelte'; import Url, { submitUrl, updateUrl } from './url.svelte'; import Datetime, { submitDatetime, updateDatetime } from './datetime.svelte'; import Point, { submitPoint, updatePoint } from './point.svelte'; @@ -32,7 +36,10 @@ import type { ComponentType } from 'svelte'; export type Option = { name: - | 'String' + | 'Text' + | 'Mediumtext' + | 'Longtext' + | 'Varchar' | 'Integer' | 'Float' | 'Boolean' @@ -44,11 +51,16 @@ export type Option = { | 'Relationship' | 'Point' | 'Line' - | 'Polygon'; + | 'Polygon' + | 'String (deprecated)'; sentenceName: string; component: Component; type: | 'string' + | 'text' + | 'mediumtext' + | 'longtext' + | 'varchar' | 'integer' | 'double' | 'boolean' @@ -75,12 +87,39 @@ export type Option = { export const columnOptions: Option[] = [ { - name: 'String', - sentenceName: 'string', - component: String, - type: 'string', - create: submitString, - update: updateString, + name: 'Text', + sentenceName: 'text', + component: Text, + type: 'text', + create: submitText, + update: updateText, + icon: IconText + }, + { + name: 'Mediumtext', + sentenceName: 'mediumtext', + component: Mediumtext, + type: 'mediumtext', + create: submitMediumtext, + update: updateMediumtext, + icon: IconText + }, + { + name: 'Longtext', + sentenceName: 'longtext', + component: Longtext, + type: 'longtext', + create: submitLongtext, + update: updateLongtext, + icon: IconText + }, + { + name: 'Varchar', + sentenceName: 'varchar', + component: Varchar, + type: 'varchar', + create: submitVarchar, + update: updateVarchar, icon: IconText }, { @@ -194,6 +233,15 @@ export const columnOptions: Option[] = [ create: submitRelationship, update: updateRelationship, icon: IconRelationship + }, + { + name: 'String (deprecated)', + sentenceName: 'string', + component: String, + type: 'string', + create: submitString, + update: updateString, + icon: IconText } ]; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/text.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/text.svelte new file mode 100644 index 000000000..6777b4759 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/text.svelte @@ -0,0 +1,95 @@ + + + + + + + Maximum size: 16,383 characters + + + + + + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte new file mode 100644 index 000000000..01c3b8a1d --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte @@ -0,0 +1,103 @@ + + + + + + += 50 ? InputTextarea : InputText} + id="default" + label="Default" + placeholder="Enter string" + maxlength={data.size} + bind:value={data.default} + disabled={data.required || data.array || disabled} + nullable={!data.required && !data.array} /> + + 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 6de8d61ff..bddf43762 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 @@ -23,7 +23,7 @@ columns = $bindable(null), columnId = $bindable(null), columnsOrder = $bindable(null), - selectedOption = $bindable('String'), + selectedOption = $bindable('Text'), createMore = $bindable(false), onColumnsReorder = null }: { @@ -63,8 +63,8 @@ default: null }; - /* default to string */ - selectedOption = 'String'; + /* default to text */ + selectedOption = 'Text'; $option = columnOptions[0]; } diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte index a8865d78d..1245063f3 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte @@ -35,6 +35,10 @@ const columnsTypeMap = { string: String, + varchar: String, + text: String, + mediumtext: String, + longtext: String, integer: Integer, double: Integer, boolean: Boolean, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte index 1e7c5f8d0..eecfafe13 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte @@ -32,7 +32,7 @@ const maxlength = $derived( limited ? undefined - : column.type === 'string' + : column.type === 'string' || column.type === 'varchar' ? (column as Models.ColumnString).size : undefined ); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/store.ts index a007c01fc..1a65e7873 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/store.ts @@ -30,6 +30,12 @@ export function isString(field: Field): field is Models.ColumnString | Models.At return field?.type === 'string'; } +export function isTextType(field: Field): boolean { + if (!field) return false; + const textTypes = ['string', 'varchar', 'text', 'mediumtext', 'longtext']; + return textTypes.includes(field?.type); +} + export function isSpatialType( field: Columns | Attributes | Column ): field is diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/displayName.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/displayName.svelte index 8660d70fa..d8298d9c0 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/displayName.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/displayName.svelte @@ -46,8 +46,9 @@ } function getValidColumns() { + const textTypes = ['string', 'varchar', 'text', 'mediumtext', 'longtext']; return ($columns as Models.ColumnString[]).filter( - (attr) => attr.type === 'string' && !attr?.array + (attr) => textTypes.includes(attr.type) && !attr?.array ); } From 27fb92b466df59a21ca4197b1013c5eb1759e323 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 3 Feb 2026 20:53:55 +1300 Subject: [PATCH 02/12] Fix types --- .../table-[table]/columns/longtext.svelte | 8 ++++---- .../table-[table]/columns/mediumtext.svelte | 8 ++++---- .../database-[database]/table-[table]/columns/text.svelte | 8 ++++---- .../table-[table]/columns/varchar.svelte | 8 ++++---- .../databases/database-[database]/table-[table]/store.ts | 4 ++++ 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/longtext.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/longtext.svelte index dc18391cf..8087541af 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/longtext.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/longtext.svelte @@ -7,7 +7,7 @@ databaseId: string, tableId: string, key: string, - data: Partial + data: Partial ) { await sdk .forProject(page.params.region, page.params.project) @@ -23,7 +23,7 @@ export async function updateLongtext( databaseId: string, tableId: string, - data: Partial, + data: Partial, originalKey?: string ) { await sdk @@ -45,7 +45,7 @@ import { InputTextarea } from '$lib/elements/forms'; import { Layout, Typography } from '@appwrite.io/pink-svelte'; - export let data: Partial = { + export let data: Partial = { required: false, array: false }; @@ -67,7 +67,7 @@ const { stores: { required, array }, listen - } = createConservative>({ + } = createConservative>({ required: false, array: false, ...data diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/mediumtext.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/mediumtext.svelte index b853be3dd..e87ef840f 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/mediumtext.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/mediumtext.svelte @@ -7,7 +7,7 @@ databaseId: string, tableId: string, key: string, - data: Partial + data: Partial ) { await sdk .forProject(page.params.region, page.params.project) @@ -23,7 +23,7 @@ export async function updateMediumtext( databaseId: string, tableId: string, - data: Partial, + data: Partial, originalKey?: string ) { await sdk @@ -45,7 +45,7 @@ import { InputTextarea } from '$lib/elements/forms'; import { Layout, Typography } from '@appwrite.io/pink-svelte'; - export let data: Partial = { + export let data: Partial = { required: false, array: false }; @@ -67,7 +67,7 @@ const { stores: { required, array }, listen - } = createConservative>({ + } = createConservative>({ required: false, array: false, ...data diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/text.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/text.svelte index 6777b4759..2f2a4443b 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/text.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/text.svelte @@ -7,7 +7,7 @@ databaseId: string, tableId: string, key: string, - data: Partial + data: Partial ) { await sdk.forProject(page.params.region, page.params.project).tablesDB.createTextColumn({ databaseId, @@ -21,7 +21,7 @@ export async function updateText( databaseId: string, tableId: string, - data: Partial, + data: Partial, originalKey?: string ) { await sdk.forProject(page.params.region, page.params.project).tablesDB.updateTextColumn({ @@ -41,7 +41,7 @@ import { InputTextarea } from '$lib/elements/forms'; import { Layout, Typography } from '@appwrite.io/pink-svelte'; - export let data: Partial = { + export let data: Partial = { required: false, array: false }; @@ -63,7 +63,7 @@ const { stores: { required, array }, listen - } = createConservative>({ + } = createConservative>({ required: false, array: false, ...data diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte index 01c3b8a1d..550ec9694 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte @@ -7,7 +7,7 @@ databaseId: string, tableId: string, key: string, - data: Partial + data: Partial ) { await sdk.forProject(page.params.region, page.params.project).tablesDB.createVarcharColumn({ databaseId, @@ -22,7 +22,7 @@ export async function updateVarchar( databaseId: string, tableId: string, - data: Partial, + data: Partial, originalKey?: string ) { await sdk.forProject(page.params.region, page.params.project).tablesDB.updateVarcharColumn({ @@ -42,7 +42,7 @@ import RequiredArrayCheckboxes from './requiredArrayCheckboxes.svelte'; import { InputNumber, InputText, InputTextarea } from '$lib/elements/forms'; - export let data: Partial = { + export let data: Partial = { required: false, size: 255, array: false @@ -65,7 +65,7 @@ const { stores: { required, array }, listen - } = createConservative>({ + } = createConservative>({ required: false, array: false, ...data diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/store.ts index f840a035c..b0cdca091 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/store.ts @@ -14,6 +14,10 @@ export type Columns = | Models.ColumnInteger | Models.ColumnIp | Models.ColumnString + | Models.ColumnText + | Models.ColumnMediumtext + | Models.ColumnLongtext + | Models.ColumnVarchar | Models.ColumnUrl | Models.ColumnPoint | Models.ColumnLine From 24fea9e499b996e0b9bd9f50044446be5d1ad0a0 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 3 Feb 2026 22:51:05 +1300 Subject: [PATCH 03/12] Fix types --- .../table-[table]/rows/columns/column.svelte | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte index 1245063f3..9be533a7c 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte @@ -27,6 +27,10 @@ | Models.ColumnInteger | Models.ColumnIp | Models.ColumnString + | Models.ColumnText + | Models.ColumnMediumtext + | Models.ColumnLongtext + | Models.ColumnVarchar | Models.ColumnDatetime | Models.ColumnUrl | Models.ColumnPoint From 880d7df956eae64e03bd2ae20a2923b39731c6e3 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 6 Feb 2026 04:35:59 +1300 Subject: [PATCH 04/12] Add bytes used --- bun.lock | 4 +- package.json | 2 +- .../table-[table]/columns/varchar.svelte | 72 ++++++++++++++++++- 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/bun.lock b/bun.lock index 7fe21da58..b5ebfac76 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@98058b2", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@bb72008", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@c1feb89", "@appwrite.io/pink-legacy": "^1.0.3", @@ -107,7 +107,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@98058b2", { "dependencies": { "bignumber.js": "9.0.0", "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@bb72008", { "dependencies": { "bignumber.js": "9.0.0", "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 4d8b9af18..fb534d399 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@98058b2", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@bb72008", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@c1feb89", "@appwrite.io/pink-legacy": "^1.0.3", diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte index 550ec9694..b48bed9ba 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte @@ -41,6 +41,10 @@ import { createConservative } from '$lib/helpers/stores'; import RequiredArrayCheckboxes from './requiredArrayCheckboxes.svelte'; import { InputNumber, InputText, InputTextarea } from '$lib/elements/forms'; + import { table } from '../store'; + import { ProgressBar } from '$lib/components'; + import { Layout, Typography, Tooltip, Icon } from '@appwrite.io/pink-svelte'; + import { IconInfo } from '@appwrite.io/pink-icons-svelte'; export let data: Partial = { required: false, @@ -51,6 +55,46 @@ export let editing = false; export let disabled = false; + // Local size for reactivity + let size = data.size ?? 255; + $: data.size = size; + + function formatBytes(bytes: number): string { + return bytes < 1024 ? `${bytes.toLocaleString()} bytes` : `${(bytes / 1024).toFixed(1)} KB`; + } + + function getNewColumnBytes(s: number): number { + return (s * 4) + (s <= 255 ? 1 : 2); + } + + function getProgressData(bytesUsed: number, bytesMax: number, s: number) { + const newBytes = getNewColumnBytes(s); + const exceeds = bytesUsed + newBytes > bytesMax; + return [ + { + size: bytesUsed, + color: 'hsl(var(--color-information-100))', + tooltip: { + title: 'Current usage:', + label: formatBytes(bytesUsed) + } + }, + { + size: newBytes, + color: exceeds ? 'hsl(var(--color-danger-100))' : 'hsl(var(--color-success-100))', + tooltip: { + title: 'New column:', + label: formatBytes(newBytes) + } + } + ]; + } + + $: bytesMax = $table?.bytesMax ?? 65535; + $: bytesUsed = $table?.bytesUsed ?? 0; + $: newColumnBytes = getNewColumnBytes(size); + $: exceedsLimit = !editing && (bytesUsed + newColumnBytes) > bytesMax; + let savedDefault = data.default; function handleDefaultState(hideDefault: boolean) { @@ -82,16 +126,38 @@ required {disabled} placeholder="Enter size" - bind:value={data.size} + bind:value={size} min={1} max={16383} /> +{#if !editing} + + + + Row size usage + + + + + Database rows have a maximum size of 64 KB. varchar columns use 4 bytes per character plus a small overhead. text, mediumtext, and longtext columns only use ~20 bytes regardless of content length. + + + + + {#if exceedsLimit} + + This column exceeds the remaining row space. Consider using text, mediumtext, or longtext instead. + + {/if} + +{/if} + = 50 ? InputTextarea : InputText} + this={size >= 50 ? InputTextarea : InputText} id="default" label="Default" placeholder="Enter string" - maxlength={data.size} + maxlength={size} bind:value={data.default} disabled={data.required || data.array || disabled} nullable={!data.required && !data.array} /> From 5ee867af451421c98193c90f122b2f5add25398a Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 6 Feb 2026 18:28:01 +1300 Subject: [PATCH 05/12] fix: update types to use SDK enums for OrderBy, Scopes, Resources, BackupServices - Replace IndexOrder enum with SDK's OrderBy enum in indexes-related files - Cast scopes arrays to Scopes[] type in function settings files - Use Resources enum values in migration store and forms - Use BackupServices enum in database backup operations - Update migrations pages to use Scopes enum instead of string literals Co-Authored-By: Claude Opus 4.5 --- src/lib/stores/migration.ts | 109 ++++++++---------- .../(migration-wizard)/resource-form.svelte | 17 ++- .../databases/create.svelte | 4 +- .../(entity)/views/indexes/create.svelte | 20 ++-- .../(suggestions)/indexes.svelte | 17 ++- .../(suggestions)/store.ts | 8 +- .../database-[database]/backups/+page.svelte | 6 +- .../database-[database]/backups/table.svelte | 4 +- .../create-function/deploy/+page.svelte | 4 +- .../template-[template]/+page.svelte | 4 +- .../(modals)/createGit.svelte | 4 +- .../domains/add-domain/+page.svelte | 4 +- .../settings/disconnectRepo.svelte | 4 +- .../settings/updateBuildCommand.svelte | 4 +- .../settings/updateEvents.svelte | 4 +- .../settings/updateLogging.svelte | 4 +- .../settings/updateName.svelte | 4 +- .../settings/updatePermissions.svelte | 4 +- .../settings/updateRepository.svelte | 6 +- .../settings/updateResourceLimits.svelte | 4 +- .../settings/updateRuntime.svelte | 4 +- .../settings/updateSchedule.svelte | 4 +- .../settings/updateScopes.svelte | 4 +- .../settings/updateTimeout.svelte | 4 +- .../overview/(components)/create.svelte | 3 +- .../overview/(components)/keyDetails.svelte | 6 +- .../(components)/updateExpirationDate.svelte | 4 +- .../settings/migrations/+page.svelte | 36 +++--- .../settings/migrations/exportModal.svelte | 35 +++--- 29 files changed, 162 insertions(+), 173 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index 2164ab2a1..dc57a6e9c 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -1,5 +1,5 @@ import { writable } from 'svelte/store'; - +import { Resources } from '@appwrite.io/console'; import { includesAll } from '$lib/helpers/array'; const initialFormData = { @@ -51,66 +51,66 @@ export const ResourcesFriendly = { row: { singular: 'Row', plural: 'Rows' } }; -const resources = Object.keys(ResourcesFriendly); - -type Resource = (typeof resources)[number]; - // @todo: @itznotabug - check if other resources are correct and work fine! -export const providerResources: Record = { - appwrite: [...resources], // new terminology, others are ok? +export const providerResources: Record = { + appwrite: Object.values(Resources), supabase: [ - 'user', - 'database', - 'collection', - 'attribute', - 'index', - 'document', - 'bucket', - 'file' + Resources.User, + Resources.Database, + Resources.Collection, + Resources.Attribute, + Resources.Index, + Resources.Document, + Resources.Bucket, + Resources.File ], - nhost: ['user', 'database', 'collection', 'attribute', 'index', 'document', 'bucket', 'file'], - firebase: ['user', 'database', 'collection', 'attribute', 'document', 'bucket', 'file'] + nhost: [ + Resources.User, + Resources.Database, + Resources.Collection, + Resources.Attribute, + Resources.Index, + Resources.Document, + Resources.Bucket, + Resources.File + ], + firebase: [ + Resources.User, + Resources.Database, + Resources.Collection, + Resources.Attribute, + Resources.Document, + Resources.Bucket, + Resources.File + ] }; export const migrationFormToResources = ( formData: MigrationFormData, provider: Provider -): Resource[] => { - const resources: Resource[] = []; - const addResource = (resource: Resource) => { +): Resources[] => { + const resources: Resources[] = []; + const addResource = (resource: Resources) => { if (providerResources[provider].includes(resource)) { resources.push(resource); } }; if (formData.users.root) { - addResource('user'); - } - if (formData.users.teams) { - addResource('team'); - addResource('membership'); + addResource(Resources.User); } if (formData.databases.root) { - addResource('database'); - addResource('table'); - addResource('column'); - addResource('columnIndex'); + addResource(Resources.Database); + addResource(Resources.Table); + addResource(Resources.Column); + addResource(Resources.Index); } if (formData.databases.rows) { - addResource('row'); - } - if (formData.functions.root) { - addResource('function'); - } - if (formData.functions.env) { - addResource('environment-variable'); - } - if (formData.functions.inactive) { - addResource('deployment'); + addResource(Resources.Row); } if (formData.storage.root) { - addResource('bucket'); - addResource('file'); + addResource(Resources.Bucket); + addResource(Resources.File); } return resources; @@ -137,33 +137,20 @@ export const isVersionAtLeast = (version: string, atLeast: string) => { return compareVersions(version, atLeast) >= 0; }; -export const resourcesToMigrationForm = ( - resources: Resource[], - version = '0.0.0' -): MigrationFormData => { +export const resourcesToMigrationForm = (resources: Resources[]): MigrationFormData => { const formData = { ...initialFormData }; - if (resources.includes('user')) { + if (resources.includes(Resources.User)) { formData.users.root = true; } - if (includesAll(resources, ['team', 'membership'])) { - formData.users.teams = true; - } - if (resources.includes('database')) { + if (resources.includes(Resources.Database)) { formData.databases.root = true; } - if (includesAll(resources, ['table', 'column', 'row'])) { + if ( + includesAll(resources, [Resources.Table, Resources.Column, Resources.Row] as Resources[]) + ) { formData.databases.rows = true; } - if (resources.includes('function') && isVersionAtLeast(version, '1.4.0')) { - formData.functions.root = true; - } - if (resources.includes('environment-variable') && isVersionAtLeast(version, '1.4.0')) { - formData.functions.env = true; - } - if (resources.includes('deployment') && isVersionAtLeast(version, '1.4.0')) { - formData.functions.inactive = true; - } - if (includesAll(resources, ['bucket', 'file'])) { + if (includesAll(resources, [Resources.Bucket, Resources.File] as Resources[])) { formData.storage.root = true; } diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index 628c6c2a3..650a7f10e 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -12,7 +12,7 @@ } from '$lib/stores/migration'; import { Button } from '$lib/elements/forms'; import { wizard } from '$lib/stores/wizard'; - import type { Models } from '@appwrite.io/console'; + import { Resources, type Models } from '@appwrite.io/console'; import type { sdk } from '$lib/stores/sdk'; import ImportReport from '$routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte'; @@ -33,7 +33,7 @@ } function selectAll() { - $formData = resourcesToMigrationForm(resources, version); + $formData = resourcesToMigrationForm(resources); } $: version = report?.version || '0.0.0'; @@ -98,14 +98,21 @@ const shouldRenderGroup = (groupKey: string): boolean => { if (groupKey === 'functions') { - return resources.includes('function') && isVersionAtLeast(version, '1.4.0'); + // Functions not in SDK Resources enum, skip + return false; } if (groupKey === 'storage') { - return resources.includes('bucket') && resources.includes('file'); + return resources.includes(Resources.Bucket) && resources.includes(Resources.File); } - return resources.includes(groupKey.slice(0, -1)); + // Map groupKey to Resources enum + const groupToResource: Record = { + users: Resources.User, + databases: Resources.Database + }; + const resource = groupToResource[groupKey]; + return resource ? resources.includes(resource) : false; }; // no typecasting in svelte context! diff --git a/src/routes/(console)/project-[region]-[project]/databases/create.svelte b/src/routes/(console)/project-[region]-[project]/databases/create.svelte index a48ef0d1f..c1b6fbb91 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/create.svelte @@ -4,7 +4,7 @@ import { Button, InputText } from '$lib/elements/forms'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; - import { ID, type Models } from '@appwrite.io/console'; + import { BackupServices, ID, type Models } from '@appwrite.io/console'; import { createEventDispatcher } from 'svelte'; import { isCloud } from '$lib/system'; import { currentPlan } from '$lib/stores/organization'; @@ -65,7 +65,7 @@ return sdk.forProject(page.params.region, page.params.project).backups.createPolicy({ policyId: ID.unique(), - services: ['databases'], + services: [BackupServices.Databases], retention: policy.retained, schedule: policy.schedule, name: policy.label, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte index bd8d8984a..7b009ccbc 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte @@ -1,10 +1,11 @@ @@ -22,9 +23,7 @@ import { isSmallViewport } from '$lib/stores/viewport'; import { type Entity, getTerminologies } from '$database/(entity)'; import { resolveRoute, withPath } from '$lib/stores/navigation'; - import { IndexType } from '@appwrite.io/console'; import { columnOptions as baseColumnOptions } from '$database/table-[table]/columns/store'; - import { IndexOrder } from '$database/(suggestions)'; let { entity, @@ -63,7 +62,7 @@ let fieldList: Array<{ value: string; - order: IndexOrder | null; + order: OrderBy | null; length: number | null; }> = $state([{ value: '', order: null, length: null }]); @@ -78,13 +77,13 @@ let orderOptions = $derived.by(() => selectedType === IndexType.Spatial ? [ - { value: 'ASC', label: 'ASC' }, - { value: 'DESC', label: 'DESC' }, + { value: OrderBy.Asc, label: 'ASC' }, + { value: OrderBy.Desc, label: 'DESC' }, { value: null, label: 'NONE' } ] : [ - { value: 'ASC', label: 'ASC' }, - { value: 'DESC', label: 'DESC' } + { value: OrderBy.Asc, label: 'ASC' }, + { value: OrderBy.Desc, label: 'DESC' } ] ); @@ -111,7 +110,7 @@ function initialize() { const field = entity.fields.filter((field) => externalFieldKey === field.key); const isSpatial = field.length && isSpatialType(field[0]); - const order = isSpatial ? null : IndexOrder.ASC; + const order = isSpatial ? null : OrderBy.Asc; selectedType = isSpatial ? IndexType.Spatial : IndexType.Key; @@ -165,8 +164,7 @@ try { const orders = fieldList .map((field) => field.order) - .filter((order: IndexOrder) => order !== null) - .map((order) => String(order)); + .filter((order): order is OrderBy => order !== null); await onCreateIndex({ key, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte index 722db32d5..b94f7a4e7 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte @@ -4,14 +4,13 @@ import { Button, InputSelect /*InputNumber*/ } from '$lib/elements/forms'; import { showIndexesSuggestions, - IndexOrder, mockSuggestions, type SuggestedIndexSchema } from './store'; import { Modal } from '$lib/components'; import { type Entity, SideSheet } from '$database/(entity)'; import { isSmallViewport } from '$lib/stores/viewport'; - import { IndexType } from '@appwrite.io/console'; + import { IndexType, OrderBy } from '@appwrite.io/console'; import { capitalize } from '$lib/helpers/string'; import { type Columns } from '../table-[table]/store'; import { isRelationship } from '../table-[table]/rows/store'; @@ -74,7 +73,7 @@ key: column.name, type: IndexType.Key, fields: [column.name], - orders: index === 2 ? IndexOrder.DESC : IndexOrder.ASC, + orders: index === 2 ? OrderBy.Desc : OrderBy.Asc, lengths: [] })); } else { @@ -90,7 +89,7 @@ return { key: index.columns[0], type: index.type as IndexType, - orders: (index.orders?.[0] as IndexOrder) || IndexOrder.ASC, + orders: (index.orders?.[0] as OrderBy) || OrderBy.Asc, fields: index.columns, lengths: index.lengths ?? [] }; @@ -118,7 +117,7 @@ indexes.push({ key: '', type: IndexType.Key, - orders: IndexOrder.ASC, + orders: OrderBy.Asc, fields: [], lengths: null }); @@ -139,11 +138,11 @@ } function getOrderOptions(selectedType: IndexType) { - const base = [IndexOrder.ASC, IndexOrder.DESC]; - const values = selectedType === IndexType.Spatial ? [...base, IndexOrder.NONE] : base; + const base = [OrderBy.Asc, OrderBy.Desc]; + const values = selectedType === IndexType.Spatial ? [...base, null] : base; return values.map((order) => ({ - label: capitalize(String(order)), + label: order ? capitalize(String(order)) : 'None', value: order })); } @@ -165,7 +164,7 @@ function prepareIndexForCreation(index: SuggestedIndexSchema, columnMap: Map) { // prepare orders array - const orders = index.orders !== null ? index.fields.map(() => String(index.orders)) : []; + const orders: OrderBy[] = index.orders !== null ? index.fields.map(() => index.orders as OrderBy) : []; // prepare lengths array let lengths: (number | null)[]; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/store.ts index bfc99c432..3e67c90b3 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/store.ts @@ -1,5 +1,5 @@ import { writable } from 'svelte/store'; -import { IndexType } from '@appwrite.io/console'; +import { IndexType, OrderBy } from '@appwrite.io/console'; import { columnOptions } from '../table-[table]/columns/store'; export type TableColumnSuggestions = { @@ -30,11 +30,7 @@ export type SuggestedColumnSchema = { isPlaceholder?: boolean; }; -export enum IndexOrder { - ASC = 'ASC', - DESC = 'DESC', - NONE = null -} +export type IndexOrder = OrderBy | null; export type SuggestedIndexSchema = { key: string; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.svelte index 2374f5306..12cb11a54 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.svelte @@ -17,7 +17,7 @@ import { onMount } from 'svelte'; import { feedback } from '$lib/stores/feedback'; import { cronExpression, type UserBackupPolicy } from '$lib/helpers/backups'; - import { ID } from '@appwrite.io/console'; + import { BackupServices, ID } from '@appwrite.io/console'; import { showCreateBackup, showCreatePolicy } from './store'; import { getProjectId } from '$lib/helpers/project'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; @@ -68,7 +68,7 @@ const createManualBackup = async () => { try { await sdk.forProject(page.params.region, page.params.project).backups.createArchive({ - services: ['databases'], + services: [BackupServices.Databases], resourceId: data.database.$id }); await invalidate(Dependencies.BACKUPS); @@ -123,7 +123,7 @@ return sdk.forProject(page.params.region, page.params.project).backups.createPolicy({ policyId: ID.unique(), - services: ['databases'], + services: [BackupServices.Databases], retention: policy.retained, schedule: policy.schedule, name: policy.label, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte index d1c29d712..c64a53e8e 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte @@ -15,7 +15,7 @@ import { addNotification } from '$lib/stores/notifications'; import { invalidate } from '$app/navigation'; import { calculateSize } from '$lib/helpers/sizeConvertion'; - import { ID, type Models } from '@appwrite.io/console'; + import { BackupServices, ID, type Models } from '@appwrite.io/console'; import { columns } from './store'; import { Click, Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { copy } from '$lib/helpers/copy'; @@ -157,7 +157,7 @@ .forProject(page.params.region, page.params.project) .backups.createRestoration({ archiveId: selectedBackup.$id, - services: ['databases'], + services: [BackupServices.Databases], newResourceId: newDatabaseInfo.id ?? ID.unique(), newResourceName: newDatabaseInfo.name }); diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/deploy/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/deploy/+page.svelte index 04c757d76..7cfade10f 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/deploy/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/deploy/+page.svelte @@ -11,7 +11,7 @@ import { Fieldset, Layout, Icon, Input, Tag } from '@appwrite.io/pink-svelte'; import { IconGithub, IconPencil } from '@appwrite.io/pink-icons-svelte'; import { onMount } from 'svelte'; - import { ID, Runtime, TemplateReferenceType } from '@appwrite.io/console'; + import { ID, Runtime, TemplateReferenceType, type Scopes } from '@appwrite.io/console'; import { CustomId } from '$lib/components'; import { getIconFromRuntime } from '$lib/stores/runtimes'; import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store'; @@ -103,7 +103,7 @@ execute: execute ? ['any'] : undefined, entrypoint: entrypoint || undefined, commands: installCommand || undefined, - scopes: selectedScopes?.length ? selectedScopes : undefined, + scopes: selectedScopes?.length ? (selectedScopes as Scopes[]) : undefined, providerSilentMode: false, specification: specification || undefined }); diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte index 421a217d8..aa29ee02c 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte @@ -15,7 +15,7 @@ import { writable } from 'svelte/store'; import ProductionBranch from '$lib/components/git/productionBranchFieldset.svelte'; import Configuration from './configuration.svelte'; - import { ID, Runtime, TemplateReferenceType, type Models } from '@appwrite.io/console'; + import { ID, Runtime, TemplateReferenceType, type Models, type Scopes } from '@appwrite.io/console'; import { ConnectBehaviour, NewRepository, @@ -140,7 +140,7 @@ timeout: data.template.timeout || undefined, entrypoint: entrypoint || rt?.entrypoint || undefined, commands: rt?.commands || undefined, - scopes: selectedScopes?.length ? selectedScopes : undefined, + scopes: selectedScopes?.length ? (selectedScopes as Scopes[]) : undefined, installationId: connectBehaviour === 'later' ? undefined : $installation?.$id, providerRepositoryId: diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/(modals)/createGit.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/(modals)/createGit.svelte index 24a05f760..1ea7fffbd 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/(modals)/createGit.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/(modals)/createGit.svelte @@ -9,7 +9,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { installation, repository, sortBranches } from '$lib/stores/vcs'; - import { Runtime, VCSReferenceType, type Models } from '@appwrite.io/console'; + import { Runtime, VCSReferenceType, type Models, type Scopes } from '@appwrite.io/console'; import { IconGithub } from '@appwrite.io/pink-icons-svelte'; import { Icon, Input, Layout, Skeleton, Typography } from '@appwrite.io/pink-svelte'; import { func } from '../store'; @@ -87,7 +87,7 @@ logging: $func.logging || undefined, entrypoint: $func.entrypoint, commands: $func.commands || undefined, - scopes: $func.scopes || undefined, + scopes: ($func.scopes as Scopes[]) || undefined, installationId: $installation.$id || undefined, providerRepositoryId: selectedRepository || undefined, providerBranch: branch || undefined diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte index add73ffdd..02eb9364c 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte @@ -10,7 +10,7 @@ import { sortBranches } from '$lib/stores/vcs'; import { IconInfo } from '@appwrite.io/pink-icons-svelte'; import { LabelCard } from '$lib/components'; - import { type Models, ProxyResourceType, Runtime, StatusCode } from '@appwrite.io/console'; + import { type Models, ProxyResourceType, Runtime, StatusCode, type Scopes } from '@appwrite.io/console'; import { statusCodeOptions } from '$lib/stores/domains'; import { writable } from 'svelte/store'; import { onMount } from 'svelte'; @@ -140,7 +140,7 @@ logging: data.func.logging || undefined, entrypoint: data.func.entrypoint, commands: data.func.commands || undefined, - scopes: data.func.scopes || undefined, + scopes: (data.func.scopes as Scopes[]) || undefined, installationId: selectedInstallationId, providerRepositoryId: selectedRepository, providerBranch: 'main' diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/disconnectRepo.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/disconnectRepo.svelte index fb17794bb..9ba31a85a 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/disconnectRepo.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/disconnectRepo.svelte @@ -10,7 +10,7 @@ import { createEventDispatcher } from 'svelte'; import { func } from '../store'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime } from '@appwrite.io/console'; + import { Runtime, type Scopes } from '@appwrite.io/console'; export let show = false; const functionId = page.params.function; @@ -35,7 +35,7 @@ logging: $func.logging || undefined, entrypoint: $func.entrypoint, commands: $func.commands || undefined, - scopes: $func.scopes || undefined, + scopes: ($func.scopes as Scopes[]) || undefined, installationId: '', providerRepositoryId: '', providerBranch: '', diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateBuildCommand.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateBuildCommand.svelte index 247a2672c..1625ebfa8 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateBuildCommand.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateBuildCommand.svelte @@ -7,7 +7,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime, type Models } from '@appwrite.io/console'; + import { Runtime, type Models, type Scopes } from '@appwrite.io/console'; import { page } from '$app/state'; export let func: Models.Function; @@ -30,7 +30,7 @@ logging: func.logging || undefined, entrypoint: func.entrypoint || undefined, commands: buildCommand || undefined, - scopes: func.scopes || undefined, + scopes: (func.scopes as Scopes[]) || undefined, installationId: func.installationId || undefined, providerRepositoryId: func.providerRepositoryId || undefined, providerBranch: func.providerBranch || undefined, diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateEvents.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateEvents.svelte index 60551ed1f..bd171cd6f 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateEvents.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateEvents.svelte @@ -14,7 +14,7 @@ import { EventModal } from '$lib/components'; import { Button } from '$lib/elements/forms'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime } from '@appwrite.io/console'; + import { Runtime, type Scopes } from '@appwrite.io/console'; import { IconPlus, IconX } from '@appwrite.io/pink-icons-svelte'; import { Icon, Layout, Link, Table, Typography } from '@appwrite.io/pink-svelte'; @@ -41,7 +41,7 @@ logging: $func.logging || undefined, entrypoint: $func.entrypoint || undefined, commands: $func.commands || undefined, - scopes: $func.scopes || undefined, + scopes: ($func.scopes as Scopes[]) || undefined, installationId: $func.installationId || undefined, providerRepositoryId: $func.providerRepositoryId || undefined, providerBranch: $func.providerBranch || undefined, diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateLogging.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateLogging.svelte index 9ec63dfab..a943d03ca 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateLogging.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateLogging.svelte @@ -7,7 +7,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime, type Models } from '@appwrite.io/console'; + import { Runtime, type Models, type Scopes } from '@appwrite.io/console'; import { Typography } from '@appwrite.io/pink-svelte'; import { page } from '$app/state'; @@ -31,7 +31,7 @@ logging, entrypoint: func.entrypoint || undefined, commands: func.commands || undefined, - scopes: func.scopes || undefined, + scopes: (func.scopes as Scopes[]) || undefined, installationId: func.installationId || undefined, providerRepositoryId: func.providerRepositoryId || undefined, providerBranch: func.providerBranch || undefined, diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateName.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateName.svelte index 6164f33f0..0bf82a0dd 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateName.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateName.svelte @@ -10,7 +10,7 @@ import { onMount } from 'svelte'; import { func } from '../store'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime } from '@appwrite.io/console'; + import { Runtime, type Scopes } from '@appwrite.io/console'; const functionId = page.params.function; let functionName: string = null; @@ -36,7 +36,7 @@ logging: $func.logging || undefined, entrypoint: $func.entrypoint || undefined, commands: $func.commands || undefined, - scopes: $func.scopes || undefined, + scopes: ($func.scopes as Scopes[]) || undefined, installationId: $func.installationId || undefined, providerRepositoryId: $func.providerRepositoryId || undefined, providerBranch: $func.providerBranch || undefined, diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updatePermissions.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updatePermissions.svelte index 75b9331d6..a8e5ad791 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updatePermissions.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updatePermissions.svelte @@ -12,7 +12,7 @@ import { Roles } from '$lib/components/permissions'; import { symmetricDifference } from '$lib/helpers/array'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime } from '@appwrite.io/console'; + import { Runtime, type Scopes } from '@appwrite.io/console'; import { Link } from '$lib/elements'; const functionId = page.params.function; @@ -41,7 +41,7 @@ logging: $func.logging || undefined, entrypoint: $func.entrypoint || undefined, commands: $func.commands || undefined, - scopes: $func.scopes || undefined, + scopes: ($func.scopes as Scopes[]) || undefined, installationId: $func.installationId || undefined, providerRepositoryId: $func.providerRepositoryId || undefined, providerBranch: $func.providerBranch || undefined, diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateRepository.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateRepository.svelte index 3fbd7f14a..1a2412dfe 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateRepository.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateRepository.svelte @@ -6,7 +6,7 @@ import { Button, Form, InputText } from '$lib/elements/forms'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; - import { Runtime, type Models } from '@appwrite.io/console'; + import { Runtime, type Models, type Scopes } from '@appwrite.io/console'; import { onMount } from 'svelte'; import DisconnectRepo from './disconnectRepo.svelte'; import { installation, repository as repositoryStore, sortBranches } from '$lib/stores/vcs'; @@ -86,7 +86,7 @@ logging: func.logging || undefined, entrypoint: func.entrypoint || undefined, commands: func.commands || undefined, - scopes: func.scopes || undefined, + scopes: (func.scopes as Scopes[]) || undefined, installationId: func.installationId || undefined, providerRepositoryId: func.providerRepositoryId || undefined, providerBranch: selectedBranch, @@ -145,7 +145,7 @@ logging: func.logging || undefined, entrypoint: func.entrypoint, commands: func.commands || undefined, - scopes: func.scopes || undefined, + scopes: (func.scopes as Scopes[]) || undefined, installationId: selectedInstallationId, providerRepositoryId: selectedRepository, providerBranch: 'main' diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateResourceLimits.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateResourceLimits.svelte index fce7e945d..691b5b9b3 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateResourceLimits.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateResourceLimits.svelte @@ -7,7 +7,7 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime, type Models } from '@appwrite.io/console'; + import { Runtime, type Models, type Scopes } from '@appwrite.io/console'; import Link from '$lib/elements/link.svelte'; import { Alert } from '@appwrite.io/pink-svelte'; import { isStarterPlan, getChangePlanUrl } from '$lib/stores/billing'; @@ -39,7 +39,7 @@ logging: func.logging || undefined, entrypoint: func.entrypoint || undefined, commands: func.commands || undefined, - scopes: func.scopes || undefined, + scopes: (func.scopes as Scopes[]) || undefined, installationId: func.installationId || undefined, providerRepositoryId: func.providerRepositoryId || undefined, providerBranch: func.providerBranch || undefined, diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateRuntime.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateRuntime.svelte index c5e62b723..bf6722c98 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateRuntime.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateRuntime.svelte @@ -10,7 +10,7 @@ import { func } from '../store'; import InputSelect from '$lib/elements/forms/inputSelect.svelte'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime, type Models } from '@appwrite.io/console'; + import { Runtime, type Models, type Scopes } from '@appwrite.io/console'; import { Layout, Typography } from '@appwrite.io/pink-svelte'; import Link from '$lib/elements/link.svelte'; @@ -40,7 +40,7 @@ logging: $func.logging || undefined, entrypoint: entrypoint || undefined, commands: $func.commands || undefined, - scopes: $func.scopes || undefined, + scopes: ($func.scopes as Scopes[]) || undefined, installationId: $func.installationId || undefined, providerRepositoryId: $func.providerRepositoryId || undefined, providerBranch: $func.providerBranch || undefined, diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateSchedule.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateSchedule.svelte index ff0de915b..053522644 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateSchedule.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateSchedule.svelte @@ -10,7 +10,7 @@ import { onMount } from 'svelte'; import { func } from '../store'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime } from '@appwrite.io/console'; + import { Runtime, type Scopes } from '@appwrite.io/console'; import { Link } from '$lib/elements'; import { parseExpression } from 'cron-parser'; @@ -41,7 +41,7 @@ logging: $func.logging || undefined, entrypoint: $func.entrypoint || undefined, commands: $func.commands || undefined, - scopes: $func.scopes || undefined, + scopes: ($func.scopes as Scopes[]) || undefined, installationId: $func.installationId || undefined, providerRepositoryId: $func.providerRepositoryId || undefined, providerBranch: $func.providerBranch || undefined, diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateScopes.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateScopes.svelte index f94da117f..d5aa8334f 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateScopes.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateScopes.svelte @@ -10,7 +10,7 @@ import { onMount } from 'svelte'; import { func } from '../store'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime } from '@appwrite.io/console'; + import { Runtime, type Scopes as ScopesType } from '@appwrite.io/console'; import Scopes from '$routes/(console)/project-[region]-[project]/overview/api-keys/scopes.svelte'; import { symmetricDifference } from '$lib/helpers/array'; import { Link } from '$lib/elements'; @@ -39,7 +39,7 @@ logging: $func.logging || undefined, entrypoint: $func.entrypoint || undefined, commands: $func.commands || undefined, - scopes: functionScopes, + scopes: functionScopes as ScopesType[], installationId: $func.installationId || undefined, providerRepositoryId: $func.providerRepositoryId || undefined, providerBranch: $func.providerBranch || undefined, diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateTimeout.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateTimeout.svelte index ccb49d8b0..533367984 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateTimeout.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateTimeout.svelte @@ -10,7 +10,7 @@ import { onMount } from 'svelte'; import { func } from '../store'; import { isValueOfStringEnum } from '$lib/helpers/types'; - import { Runtime } from '@appwrite.io/console'; + import { Runtime, type Scopes } from '@appwrite.io/console'; const functionId = page.params.function; let timeout: number = null; @@ -36,7 +36,7 @@ logging: $func.logging || undefined, entrypoint: $func.entrypoint || undefined, commands: $func.commands || undefined, - scopes: $func.scopes || undefined, + scopes: ($func.scopes as Scopes[]) || undefined, installationId: $func.installationId || undefined, providerRepositoryId: $func.providerRepositoryId || undefined, providerBranch: $func.providerBranch || undefined, 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 4c9bb8150..22fa7c391 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/(components)/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/(components)/create.svelte @@ -14,6 +14,7 @@ import { addNotification } from '$lib/stores/notifications'; import { writable } from 'svelte/store'; import Scopes from '../api-keys/scopes.svelte'; + import { type Scopes as ScopesType } from '@appwrite.io/console'; import { page } from '$app/state'; import { copy } from '$lib/helpers/copy'; @@ -32,7 +33,7 @@ const { $id, secret } = await sdk.forConsole.projects.createKey({ projectId, name, - scopes, + scopes: scopes as ScopesType[], expire: expire || undefined }); 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 a06f7eb29..fd00499ae 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/(components)/keyDetails.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/(components)/keyDetails.svelte @@ -12,7 +12,7 @@ import { project } from '../../store'; import Delete from './delete.svelte'; import UpdateExpirationDate from './updateExpirationDate.svelte'; - import type { Models } from '@appwrite.io/console'; + import type { Models, Scopes as ScopesType } from '@appwrite.io/console'; import { symmetricDifference } from '$lib/helpers/array'; import Scopes from '../api-keys/scopes.svelte'; import { InteractiveText, Layout, Typography } from '@appwrite.io/pink-svelte'; @@ -48,7 +48,7 @@ projectId: $project.$id, keyId: key.$id, name, - scopes, + scopes: scopes as ScopesType[], expire: key.expire }); } else { @@ -81,7 +81,7 @@ projectId: $project.$id, keyId: key.$id, name: key.name, - scopes, + scopes: scopes as ScopesType[], expire: key.expire }); await invalidate(Dependencies.KEY); diff --git a/src/routes/(console)/project-[region]-[project]/overview/(components)/updateExpirationDate.svelte b/src/routes/(console)/project-[region]-[project]/overview/(components)/updateExpirationDate.svelte index 19f49adae..d39669a0f 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/(components)/updateExpirationDate.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/(components)/updateExpirationDate.svelte @@ -9,7 +9,7 @@ import { sdk } from '$lib/stores/sdk'; import { Alert } from '@appwrite.io/pink-svelte'; import { ExpirationInput } from '$lib/components'; - import type { Models } from '@appwrite.io/console'; + import type { Models, Scopes } from '@appwrite.io/console'; import { page } from '$app/state'; export let keyType: 'api' | 'dev' = 'api'; @@ -32,7 +32,7 @@ projectId, keyId: key.$id, name: key.name, - scopes: (key as Models.Key).scopes, + scopes: (key as Models.Key).scopes as Scopes[], expire: expiration }); } else { 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 cc82cb18c..30c1c2248 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 type { Models } from '@appwrite.io/console'; + import { Scopes, type Models } from '@appwrite.io/console'; import { canWriteProjects } from '$lib/stores/roles'; import { IconCloud, @@ -90,23 +90,23 @@ projectId: $project.$id, name: `[AUTO-GENERATED] Migration ${new Date().toISOString()}`, scopes: [ - 'users.read', - 'teams.read', - 'databases.read', - 'collections.read' /* legacy */, - 'attributes.read' /* legacy */, - 'indexes.read', - 'documents.read' /* legacy */, - 'tables.read', - 'columns.read', - 'rows.read', - 'files.read', - 'buckets.read', - 'functions.read', - 'execution.read', - 'locale.read', - 'avatars.read', - 'health.read' + 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.ExecutionRead, + Scopes.LocaleRead, + Scopes.AvatarsRead, + Scopes.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 64dc9cb1e..584a36d37 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte @@ -10,6 +10,7 @@ import { sdk } from '$lib/stores/sdk'; import { user } from '$lib/stores/user'; import { organization } from '$lib/stores/organization'; + import { Scopes } from '@appwrite.io/console'; export let show = false; @@ -91,23 +92,23 @@ projectId: $project.$id, name: `[AUTO-GENERATED] Migration ${new Date().toISOString()}`, scopes: [ - 'users.read', - 'teams.read', - 'databases.read', - 'collections.read' /* legacy */, - 'attributes.read' /* legacy */, - 'indexes.read', - 'documents.read' /* legacy */, - 'tables.read', - 'columns.read', - 'rows.read', - 'files.read', - 'buckets.read', - 'functions.read', - 'execution.read', - 'locale.read', - 'avatars.read', - 'health.read' + 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.ExecutionRead, + Scopes.LocaleRead, + Scopes.AvatarsRead, + Scopes.HealthRead ] }); From a7c0ec5f8a9f1a8ecea2211169aad236eb635c2f Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 6 Feb 2026 18:32:40 +1300 Subject: [PATCH 06/12] style: fix prettier formatting Co-Authored-By: Claude Opus 4.5 --- src/lib/stores/migration.ts | 4 +--- .../database-[database]/(suggestions)/indexes.svelte | 9 +++------ .../create-function/template-[template]/+page.svelte | 8 +++++++- .../function-[function]/domains/add-domain/+page.svelte | 8 +++++++- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index dc57a6e9c..534cddc6a 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -145,9 +145,7 @@ export const resourcesToMigrationForm = (resources: Resources[]): MigrationFormD if (resources.includes(Resources.Database)) { formData.databases.root = true; } - if ( - includesAll(resources, [Resources.Table, Resources.Column, Resources.Row] as Resources[]) - ) { + if (includesAll(resources, [Resources.Table, Resources.Column, Resources.Row] as Resources[])) { formData.databases.rows = true; } if (includesAll(resources, [Resources.Bucket, Resources.File] as Resources[])) { diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte index b94f7a4e7..b37783c1b 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte @@ -2,11 +2,7 @@ import { Alert, Accordion, Icon, Layout, Skeleton, Typography } from '@appwrite.io/pink-svelte'; import { IconPlus, IconX } from '@appwrite.io/pink-icons-svelte'; import { Button, InputSelect /*InputNumber*/ } from '$lib/elements/forms'; - import { - showIndexesSuggestions, - mockSuggestions, - type SuggestedIndexSchema - } from './store'; + import { showIndexesSuggestions, mockSuggestions, type SuggestedIndexSchema } from './store'; import { Modal } from '$lib/components'; import { type Entity, SideSheet } from '$database/(entity)'; import { isSmallViewport } from '$lib/stores/viewport'; @@ -164,7 +160,8 @@ function prepareIndexForCreation(index: SuggestedIndexSchema, columnMap: Map) { // prepare orders array - const orders: OrderBy[] = index.orders !== null ? index.fields.map(() => index.orders as OrderBy) : []; + const orders: OrderBy[] = + index.orders !== null ? index.fields.map(() => index.orders as OrderBy) : []; // prepare lengths array let lengths: (number | null)[]; diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte index aa29ee02c..2f24097bc 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte @@ -15,7 +15,13 @@ import { writable } from 'svelte/store'; import ProductionBranch from '$lib/components/git/productionBranchFieldset.svelte'; import Configuration from './configuration.svelte'; - import { ID, Runtime, TemplateReferenceType, type Models, type Scopes } from '@appwrite.io/console'; + import { + ID, + Runtime, + TemplateReferenceType, + type Models, + type Scopes + } from '@appwrite.io/console'; import { ConnectBehaviour, NewRepository, diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte index 02eb9364c..0bef85a93 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/+page.svelte @@ -10,7 +10,13 @@ import { sortBranches } from '$lib/stores/vcs'; import { IconInfo } from '@appwrite.io/pink-icons-svelte'; import { LabelCard } from '$lib/components'; - import { type Models, ProxyResourceType, Runtime, StatusCode, type Scopes } from '@appwrite.io/console'; + import { + type Models, + ProxyResourceType, + Runtime, + StatusCode, + type Scopes + } from '@appwrite.io/console'; import { statusCodeOptions } from '$lib/stores/domains'; import { writable } from 'svelte/store'; import { onMount } from 'svelte'; From 9b334e9b250e096ec70f434f38d35f7162034989 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 6 Feb 2026 18:37:26 +1300 Subject: [PATCH 07/12] style: fix prettier formatting in varchar.svelte Co-Authored-By: Claude Opus 4.5 --- .../table-[table]/columns/varchar.svelte | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte index b48bed9ba..f2f046a75 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/varchar.svelte @@ -64,7 +64,7 @@ } function getNewColumnBytes(s: number): number { - return (s * 4) + (s <= 255 ? 1 : 2); + return s * 4 + (s <= 255 ? 1 : 2); } function getProgressData(bytesUsed: number, bytesMax: number, s: number) { @@ -93,7 +93,7 @@ $: bytesMax = $table?.bytesMax ?? 65535; $: bytesUsed = $table?.bytesUsed ?? 0; $: newColumnBytes = getNewColumnBytes(size); - $: exceedsLimit = !editing && (bytesUsed + newColumnBytes) > bytesMax; + $: exceedsLimit = !editing && bytesUsed + newColumnBytes > bytesMax; let savedDefault = data.default; @@ -139,14 +139,17 @@ - Database rows have a maximum size of 64 KB. varchar columns use 4 bytes per character plus a small overhead. text, mediumtext, and longtext columns only use ~20 bytes regardless of content length. + Database rows have a maximum size of 64 KB. varchar columns use 4 bytes per + character plus a small overhead. text, mediumtext, and longtext columns only use + ~20 bytes regardless of content length. {#if exceedsLimit} - This column exceeds the remaining row space. Consider using text, mediumtext, or longtext instead. + This column exceeds the remaining row space. Consider using text, mediumtext, or + longtext instead. {/if} From cb0989a47697c2c04b8a57160316fec4b093e2d8 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 6 Feb 2026 18:52:35 +1300 Subject: [PATCH 08/12] Address CodeRabbit review comments - Add ColumnVarchar, ColumnText, ColumnMediumtext, ColumnLongtext to string.svelte column prop type - Update type cast to include ColumnVarchar for size property access - Remove unreachable functions migration alert (shouldRenderGroup always returns false for functions) - Add || undefined fallback to scopes in updateScopes.svelte for consistency Co-Authored-By: Claude Opus 4.5 --- .../(console)/(migration-wizard)/resource-form.svelte | 8 -------- .../table-[table]/rows/columns/types/string.svelte | 6 +++++- .../function-[function]/settings/updateScopes.svelte | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index 650a7f10e..4113f12c9 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -132,14 +132,6 @@ - {#if report && !isVersionAtLeast(version, '1.4.0') && $provider.provider === 'appwrite'} - - Functions not available for import - To migrate your functions, update the version of the Appwrite instance you're importing from - to a version newer than 1.4 - - {/if} - {#if error} {#if migrationType === 'provider'} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte index eecfafe13..fbfa549ae 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte @@ -20,6 +20,10 @@ limited?: boolean; column: | Models.ColumnString + | Models.ColumnVarchar + | Models.ColumnText + | Models.ColumnMediumtext + | Models.ColumnLongtext | Models.ColumnInteger | Models.ColumnFloat | Models.ColumnBoolean @@ -33,7 +37,7 @@ limited ? undefined : column.type === 'string' || column.type === 'varchar' - ? (column as Models.ColumnString).size + ? (column as Models.ColumnString | Models.ColumnVarchar).size : undefined ); diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateScopes.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateScopes.svelte index d5aa8334f..ea8469992 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateScopes.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/updateScopes.svelte @@ -39,7 +39,7 @@ logging: $func.logging || undefined, entrypoint: $func.entrypoint || undefined, commands: $func.commands || undefined, - scopes: functionScopes as ScopesType[], + scopes: (functionScopes as ScopesType[]) || undefined, installationId: $func.installationId || undefined, providerRepositoryId: $func.providerRepositoryId || undefined, providerBranch: $func.providerBranch || undefined, From 40ba4db14ff82683add0216bd64320c71debe917 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 6 Feb 2026 19:27:09 +1300 Subject: [PATCH 09/12] Remove unused isVersionAtLeast import and version variable Co-Authored-By: Claude Opus 4.5 --- src/routes/(console)/(migration-wizard)/resource-form.svelte | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index 4113f12c9..54e3f23ba 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -5,7 +5,6 @@ import { createMigrationFormStore, createMigrationProviderStore, - isVersionAtLeast, type MigrationFormData, providerResources, resourcesToMigrationForm @@ -36,8 +35,6 @@ $formData = resourcesToMigrationForm(resources); } - $: version = report?.version || '0.0.0'; - let error = false; let isOpen = false; let report: Models.MigrationReport; From 17aba0a3ae51e32da551085b133d14a63795998f Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 6 Feb 2026 20:47:49 +1300 Subject: [PATCH 10/12] Use isTextType function instead of inline textTypes array Co-Authored-By: Claude Opus 4.5 --- .../table-[table]/settings/displayName.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/displayName.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/displayName.svelte index d8298d9c0..080f210fa 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/displayName.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/displayName.svelte @@ -8,6 +8,7 @@ import { addNotification } from '$lib/stores/notifications'; import type { Models } from '@appwrite.io/console'; import { columns } from '../store'; + import { isTextType } from '../rows/store'; import { preferences } from '$lib/stores/preferences'; import { page } from '$app/state'; import { Icon, Layout } from '@appwrite.io/pink-svelte'; @@ -46,9 +47,8 @@ } function getValidColumns() { - const textTypes = ['string', 'varchar', 'text', 'mediumtext', 'longtext']; return ($columns as Models.ColumnString[]).filter( - (attr) => textTypes.includes(attr.type) && !attr?.array + (attr) => isTextType(attr) && !attr?.array ); } From 5581e9cca5c3af94711d4500a601bdeae09807d4 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 6 Feb 2026 20:49:22 +1300 Subject: [PATCH 11/12] Type selectedScopes as Scopes[] instead of casting at call site Co-Authored-By: Claude Opus 4.5 --- .../create-function/template-[template]/+page.svelte | 4 ++-- .../create-function/template-[template]/permissions.svelte | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte index 2f24097bc..eee490a43 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte @@ -68,7 +68,7 @@ let showConfig = false; let silentMode = false; let entrypoint = ''; - let selectedScopes: string[] = []; + let selectedScopes: Scopes[] = []; let execute = true; let variables: Partial[] = []; let specification = specificationOptions[0]?.value || ''; @@ -146,7 +146,7 @@ timeout: data.template.timeout || undefined, entrypoint: entrypoint || rt?.entrypoint || undefined, commands: rt?.commands || undefined, - scopes: selectedScopes?.length ? (selectedScopes as Scopes[]) : undefined, + scopes: selectedScopes?.length ? selectedScopes : undefined, installationId: connectBehaviour === 'later' ? undefined : $installation?.$id, providerRepositoryId: diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/permissions.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/permissions.svelte index 0930c0e4f..3392f994e 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/permissions.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/permissions.svelte @@ -1,15 +1,16 @@