From 385512cc599e9963c4ef1f368182afa5ebb04968 Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Wed, 13 May 2026 19:42:28 +0100 Subject: [PATCH 01/10] feat: support platform resource in migration wizard --- src/lib/stores/migration.ts | 26 ++++++++++++++++--- .../(migration-wizard)/resource-form.svelte | 7 ++++- .../migrations/(import)/importReport.svelte | 6 +++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index 756f63661f..267badab56 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -11,11 +11,16 @@ export type MigrationResource = | AppwriteMigrationResource | FirebaseMigrationResource | NHostMigrationResource - | SupabaseMigrationResource; + | SupabaseMigrationResource + | 'platform'; // Appwrite enum is the superset of all provider resources — used as a // provider-agnostic reference. The addResource guard filters by provider. -export const MigrationResources = AppwriteMigrationResource; +// Platform is augmented locally until @appwrite.io/console SDK is regenerated against the new spec. +export const MigrationResources = { + ...AppwriteMigrationResource, + Platform: 'platform' +} as const; type ProviderResourceMap = { appwrite: AppwriteMigrationResource[]; @@ -50,6 +55,9 @@ const initialFormData = { }, backups: { root: false + }, + integrations: { + root: false } }; @@ -88,11 +96,15 @@ export const ResourcesFriendly = { topic: { singular: 'Topic', plural: 'Topics' }, subscriber: { singular: 'Subscriber', plural: 'Subscribers' }, message: { singular: 'Message', plural: 'Messages' }, - 'backup-policy': { singular: 'Backup Policy', plural: 'Backup Policies' } + 'backup-policy': { singular: 'Backup Policy', plural: 'Backup Policies' }, + platform: { singular: 'Platform', plural: 'Platforms' } }; export const providerResources: ProviderResourceMap = { - appwrite: Object.values(AppwriteMigrationResource), + appwrite: [ + ...Object.values(AppwriteMigrationResource), + MigrationResources.Platform as AppwriteMigrationResource + ], supabase: Object.values(SupabaseMigrationResource), nhost: Object.values(NHostMigrationResource), firebase: Object.values(FirebaseMigrationResource) @@ -155,6 +167,9 @@ export const migrationFormToResources =

( if (formData.backups.root) { addResource(MigrationResources.Backuppolicy); } + if (formData.integrations.root) { + addResource(MigrationResources.Platform); + } return resources as ProviderResourceMap[P]; }; @@ -234,6 +249,9 @@ export const resourcesToMigrationForm = (resources: MigrationResource[]): Migrat if (resources.includes(MigrationResources.Backuppolicy)) { formData.backups.root = true; } + if (resources.includes(MigrationResources.Platform)) { + formData.integrations.root = true; + } return formData; }; diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index 7b863f7b79..134ce8a744 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -119,6 +119,10 @@ return resources.includes(MigrationResources.Backuppolicy); } + if (groupKey === 'integrations') { + return resources.includes(MigrationResources.Platform); + } + const groupToResource: Record = { users: MigrationResources.User, databases: MigrationResources.Database @@ -140,7 +144,8 @@ storage: 'bucket', sites: 'site', messaging: 'provider', - backups: 'backup-policy' + backups: 'backup-policy', + integrations: 'platform' }; return map[groupKey] || groupKey; }; diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index 991426918c..9d917ea727 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -36,6 +36,9 @@ }, backups: { root: 'Backup policies' + }, + integrations: { + root: 'Platforms' } }; @@ -62,6 +65,9 @@ }, backups: { root: 'Import all backup policies' + }, + integrations: { + root: 'Import all platforms (web, Flutter, iOS, Android, etc.)' } }; From 1116c5736deea4faf4a8b8cb817188dd5913f299 Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Thu, 14 May 2026 19:13:35 +0100 Subject: [PATCH 02/10] Add API key migration wizard support Adds api-key as a child toggle under the existing integrations group, matching the parent-child pattern used by users/teams, databases/rows, and messaging/messages. The backend uses the kebab-case 'api-key' resource id; the form field stays camelCase as a local property. --- src/lib/stores/migration.ts | 24 ++++++++++++++----- .../(migration-wizard)/resource-form.svelte | 5 +++- .../migrations/(import)/importReport.svelte | 6 +++-- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index 267badab56..f11eba8bf7 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -12,14 +12,16 @@ export type MigrationResource = | FirebaseMigrationResource | NHostMigrationResource | SupabaseMigrationResource - | 'platform'; + | 'platform' + | 'api-key'; // Appwrite enum is the superset of all provider resources — used as a // provider-agnostic reference. The addResource guard filters by provider. -// Platform is augmented locally until @appwrite.io/console SDK is regenerated against the new spec. +// Platform and ApiKey are augmented locally until @appwrite.io/console SDK is regenerated against the new spec. export const MigrationResources = { ...AppwriteMigrationResource, - Platform: 'platform' + Platform: 'platform', + ApiKey: 'api-key' } as const; type ProviderResourceMap = { @@ -57,7 +59,8 @@ const initialFormData = { root: false }, integrations: { - root: false + root: false, + apiKeys: false } }; @@ -97,13 +100,15 @@ export const ResourcesFriendly = { subscriber: { singular: 'Subscriber', plural: 'Subscribers' }, message: { singular: 'Message', plural: 'Messages' }, 'backup-policy': { singular: 'Backup Policy', plural: 'Backup Policies' }, - platform: { singular: 'Platform', plural: 'Platforms' } + platform: { singular: 'Platform', plural: 'Platforms' }, + 'api-key': { singular: 'API Key', plural: 'API Keys' } }; export const providerResources: ProviderResourceMap = { appwrite: [ ...Object.values(AppwriteMigrationResource), - MigrationResources.Platform as AppwriteMigrationResource + MigrationResources.Platform as AppwriteMigrationResource, + MigrationResources.ApiKey as AppwriteMigrationResource ], supabase: Object.values(SupabaseMigrationResource), nhost: Object.values(NHostMigrationResource), @@ -169,6 +174,9 @@ export const migrationFormToResources =

( } if (formData.integrations.root) { addResource(MigrationResources.Platform); + if (formData.integrations.apiKeys) { + addResource(MigrationResources.ApiKey); + } } return resources as ProviderResourceMap[P]; @@ -252,6 +260,10 @@ export const resourcesToMigrationForm = (resources: MigrationResource[]): Migrat if (resources.includes(MigrationResources.Platform)) { formData.integrations.root = true; } + if (resources.includes(MigrationResources.ApiKey)) { + formData.integrations.root = true; + formData.integrations.apiKeys = true; + } return formData; }; diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index 134ce8a744..e682bb1fd1 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -120,7 +120,10 @@ } if (groupKey === 'integrations') { - return resources.includes(MigrationResources.Platform); + return ( + resources.includes(MigrationResources.Platform) || + resources.includes(MigrationResources.ApiKey) + ); } const groupToResource: Record = { diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index 9d917ea727..d1ffa3532d 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -38,7 +38,8 @@ root: 'Backup policies' }, integrations: { - root: 'Platforms' + root: 'Platforms', + apiKeys: 'Include API keys' } }; @@ -67,7 +68,8 @@ root: 'Import all backup policies' }, integrations: { - root: 'Import all platforms (web, Flutter, iOS, Android, etc.)' + root: 'Import all platforms (web, Flutter, iOS, Android, etc.)', + apiKeys: 'Import all API keys with their scopes and expiration' } }; From e53bbaca86453627c1d4cc3fc6281fdc7645dde4 Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Thu, 14 May 2026 20:15:52 +0100 Subject: [PATCH 03/10] Add project variable migration wizard support Adds new 'settings' form group (parent for project-level configuration like variables and webhooks). Project variables become settings.root. The backend migration library exposes them via the new GROUP_SETTINGS. --- src/lib/stores/migration.ts | 24 +++++++++++++++---- .../(migration-wizard)/resource-form.svelte | 7 +++++- .../migrations/(import)/importReport.svelte | 6 +++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index f11eba8bf7..c041ebf8de 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -13,15 +13,18 @@ export type MigrationResource = | NHostMigrationResource | SupabaseMigrationResource | 'platform' - | 'api-key'; + | 'api-key' + | 'project-variable'; // Appwrite enum is the superset of all provider resources — used as a // provider-agnostic reference. The addResource guard filters by provider. -// Platform and ApiKey are augmented locally until @appwrite.io/console SDK is regenerated against the new spec. +// Platform, ApiKey and ProjectVariable are augmented locally until @appwrite.io/console +// SDK is regenerated against the new spec. export const MigrationResources = { ...AppwriteMigrationResource, Platform: 'platform', - ApiKey: 'api-key' + ApiKey: 'api-key', + ProjectVariable: 'project-variable' } as const; type ProviderResourceMap = { @@ -61,6 +64,9 @@ const initialFormData = { integrations: { root: false, apiKeys: false + }, + settings: { + root: false } }; @@ -101,14 +107,16 @@ export const ResourcesFriendly = { message: { singular: 'Message', plural: 'Messages' }, 'backup-policy': { singular: 'Backup Policy', plural: 'Backup Policies' }, platform: { singular: 'Platform', plural: 'Platforms' }, - 'api-key': { singular: 'API Key', plural: 'API Keys' } + 'api-key': { singular: 'API Key', plural: 'API Keys' }, + 'project-variable': { singular: 'Project Variable', plural: 'Project Variables' } }; export const providerResources: ProviderResourceMap = { appwrite: [ ...Object.values(AppwriteMigrationResource), MigrationResources.Platform as AppwriteMigrationResource, - MigrationResources.ApiKey as AppwriteMigrationResource + MigrationResources.ApiKey as AppwriteMigrationResource, + MigrationResources.ProjectVariable as AppwriteMigrationResource ], supabase: Object.values(SupabaseMigrationResource), nhost: Object.values(NHostMigrationResource), @@ -178,6 +186,9 @@ export const migrationFormToResources =

( addResource(MigrationResources.ApiKey); } } + if (formData.settings.root) { + addResource(MigrationResources.ProjectVariable); + } return resources as ProviderResourceMap[P]; }; @@ -264,6 +275,9 @@ export const resourcesToMigrationForm = (resources: MigrationResource[]): Migrat formData.integrations.root = true; formData.integrations.apiKeys = true; } + if (resources.includes(MigrationResources.ProjectVariable)) { + formData.settings.root = true; + } return formData; }; diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index e682bb1fd1..0c241eb468 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -126,6 +126,10 @@ ); } + if (groupKey === 'settings') { + return resources.includes(MigrationResources.ProjectVariable); + } + const groupToResource: Record = { users: MigrationResources.User, databases: MigrationResources.Database @@ -148,7 +152,8 @@ sites: 'site', messaging: 'provider', backups: 'backup-policy', - integrations: 'platform' + integrations: 'platform', + settings: 'project-variable' }; return map[groupKey] || groupKey; }; diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index d1ffa3532d..9ba84476e7 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -40,6 +40,9 @@ integrations: { root: 'Platforms', apiKeys: 'Include API keys' + }, + settings: { + root: 'Project variables' } }; @@ -70,6 +73,9 @@ integrations: { root: 'Import all platforms (web, Flutter, iOS, Android, etc.)', apiKeys: 'Import all API keys with their scopes and expiration' + }, + settings: { + root: 'Import all project-level variables (secret values are not exposed by the SDK and will be migrated empty)' } }; From 09c4fc0b357a28732bc82359403d43fcd901ec2c Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Thu, 14 May 2026 20:34:02 +0100 Subject: [PATCH 04/10] Add webhook migration wizard support Adds webhook as a child toggle under the existing settings group, joining project variables as the second project-level setting that can be migrated. --- src/lib/stores/migration.ts | 26 ++++++++++++++----- .../(migration-wizard)/resource-form.svelte | 5 +++- .../migrations/(import)/importReport.svelte | 6 +++-- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index c041ebf8de..29a074c34a 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -14,17 +14,19 @@ export type MigrationResource = | SupabaseMigrationResource | 'platform' | 'api-key' - | 'project-variable'; + | 'project-variable' + | 'webhook'; // Appwrite enum is the superset of all provider resources — used as a // provider-agnostic reference. The addResource guard filters by provider. -// Platform, ApiKey and ProjectVariable are augmented locally until @appwrite.io/console -// SDK is regenerated against the new spec. +// Platform, ApiKey, ProjectVariable and Webhook are augmented locally until +// @appwrite.io/console SDK is regenerated against the new spec. export const MigrationResources = { ...AppwriteMigrationResource, Platform: 'platform', ApiKey: 'api-key', - ProjectVariable: 'project-variable' + ProjectVariable: 'project-variable', + Webhook: 'webhook' } as const; type ProviderResourceMap = { @@ -66,7 +68,8 @@ const initialFormData = { apiKeys: false }, settings: { - root: false + root: false, + webhooks: false } }; @@ -108,7 +111,8 @@ export const ResourcesFriendly = { 'backup-policy': { singular: 'Backup Policy', plural: 'Backup Policies' }, platform: { singular: 'Platform', plural: 'Platforms' }, 'api-key': { singular: 'API Key', plural: 'API Keys' }, - 'project-variable': { singular: 'Project Variable', plural: 'Project Variables' } + 'project-variable': { singular: 'Project Variable', plural: 'Project Variables' }, + webhook: { singular: 'Webhook', plural: 'Webhooks' } }; export const providerResources: ProviderResourceMap = { @@ -116,7 +120,8 @@ export const providerResources: ProviderResourceMap = { ...Object.values(AppwriteMigrationResource), MigrationResources.Platform as AppwriteMigrationResource, MigrationResources.ApiKey as AppwriteMigrationResource, - MigrationResources.ProjectVariable as AppwriteMigrationResource + MigrationResources.ProjectVariable as AppwriteMigrationResource, + MigrationResources.Webhook as AppwriteMigrationResource ], supabase: Object.values(SupabaseMigrationResource), nhost: Object.values(NHostMigrationResource), @@ -188,6 +193,9 @@ export const migrationFormToResources =

( } if (formData.settings.root) { addResource(MigrationResources.ProjectVariable); + if (formData.settings.webhooks) { + addResource(MigrationResources.Webhook); + } } return resources as ProviderResourceMap[P]; @@ -278,6 +286,10 @@ export const resourcesToMigrationForm = (resources: MigrationResource[]): Migrat if (resources.includes(MigrationResources.ProjectVariable)) { formData.settings.root = true; } + if (resources.includes(MigrationResources.Webhook)) { + formData.settings.root = true; + formData.settings.webhooks = true; + } return formData; }; diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index 0c241eb468..e3de2f7553 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -127,7 +127,10 @@ } if (groupKey === 'settings') { - return resources.includes(MigrationResources.ProjectVariable); + return ( + resources.includes(MigrationResources.ProjectVariable) || + resources.includes(MigrationResources.Webhook) + ); } const groupToResource: Record = { diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index 9ba84476e7..49afcab135 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -42,7 +42,8 @@ apiKeys: 'Include API keys' }, settings: { - root: 'Project variables' + root: 'Project variables', + webhooks: 'Include webhooks' } }; @@ -75,7 +76,8 @@ apiKeys: 'Import all API keys with their scopes and expiration' }, settings: { - root: 'Import all project-level variables (secret values are not exposed by the SDK and will be migrated empty)' + root: 'Import all project-level variables (secret values are not exposed by the SDK and will be migrated empty)', + webhooks: 'Import all webhooks (signing secrets are not exposed by the SDK; the destination regenerates a fresh signature key for each)' } }; From c547bc5c16bce096b50f217a51b1f6235d82e55c Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Mon, 18 May 2026 13:37:25 +0100 Subject: [PATCH 05/10] Add AuthMethods migration wizard support - MigrationResource union + MigrationResources enum gain 'auth-methods' - New top-level form group 'authMethods' (root-only, like backups) - providerResources.appwrite includes AuthMethods - migrationFormToResources / resourcesToMigrationForm round-trip - resource-form.svelte shouldRenderGroup + getReportKey - importReport.svelte labelMap + descriptionMap --- src/lib/stores/migration.ts | 23 +++++++++++++++---- .../(migration-wizard)/resource-form.svelte | 5 ++++ .../migrations/(import)/importReport.svelte | 9 +++++++- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index 29a074c34a..6b569eedb8 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -15,18 +15,20 @@ export type MigrationResource = | 'platform' | 'api-key' | 'project-variable' - | 'webhook'; + | 'webhook' + | 'auth-methods'; // Appwrite enum is the superset of all provider resources — used as a // provider-agnostic reference. The addResource guard filters by provider. -// Platform, ApiKey, ProjectVariable and Webhook are augmented locally until -// @appwrite.io/console SDK is regenerated against the new spec. +// Platform, ApiKey, ProjectVariable, Webhook and AuthMethods are augmented +// locally until @appwrite.io/console SDK is regenerated against the new spec. export const MigrationResources = { ...AppwriteMigrationResource, Platform: 'platform', ApiKey: 'api-key', ProjectVariable: 'project-variable', - Webhook: 'webhook' + Webhook: 'webhook', + AuthMethods: 'auth-methods' } as const; type ProviderResourceMap = { @@ -63,6 +65,9 @@ const initialFormData = { backups: { root: false }, + authMethods: { + root: false + }, integrations: { root: false, apiKeys: false @@ -112,12 +117,14 @@ export const ResourcesFriendly = { platform: { singular: 'Platform', plural: 'Platforms' }, 'api-key': { singular: 'API Key', plural: 'API Keys' }, 'project-variable': { singular: 'Project Variable', plural: 'Project Variables' }, - webhook: { singular: 'Webhook', plural: 'Webhooks' } + webhook: { singular: 'Webhook', plural: 'Webhooks' }, + 'auth-methods': { singular: 'Auth method config', plural: 'Auth method config' } }; export const providerResources: ProviderResourceMap = { appwrite: [ ...Object.values(AppwriteMigrationResource), + MigrationResources.AuthMethods as AppwriteMigrationResource, MigrationResources.Platform as AppwriteMigrationResource, MigrationResources.ApiKey as AppwriteMigrationResource, MigrationResources.ProjectVariable as AppwriteMigrationResource, @@ -185,6 +192,9 @@ export const migrationFormToResources =

( if (formData.backups.root) { addResource(MigrationResources.Backuppolicy); } + if (formData.authMethods.root) { + addResource(MigrationResources.AuthMethods); + } if (formData.integrations.root) { addResource(MigrationResources.Platform); if (formData.integrations.apiKeys) { @@ -276,6 +286,9 @@ export const resourcesToMigrationForm = (resources: MigrationResource[]): Migrat if (resources.includes(MigrationResources.Backuppolicy)) { formData.backups.root = true; } + if (resources.includes(MigrationResources.AuthMethods)) { + formData.authMethods.root = true; + } if (resources.includes(MigrationResources.Platform)) { formData.integrations.root = true; } diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index e3de2f7553..31c6547376 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -119,6 +119,10 @@ return resources.includes(MigrationResources.Backuppolicy); } + if (groupKey === 'authMethods') { + return resources.includes(MigrationResources.AuthMethods); + } + if (groupKey === 'integrations') { return ( resources.includes(MigrationResources.Platform) || @@ -155,6 +159,7 @@ sites: 'site', messaging: 'provider', backups: 'backup-policy', + authMethods: 'auth-methods', integrations: 'platform', settings: 'project-variable' }; diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index 49afcab135..7fa627d70f 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -37,6 +37,9 @@ backups: { root: 'Backup policies' }, + authMethods: { + root: 'Auth methods' + }, integrations: { root: 'Platforms', apiKeys: 'Include API keys' @@ -71,13 +74,17 @@ backups: { root: 'Import all backup policies' }, + authMethods: { + root: 'Import the project auth method flags (email/password, magic URL, JWT, phone, etc.)' + }, integrations: { root: 'Import all platforms (web, Flutter, iOS, Android, etc.)', apiKeys: 'Import all API keys with their scopes and expiration' }, settings: { root: 'Import all project-level variables (secret values are not exposed by the SDK and will be migrated empty)', - webhooks: 'Import all webhooks (signing secrets are not exposed by the SDK; the destination regenerates a fresh signature key for each)' + webhooks: + 'Import all webhooks (signing secrets are not exposed by the SDK; the destination regenerates a fresh signature key for each)' } }; From 3528e41b7afe2bac77fb3db612ade50ca2ea86cb Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Mon, 18 May 2026 14:24:35 +0100 Subject: [PATCH 06/10] Add Protocols migration wizard support --- src/lib/stores/migration.ts | 23 +++++++++++++++---- .../(migration-wizard)/resource-form.svelte | 5 ++++ .../migrations/(import)/importReport.svelte | 6 +++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index 6b569eedb8..43e738bd8b 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -16,19 +16,21 @@ export type MigrationResource = | 'api-key' | 'project-variable' | 'webhook' - | 'auth-methods'; + | 'auth-methods' + | 'protocols'; // Appwrite enum is the superset of all provider resources — used as a // provider-agnostic reference. The addResource guard filters by provider. -// Platform, ApiKey, ProjectVariable, Webhook and AuthMethods are augmented -// locally until @appwrite.io/console SDK is regenerated against the new spec. +// Platform, ApiKey, ProjectVariable, Webhook, AuthMethods and Protocols are +// augmented locally until @appwrite.io/console SDK is regenerated. export const MigrationResources = { ...AppwriteMigrationResource, Platform: 'platform', ApiKey: 'api-key', ProjectVariable: 'project-variable', Webhook: 'webhook', - AuthMethods: 'auth-methods' + AuthMethods: 'auth-methods', + Protocols: 'protocols' } as const; type ProviderResourceMap = { @@ -68,6 +70,9 @@ const initialFormData = { authMethods: { root: false }, + protocols: { + root: false + }, integrations: { root: false, apiKeys: false @@ -118,13 +123,15 @@ export const ResourcesFriendly = { 'api-key': { singular: 'API Key', plural: 'API Keys' }, 'project-variable': { singular: 'Project Variable', plural: 'Project Variables' }, webhook: { singular: 'Webhook', plural: 'Webhooks' }, - 'auth-methods': { singular: 'Auth method config', plural: 'Auth method config' } + 'auth-methods': { singular: 'Auth method config', plural: 'Auth method config' }, + protocols: { singular: 'Protocol config', plural: 'Protocol config' } }; export const providerResources: ProviderResourceMap = { appwrite: [ ...Object.values(AppwriteMigrationResource), MigrationResources.AuthMethods as AppwriteMigrationResource, + MigrationResources.Protocols as AppwriteMigrationResource, MigrationResources.Platform as AppwriteMigrationResource, MigrationResources.ApiKey as AppwriteMigrationResource, MigrationResources.ProjectVariable as AppwriteMigrationResource, @@ -195,6 +202,9 @@ export const migrationFormToResources =

( if (formData.authMethods.root) { addResource(MigrationResources.AuthMethods); } + if (formData.protocols.root) { + addResource(MigrationResources.Protocols); + } if (formData.integrations.root) { addResource(MigrationResources.Platform); if (formData.integrations.apiKeys) { @@ -289,6 +299,9 @@ export const resourcesToMigrationForm = (resources: MigrationResource[]): Migrat if (resources.includes(MigrationResources.AuthMethods)) { formData.authMethods.root = true; } + if (resources.includes(MigrationResources.Protocols)) { + formData.protocols.root = true; + } if (resources.includes(MigrationResources.Platform)) { formData.integrations.root = true; } diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index 31c6547376..3d7eb82a0d 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -123,6 +123,10 @@ return resources.includes(MigrationResources.AuthMethods); } + if (groupKey === 'protocols') { + return resources.includes(MigrationResources.Protocols); + } + if (groupKey === 'integrations') { return ( resources.includes(MigrationResources.Platform) || @@ -160,6 +164,7 @@ messaging: 'provider', backups: 'backup-policy', authMethods: 'auth-methods', + protocols: 'protocols', integrations: 'platform', settings: 'project-variable' }; diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index 7fa627d70f..df7ac1fe81 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -40,6 +40,9 @@ authMethods: { root: 'Auth methods' }, + protocols: { + root: 'Protocols' + }, integrations: { root: 'Platforms', apiKeys: 'Include API keys' @@ -77,6 +80,9 @@ authMethods: { root: 'Import the project auth method flags (email/password, magic URL, JWT, phone, etc.)' }, + protocols: { + root: 'Import the project protocol flags (REST / GraphQL / WebSocket)' + }, integrations: { root: 'Import all platforms (web, Flutter, iOS, Android, etc.)', apiKeys: 'Import all API keys with their scopes and expiration' From 4e12f927281a6a984be05000a180408159a1ea57 Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Mon, 18 May 2026 15:42:50 +0100 Subject: [PATCH 07/10] Add Labels migration wizard support --- src/lib/stores/migration.ts | 24 +++++++++++++++---- .../(migration-wizard)/resource-form.svelte | 5 ++++ .../migrations/(import)/importReport.svelte | 6 +++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index 43e738bd8b..7c18f9a78e 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -17,12 +17,14 @@ export type MigrationResource = | 'project-variable' | 'webhook' | 'auth-methods' - | 'protocols'; + | 'protocols' + | 'labels'; // Appwrite enum is the superset of all provider resources — used as a // provider-agnostic reference. The addResource guard filters by provider. -// Platform, ApiKey, ProjectVariable, Webhook, AuthMethods and Protocols are -// augmented locally until @appwrite.io/console SDK is regenerated. +// Project-level singleton resources (Platform, ApiKey, ProjectVariable, +// Webhook, AuthMethods, Protocols, Labels) are augmented locally until +// @appwrite.io/console SDK is regenerated. export const MigrationResources = { ...AppwriteMigrationResource, Platform: 'platform', @@ -30,7 +32,8 @@ export const MigrationResources = { ProjectVariable: 'project-variable', Webhook: 'webhook', AuthMethods: 'auth-methods', - Protocols: 'protocols' + Protocols: 'protocols', + Labels: 'labels' } as const; type ProviderResourceMap = { @@ -73,6 +76,9 @@ const initialFormData = { protocols: { root: false }, + labels: { + root: false + }, integrations: { root: false, apiKeys: false @@ -124,7 +130,8 @@ export const ResourcesFriendly = { 'project-variable': { singular: 'Project Variable', plural: 'Project Variables' }, webhook: { singular: 'Webhook', plural: 'Webhooks' }, 'auth-methods': { singular: 'Auth method config', plural: 'Auth method config' }, - protocols: { singular: 'Protocol config', plural: 'Protocol config' } + protocols: { singular: 'Protocol config', plural: 'Protocol config' }, + labels: { singular: 'Project labels', plural: 'Project labels' } }; export const providerResources: ProviderResourceMap = { @@ -132,6 +139,7 @@ export const providerResources: ProviderResourceMap = { ...Object.values(AppwriteMigrationResource), MigrationResources.AuthMethods as AppwriteMigrationResource, MigrationResources.Protocols as AppwriteMigrationResource, + MigrationResources.Labels as AppwriteMigrationResource, MigrationResources.Platform as AppwriteMigrationResource, MigrationResources.ApiKey as AppwriteMigrationResource, MigrationResources.ProjectVariable as AppwriteMigrationResource, @@ -205,6 +213,9 @@ export const migrationFormToResources =

( if (formData.protocols.root) { addResource(MigrationResources.Protocols); } + if (formData.labels.root) { + addResource(MigrationResources.Labels); + } if (formData.integrations.root) { addResource(MigrationResources.Platform); if (formData.integrations.apiKeys) { @@ -302,6 +313,9 @@ export const resourcesToMigrationForm = (resources: MigrationResource[]): Migrat if (resources.includes(MigrationResources.Protocols)) { formData.protocols.root = true; } + if (resources.includes(MigrationResources.Labels)) { + formData.labels.root = true; + } if (resources.includes(MigrationResources.Platform)) { formData.integrations.root = true; } diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index 3d7eb82a0d..4a72a9d93b 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -127,6 +127,10 @@ return resources.includes(MigrationResources.Protocols); } + if (groupKey === 'labels') { + return resources.includes(MigrationResources.Labels); + } + if (groupKey === 'integrations') { return ( resources.includes(MigrationResources.Platform) || @@ -165,6 +169,7 @@ backups: 'backup-policy', authMethods: 'auth-methods', protocols: 'protocols', + labels: 'labels', integrations: 'platform', settings: 'project-variable' }; diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index df7ac1fe81..a90fba540d 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -43,6 +43,9 @@ protocols: { root: 'Protocols' }, + labels: { + root: 'Project labels' + }, integrations: { root: 'Platforms', apiKeys: 'Include API keys' @@ -83,6 +86,9 @@ protocols: { root: 'Import the project protocol flags (REST / GraphQL / WebSocket)' }, + labels: { + root: 'Import the project-level RBAC label array' + }, integrations: { root: 'Import all platforms (web, Flutter, iOS, Android, etc.)', apiKeys: 'Import all API keys with their scopes and expiration' From 12a87bb4fd05f6f395ac854581237dd71d3adf71 Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Mon, 18 May 2026 16:18:39 +0100 Subject: [PATCH 08/10] Add Services migration wizard support --- src/lib/stores/migration.ts | 23 +++++++++++++++---- .../(migration-wizard)/resource-form.svelte | 5 ++++ .../migrations/(import)/importReport.svelte | 6 +++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index 7c18f9a78e..63807dfa9b 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -18,13 +18,14 @@ export type MigrationResource = | 'webhook' | 'auth-methods' | 'protocols' - | 'labels'; + | 'labels' + | 'services'; // Appwrite enum is the superset of all provider resources — used as a // provider-agnostic reference. The addResource guard filters by provider. // Project-level singleton resources (Platform, ApiKey, ProjectVariable, -// Webhook, AuthMethods, Protocols, Labels) are augmented locally until -// @appwrite.io/console SDK is regenerated. +// Webhook, AuthMethods, Protocols, Labels, Services) are augmented locally +// until @appwrite.io/console SDK is regenerated. export const MigrationResources = { ...AppwriteMigrationResource, Platform: 'platform', @@ -33,7 +34,8 @@ export const MigrationResources = { Webhook: 'webhook', AuthMethods: 'auth-methods', Protocols: 'protocols', - Labels: 'labels' + Labels: 'labels', + Services: 'services' } as const; type ProviderResourceMap = { @@ -79,6 +81,9 @@ const initialFormData = { labels: { root: false }, + services: { + root: false + }, integrations: { root: false, apiKeys: false @@ -131,7 +136,8 @@ export const ResourcesFriendly = { webhook: { singular: 'Webhook', plural: 'Webhooks' }, 'auth-methods': { singular: 'Auth method config', plural: 'Auth method config' }, protocols: { singular: 'Protocol config', plural: 'Protocol config' }, - labels: { singular: 'Project labels', plural: 'Project labels' } + labels: { singular: 'Project labels', plural: 'Project labels' }, + services: { singular: 'Services config', plural: 'Services config' } }; export const providerResources: ProviderResourceMap = { @@ -140,6 +146,7 @@ export const providerResources: ProviderResourceMap = { MigrationResources.AuthMethods as AppwriteMigrationResource, MigrationResources.Protocols as AppwriteMigrationResource, MigrationResources.Labels as AppwriteMigrationResource, + MigrationResources.Services as AppwriteMigrationResource, MigrationResources.Platform as AppwriteMigrationResource, MigrationResources.ApiKey as AppwriteMigrationResource, MigrationResources.ProjectVariable as AppwriteMigrationResource, @@ -216,6 +223,9 @@ export const migrationFormToResources =

( if (formData.labels.root) { addResource(MigrationResources.Labels); } + if (formData.services.root) { + addResource(MigrationResources.Services); + } if (formData.integrations.root) { addResource(MigrationResources.Platform); if (formData.integrations.apiKeys) { @@ -316,6 +326,9 @@ export const resourcesToMigrationForm = (resources: MigrationResource[]): Migrat if (resources.includes(MigrationResources.Labels)) { formData.labels.root = true; } + if (resources.includes(MigrationResources.Services)) { + formData.services.root = true; + } if (resources.includes(MigrationResources.Platform)) { formData.integrations.root = true; } diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index 4a72a9d93b..c5b8f8c376 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -131,6 +131,10 @@ return resources.includes(MigrationResources.Labels); } + if (groupKey === 'services') { + return resources.includes(MigrationResources.Services); + } + if (groupKey === 'integrations') { return ( resources.includes(MigrationResources.Platform) || @@ -170,6 +174,7 @@ authMethods: 'auth-methods', protocols: 'protocols', labels: 'labels', + services: 'services', integrations: 'platform', settings: 'project-variable' }; diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index a90fba540d..490f96ce7c 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -46,6 +46,9 @@ labels: { root: 'Project labels' }, + services: { + root: 'Services' + }, integrations: { root: 'Platforms', apiKeys: 'Include API keys' @@ -89,6 +92,9 @@ labels: { root: 'Import the project-level RBAC label array' }, + services: { + root: 'Import the project service enable/disable flags (Account, Databases, Functions, GraphQL, etc.)' + }, integrations: { root: 'Import all platforms (web, Flutter, iOS, Android, etc.)', apiKeys: 'Import all API keys with their scopes and expiration' From 29871fd263d92bfae02b512ecf8d2936010b32b3 Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Mon, 18 May 2026 17:03:33 +0100 Subject: [PATCH 09/10] Add Policies migration wizard support --- src/lib/stores/migration.ts | 23 +++++++++++++++---- .../(migration-wizard)/resource-form.svelte | 5 ++++ .../migrations/(import)/importReport.svelte | 6 +++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index 63807dfa9b..44abd507e5 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -19,13 +19,14 @@ export type MigrationResource = | 'auth-methods' | 'protocols' | 'labels' - | 'services'; + | 'services' + | 'policies'; // Appwrite enum is the superset of all provider resources — used as a // provider-agnostic reference. The addResource guard filters by provider. // Project-level singleton resources (Platform, ApiKey, ProjectVariable, -// Webhook, AuthMethods, Protocols, Labels, Services) are augmented locally -// until @appwrite.io/console SDK is regenerated. +// Webhook, AuthMethods, Protocols, Labels, Services, Policies) are augmented +// locally until @appwrite.io/console SDK is regenerated. export const MigrationResources = { ...AppwriteMigrationResource, Platform: 'platform', @@ -35,7 +36,8 @@ export const MigrationResources = { AuthMethods: 'auth-methods', Protocols: 'protocols', Labels: 'labels', - Services: 'services' + Services: 'services', + Policies: 'policies' } as const; type ProviderResourceMap = { @@ -84,6 +86,9 @@ const initialFormData = { services: { root: false }, + policies: { + root: false + }, integrations: { root: false, apiKeys: false @@ -137,7 +142,8 @@ export const ResourcesFriendly = { 'auth-methods': { singular: 'Auth method config', plural: 'Auth method config' }, protocols: { singular: 'Protocol config', plural: 'Protocol config' }, labels: { singular: 'Project labels', plural: 'Project labels' }, - services: { singular: 'Services config', plural: 'Services config' } + services: { singular: 'Services config', plural: 'Services config' }, + policies: { singular: 'Policies config', plural: 'Policies config' } }; export const providerResources: ProviderResourceMap = { @@ -147,6 +153,7 @@ export const providerResources: ProviderResourceMap = { MigrationResources.Protocols as AppwriteMigrationResource, MigrationResources.Labels as AppwriteMigrationResource, MigrationResources.Services as AppwriteMigrationResource, + MigrationResources.Policies as AppwriteMigrationResource, MigrationResources.Platform as AppwriteMigrationResource, MigrationResources.ApiKey as AppwriteMigrationResource, MigrationResources.ProjectVariable as AppwriteMigrationResource, @@ -226,6 +233,9 @@ export const migrationFormToResources =

( if (formData.services.root) { addResource(MigrationResources.Services); } + if (formData.policies.root) { + addResource(MigrationResources.Policies); + } if (formData.integrations.root) { addResource(MigrationResources.Platform); if (formData.integrations.apiKeys) { @@ -329,6 +339,9 @@ export const resourcesToMigrationForm = (resources: MigrationResource[]): Migrat if (resources.includes(MigrationResources.Services)) { formData.services.root = true; } + if (resources.includes(MigrationResources.Policies)) { + formData.policies.root = true; + } if (resources.includes(MigrationResources.Platform)) { formData.integrations.root = true; } diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index c5b8f8c376..9deb7bb034 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -135,6 +135,10 @@ return resources.includes(MigrationResources.Services); } + if (groupKey === 'policies') { + return resources.includes(MigrationResources.Policies); + } + if (groupKey === 'integrations') { return ( resources.includes(MigrationResources.Platform) || @@ -175,6 +179,7 @@ protocols: 'protocols', labels: 'labels', services: 'services', + policies: 'policies', integrations: 'platform', settings: 'project-variable' }; diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index 490f96ce7c..b53ad58d25 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -49,6 +49,9 @@ services: { root: 'Services' }, + policies: { + root: 'Security policies' + }, integrations: { root: 'Platforms', apiKeys: 'Include API keys' @@ -95,6 +98,9 @@ services: { root: 'Import the project service enable/disable flags (Account, Databases, Functions, GraphQL, etc.)' }, + policies: { + root: 'Import the project security policies (password rules, session behavior, user limits, membership privacy)' + }, integrations: { root: 'Import all platforms (web, Flutter, iOS, Android, etc.)', apiKeys: 'Import all API keys with their scopes and expiration' From f683742717aa97af995e40b12164327d79bc2b4d Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Thu, 21 May 2026 12:39:45 +0100 Subject: [PATCH 10/10] Add Custom Domains + SMTP migration wizard support --- src/lib/stores/migration.ts | 32 +++++++++++++++++-- .../(migration-wizard)/resource-form.svelte | 10 ++++++ .../migrations/(import)/importReport.svelte | 12 +++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index 44abd507e5..64f9bfc3d8 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -20,7 +20,9 @@ export type MigrationResource = | 'protocols' | 'labels' | 'services' - | 'policies'; + | 'policies' + | 'smtp' + | 'rule'; // Appwrite enum is the superset of all provider resources — used as a // provider-agnostic reference. The addResource guard filters by provider. @@ -37,7 +39,9 @@ export const MigrationResources = { Protocols: 'protocols', Labels: 'labels', Services: 'services', - Policies: 'policies' + Policies: 'policies', + SMTP: 'smtp', + Rule: 'rule' } as const; type ProviderResourceMap = { @@ -89,6 +93,12 @@ const initialFormData = { policies: { root: false }, + smtp: { + root: false + }, + customDomains: { + root: false + }, integrations: { root: false, apiKeys: false @@ -143,7 +153,9 @@ export const ResourcesFriendly = { protocols: { singular: 'Protocol config', plural: 'Protocol config' }, labels: { singular: 'Project labels', plural: 'Project labels' }, services: { singular: 'Services config', plural: 'Services config' }, - policies: { singular: 'Policies config', plural: 'Policies config' } + policies: { singular: 'Policies config', plural: 'Policies config' }, + smtp: { singular: 'SMTP config', plural: 'SMTP config' }, + rule: { singular: 'Custom domain', plural: 'Custom domains' } }; export const providerResources: ProviderResourceMap = { @@ -154,6 +166,8 @@ export const providerResources: ProviderResourceMap = { MigrationResources.Labels as AppwriteMigrationResource, MigrationResources.Services as AppwriteMigrationResource, MigrationResources.Policies as AppwriteMigrationResource, + MigrationResources.SMTP as AppwriteMigrationResource, + MigrationResources.Rule as AppwriteMigrationResource, MigrationResources.Platform as AppwriteMigrationResource, MigrationResources.ApiKey as AppwriteMigrationResource, MigrationResources.ProjectVariable as AppwriteMigrationResource, @@ -236,6 +250,12 @@ export const migrationFormToResources =

( if (formData.policies.root) { addResource(MigrationResources.Policies); } + if (formData.smtp.root) { + addResource(MigrationResources.SMTP); + } + if (formData.customDomains.root) { + addResource(MigrationResources.Rule); + } if (formData.integrations.root) { addResource(MigrationResources.Platform); if (formData.integrations.apiKeys) { @@ -342,6 +362,12 @@ export const resourcesToMigrationForm = (resources: MigrationResource[]): Migrat if (resources.includes(MigrationResources.Policies)) { formData.policies.root = true; } + if (resources.includes(MigrationResources.SMTP)) { + formData.smtp.root = true; + } + if (resources.includes(MigrationResources.Rule)) { + formData.customDomains.root = true; + } if (resources.includes(MigrationResources.Platform)) { formData.integrations.root = true; } diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index 9deb7bb034..003ba4462a 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -139,6 +139,14 @@ return resources.includes(MigrationResources.Policies); } + if (groupKey === 'smtp') { + return resources.includes(MigrationResources.SMTP); + } + + if (groupKey === 'customDomains') { + return resources.includes(MigrationResources.Rule); + } + if (groupKey === 'integrations') { return ( resources.includes(MigrationResources.Platform) || @@ -180,6 +188,8 @@ labels: 'labels', services: 'services', policies: 'policies', + smtp: 'smtp', + customDomains: 'rule', integrations: 'platform', settings: 'project-variable' }; diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index b53ad58d25..0accfe4010 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -52,6 +52,12 @@ policies: { root: 'Security policies' }, + smtp: { + root: 'Custom SMTP' + }, + customDomains: { + root: 'Custom domains' + }, integrations: { root: 'Platforms', apiKeys: 'Include API keys' @@ -101,6 +107,12 @@ policies: { root: 'Import the project security policies (password rules, session behavior, user limits, membership privacy)' }, + smtp: { + root: 'Import the project custom SMTP configuration (the password is not exposed by the SDK and stays on the destination)' + }, + customDomains: { + root: 'Import manually-added custom-domain proxy rules (API, function, site, redirect). Auto-generated `.appwrite.network` rules are skipped — they are recreated by parent Function/Site migration.' + }, integrations: { root: 'Import all platforms (web, Flutter, iOS, Android, etc.)', apiKeys: 'Import all API keys with their scopes and expiration'