{#each $protocols.list as protocol, index}
@@ -218,6 +220,11 @@
width: 100%;
}
+ .protocol-list-content {
+ max-width: 36rem;
+ padding-top: var(--space-6);
+ }
+
.protocol-toolbar {
display: flex;
justify-content: flex-end;
@@ -228,10 +235,6 @@
width: 100%;
}
- .protocol-list-content {
- padding-top: var(--space-6);
- }
-
.protocol-control {
display: flex;
align-items: center;
diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/configuration.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/configuration.svelte
index 8b1a9ad3f..f6d8129d6 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/create-site/configuration.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/configuration.svelte
@@ -3,34 +3,34 @@
import { Fieldset, Layout, Accordion } from '@appwrite.io/pink-svelte';
import type { Models } from '@appwrite.io/console';
import { iconPath } from '$lib/stores/app';
- import { getFrameworkIcon } from '$lib/stores/sites';
+ import { getFrameworkIcon, type FrameworkAdapterWithStartCommand } from '$lib/stores/sites';
import { EnvironmentVariables } from '$lib/components/variables';
export let frameworks: Models.Framework[];
export let selectedFramework: Models.Framework;
$: frameworkData = frameworks.find((framework) => framework.key === selectedFramework?.key);
- $: adapterData =
- frameworkData?.adapters.find((adapter) => adapter.key === 'ssr') ??
- frameworkData?.adapters.find((adapter) => adapter.key === 'static');
+ $: adapterData = (frameworkData?.adapters.find((adapter) => adapter.key === 'ssr') ??
+ frameworkData?.adapters.find(
+ (adapter) => adapter.key === 'static'
+ )) as FrameworkAdapterWithStartCommand;
export let variables: Partial[] = [];
export let isLoading = false;
export let installCommand = '';
export let buildCommand = '';
+ export let startCommand = '';
export let outputDirectory = '';
let frameworkId = selectedFramework.key;
+ let lastAdapterDefaultsKey = '';
- $: if (!installCommand || !buildCommand || !outputDirectory) {
- installCommand ||= adapterData?.installCommand;
- buildCommand ||= adapterData?.buildCommand;
- outputDirectory ||= adapterData?.outputDirectory;
- }
-
- $: if (frameworkData) {
- installCommand = adapterData?.installCommand;
- buildCommand = adapterData?.buildCommand;
- outputDirectory = adapterData?.outputDirectory;
+ $: adapterDefaultsKey = `${frameworkData?.key ?? ''}:${adapterData?.key ?? ''}`;
+ $: if (frameworkData && adapterDefaultsKey !== lastAdapterDefaultsKey) {
+ installCommand = adapterData?.installCommand ?? '';
+ buildCommand = adapterData?.buildCommand ?? '';
+ startCommand = adapterData?.startCommand ?? '';
+ outputDirectory = adapterData?.outputDirectory ?? '';
+ lastAdapterDefaultsKey = adapterDefaultsKey;
}
@@ -65,7 +65,8 @@
@@ -79,11 +80,30 @@
+ {#if adapterData?.key === 'ssr'}
+
+
+
+
+ {/if}
data.frameworks.frameworks.find((f) => f.key === framework)?.adapters?.[0]
+ );
+ const shouldShowStartCommand = $derived(primaryAdapter?.key === Adapter.Ssr);
+
$effect(() => {
if (framework && data.frameworks && !hasCustomCommands) {
const fw = data.frameworks.frameworks.find((f) => f.key === framework);
@@ -87,6 +94,7 @@
const adapter = fw.adapters[0];
installCommand = adapter.installCommand || '';
buildCommand = adapter.buildCommand || '';
+ startCommand = (adapter as FrameworkAdapterWithStartCommand).startCommand || '';
outputDirectory = adapter.outputDirectory || '';
}
}
@@ -103,10 +111,11 @@
// Build configuration - use from URL params or defaults
installCommand = page.url.searchParams.get('install') || '';
buildCommand = page.url.searchParams.get('build') || '';
+ startCommand = page.url.searchParams.get('start') || '';
outputDirectory = page.url.searchParams.get('output') || '';
// Check if custom commands were provided via URL
- hasCustomCommands = !!(installCommand || buildCommand || outputDirectory);
+ hasCustomCommands = !!(installCommand || buildCommand || startCommand || outputDirectory);
// If no custom commands, auto-fill from framework defaults
if (!hasCustomCommands && data.frameworks) {
@@ -115,6 +124,7 @@
const adapter = fw.adapters[0];
installCommand = adapter.installCommand || '';
buildCommand = adapter.buildCommand || '';
+ startCommand = (adapter as FrameworkAdapterWithStartCommand).startCommand || '';
outputDirectory = adapter.outputDirectory || '';
}
}
@@ -145,6 +155,7 @@
buildRuntime: selectedFramework.buildRuntime,
installCommand: installCommand || undefined,
buildCommand: buildCommand || undefined,
+ startCommand: shouldShowStartCommand ? startCommand || undefined : undefined,
outputDirectory: outputDirectory || undefined,
adapter: framework === Framework.Other ? Adapter.Static : undefined,
providerSilentMode: false
@@ -160,6 +171,7 @@
const promises = variables.map((variable) =>
sdk.forProject(page.params.region, page.params.project).sites.createVariable({
siteId: site.$id,
+ variableId: ID.unique(),
key: variable.key,
value: variable.value,
secret: variable.secret
@@ -272,6 +284,12 @@
label="Build command"
placeholder={buildCommand || 'npm run build'}
bind:value={buildCommand} />
+ {#if shouldShowStartCommand}
+
+ {/if}
f.key === 'other') ??
data.frameworks.frameworks?.[0];
- let adapter = framework?.adapters[0];
+ let adapter = framework?.adapters[0] as FrameworkAdapterWithStartCommand;
let installCommand = adapter?.installCommand;
let buildCommand = adapter?.buildCommand;
+ let startCommand = adapter?.startCommand;
let outputDirectory = adapter?.outputDirectory;
let variables: Partial[] = [];
let files: FileList;
$: maxSize =
- isCloud && $currentPlan
+ isCloud && $currentPlan?.deploymentSize
? $currentPlan.deploymentSize * 1000000
- : $regionalConsoleVariables._APP_COMPUTE_SIZE_LIMIT; // already in MB
+ : $regionalConsoleVariables._APP_COMPUTE_SIZE_LIMIT;
$: readableMaxSize = humanFileSize(maxSize);
@@ -73,6 +79,7 @@
buildRuntime,
installCommand: installCommand || undefined,
buildCommand: buildCommand || undefined,
+ startCommand: startCommand || undefined,
outputDirectory: outputDirectory || undefined
});
@@ -86,6 +93,7 @@
const promises = variables.map((variable) =>
sdk.forProject(page.params.region, page.params.project).sites.createVariable({
siteId: site.$id,
+ variableId: ID.unique(),
key: variable.key,
value: variable.value,
secret: variable?.secret ?? false
@@ -111,7 +119,9 @@
});
await promise;
- const upload = $uploader.files.find((f) => f.resourceId === site.$id);
+ const upload = $uploader.files.find(
+ (f) => f.resourceId === site.$id && f.kind === 'site-deployment'
+ );
if (upload?.status === 'success') {
const deploymentId = upload.$id;
@@ -125,9 +135,11 @@
await goto(`${resolvedPath}?site=${site.$id}&deployment=${deploymentId}`);
}
} catch (e) {
- const upload = $uploader.files.find((f) => f.resourceId === site?.$id);
+ const upload = $uploader.files.find(
+ (f) => f.resourceId === site?.$id && f.kind === 'site-deployment'
+ );
if (upload) {
- uploader.removeFromQueue(upload.$id);
+ uploader.removeFromQueue(upload.clientId);
}
addNotification({
type: 'error',
@@ -141,17 +153,7 @@
let reason = e.detail?.reason ?? '';
if (!reason) {
- const nativeEvent = e.detail as Event | undefined;
- const input = (nativeEvent?.currentTarget ?? nativeEvent?.target) as
- | HTMLInputElement
- | undefined;
- const pickedFiles = Array.from(input?.files ?? []);
-
- if (pickedFiles.some((file) => file.size > maxSize)) {
- reason = InvalidFileType.SIZE;
- } else if (pickedFiles.some((file) => !file.name.toLowerCase().endsWith('.tar.gz'))) {
- reason = InvalidFileType.EXTENSION;
- }
+ reason = getInvalidDeploymentArchiveReason(files, maxSize) ?? '';
}
if (reason === InvalidFileType.EXTENSION) {
@@ -172,6 +174,15 @@
}
}
+ $: if (files?.length) {
+ const reason = getInvalidDeploymentArchiveReason(files, maxSize);
+
+ if (reason) {
+ files = undefined;
+ handleInvalid(new CustomEvent('invalid', { detail: { reason } }));
+ }
+ }
+
$: filesList = files?.length
? Array.from(files).map((f) => {
return {
@@ -201,7 +212,7 @@
Upload a tar.gz containing your site source code
f.key === 'other');
- let adapter = framework?.adapters[0];
+ let adapter = framework?.adapters[0] as FrameworkAdapterWithStartCommand;
let branch: string;
let rootDir = './';
let installCommand = adapter?.installCommand;
let buildCommand = adapter?.buildCommand;
+ let startCommand = adapter?.startCommand;
let outputDirectory = adapter?.outputDirectory;
let variables: Partial[] = [];
let silentMode = false;
@@ -81,9 +83,10 @@
if (!framework) {
framework = data.frameworks.frameworks.find((f) => f.key === 'other');
}
- adapter = framework?.adapters[0];
+ adapter = framework?.adapters[0] as FrameworkAdapterWithStartCommand;
installCommand = adapter?.installCommand;
buildCommand = adapter?.buildCommand;
+ startCommand = adapter?.startCommand;
outputDirectory = adapter?.outputDirectory;
const detectedVariables = normalizeDetectedVariables(response?.variables);
if (detectedVariables.length) {
@@ -119,9 +122,10 @@
name,
framework: fr,
buildRuntime,
- installCommand,
- buildCommand,
- outputDirectory,
+ installCommand: installCommand || undefined,
+ buildCommand: buildCommand || undefined,
+ startCommand: startCommand || undefined,
+ outputDirectory: outputDirectory || undefined,
installationId: data.installation.$id,
providerRepositoryId: data.repository.id,
providerBranch: branch,
@@ -139,6 +143,7 @@
const promises = variables.map((variable) =>
sdk.forProject(page.params.region, page.params.project).sites.createVariable({
siteId: site.$id,
+ variableId: ID.unique(),
key: variable.key,
value: variable.value,
secret: variable?.secret ?? false
@@ -218,6 +223,7 @@
sdk.forProject(page.params.region, page.params.project).sites.createVariable({
siteId: site.$id,
+ variableId: ID.unique(),
key: variable.name,
value: variable.value,
secret: variable?.secret ?? false
diff --git a/src/routes/(console)/project-[region]-[project]/sites/header.svelte b/src/routes/(console)/project-[region]-[project]/sites/header.svelte
index 511fcc0d3..037c8dd01 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/header.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/header.svelte
@@ -13,11 +13,6 @@
title: 'Sites',
event: 'sites',
hasChildren: true
- },
- {
- href: `${path}/usage`,
- title: 'Usage',
- event: 'usage'
}
];
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte
index 93d31addb..fb7bcb49f 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte
@@ -68,6 +68,7 @@
timeout: data.site.timeout,
installCommand: data.site.installCommand,
buildCommand: data.site.buildCommand,
+ startCommand: data.site.startCommand,
outputDirectory: data.site.outputDirectory,
buildRuntime: data.site.buildRuntime as BuildRuntime,
adapter: data.site.adapter as Adapter,
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createGitDeploymentModal.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createGitDeploymentModal.svelte
index 341eec2aa..a96a73e6b 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createGitDeploymentModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createGitDeploymentModal.svelte
@@ -90,6 +90,7 @@
timeout: site.timeout || undefined,
installCommand: site.installCommand || undefined,
buildCommand: site.buildCommand || undefined,
+ startCommand: site.startCommand || undefined,
outputDirectory: site.outputDirectory || undefined,
buildRuntime: (site?.buildRuntime as BuildRuntime) || undefined,
adapter: (site.adapter as Adapter) || undefined,
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createManualDeploymentModal.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createManualDeploymentModal.svelte
index b040e8b34..6c99e2091 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createManualDeploymentModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/createManualDeploymentModal.svelte
@@ -3,7 +3,11 @@
import { Modal } from '$lib/components';
import { Dependencies } from '$lib/constants';
import { Button } from '$lib/elements/forms';
- import { InvalidFileType, removeFile } from '$lib/helpers/files';
+ import {
+ getInvalidDeploymentArchiveReason,
+ InvalidFileType,
+ removeFile
+ } from '$lib/helpers/files';
import { addNotification } from '$lib/stores/notifications';
import { uploader } from '$lib/stores/uploader';
import type { Models } from '@appwrite.io/console';
@@ -22,9 +26,9 @@
let error: string = '';
$: maxSize =
- isCloud && $currentPlan
+ isCloud && $currentPlan?.deploymentSize
? $currentPlan.deploymentSize * 1000000
- : $consoleVariables._APP_COMPUTE_SIZE_LIMIT; // already in MB
+ : $consoleVariables._APP_COMPUTE_SIZE_LIMIT;
$: readableMaxSize = humanFileSize(maxSize);
@@ -54,12 +58,21 @@
if (reason === InvalidFileType.EXTENSION) {
error = 'Only .tar.gz files allowed';
} else if (reason === InvalidFileType.SIZE) {
- error = 'File size exceeds 10MB';
+ error = `File size exceeds ${readableMaxSize.value}${readableMaxSize.unit}`;
} else {
error = 'Invalid file';
}
}
+ $: if (files?.length) {
+ const reason = getInvalidDeploymentArchiveReason(files, maxSize);
+
+ if (reason) {
+ files = undefined;
+ handleInvalid(new CustomEvent('invalid', { detail: { reason } }));
+ }
+ }
+
$: filesList = files?.length
? Array.from(files).map((f) => {
return {
@@ -80,7 +93,7 @@
Upload a tar.gz file containing your site source code
{
Query.offset(offset),
Query.orderDesc(''),
Query.orderDesc('$updatedAt'),
+ ...(search ? [Query.search('domain', search)] : []),
...parsedQueries.values()
- ],
- search: search || undefined
+ ]
});
const organizationDomains = await fetchOrganizationDomainsForRules(
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.svelte
index 90f8c679d..fac44b979 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/+page.svelte
@@ -29,6 +29,7 @@
} from '$routes/(console)/project-[region]-[project]/store';
import { isCloud } from '$lib/system';
import { getApexDomain } from '$lib/helpers/tlds';
+ import { isProxyRuleVerified } from '$lib/components/domains/status';
const routeBase = `${base}/project-${page.params.region}-${page.params.project}/sites/site-${page.params.site}/domains`;
@@ -110,7 +111,7 @@
await invalidate(Dependencies.SITES_DOMAINS);
- const verified = rule?.status !== 'created';
+ const verified = isProxyRuleVerified(rule?.status);
if (verified) {
addNotification({
type: 'success',
@@ -139,6 +140,7 @@
timeout: data.site.timeout,
installCommand: data.site.installCommand,
buildCommand: data.site.buildCommand,
+ startCommand: data.site.startCommand,
outputDirectory: data.site.outputDirectory,
buildRuntime: data.site.buildRuntime as BuildRuntime,
adapter: data.site.adapter as Adapter,
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte
index 83eb4f33d..cd0f6f663 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte
@@ -72,7 +72,7 @@
try {
proxyRule = await sdk
.forProject(page.params.region, page.params.project)
- .proxy.updateRuleVerification({ ruleId });
+ .proxy.updateRuleStatus({ ruleId });
await Promise.all([
invalidate(Dependencies.DOMAINS),
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte
index 56fa02b6d..b7b74ae34 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte
@@ -68,7 +68,7 @@
try {
selectedProxyRule = await sdk
.forProject(page.params.region, page.params.project)
- .proxy.updateRuleVerification({ ruleId: selectedProxyRule.$id });
+ .proxy.updateRuleStatus({ ruleId: selectedProxyRule.$id });
await invalidate(Dependencies.SITES_DOMAINS);
show = false;
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/table.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/table.svelte
index eaa535cfd..6a67834b7 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/table.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/table.svelte
@@ -24,6 +24,13 @@
import { columns } from './store';
import { regionalProtocol } from '$routes/(console)/project-[region]-[project]/store';
import DnsRecordsAction from '$lib/components/domains/dnsRecordsAction.svelte';
+ import {
+ getProxyRuleStatusBadge,
+ getProxyRuleUpdatedPrefix,
+ isProxyRuleLogsViewable,
+ isProxyRuleRetryable,
+ isProxyRuleVerified
+ } from '$lib/components/domains/status';
import ViewLogsModal from '$lib/components/domains/viewLogsModal.svelte';
import { timeFromNowShort } from '$lib/helpers/date';
@@ -49,7 +56,7 @@
};
function updatedLabel(proxyRule: Models.ProxyRule): string {
- if (proxyRule.status === 'verified') {
+ if (isProxyRuleVerified(proxyRule.status)) {
return '';
}
@@ -58,14 +65,7 @@
return '';
}
- const prefix =
- proxyRule.status === 'created'
- ? 'Checked'
- : proxyRule.status === 'verifying'
- ? 'Updated'
- : proxyRule.status === 'unverified'
- ? 'Failed'
- : '';
+ const prefix = getProxyRuleUpdatedPrefix(proxyRule.status);
return prefix + ' ' + timeStr;
}
@@ -81,10 +81,9 @@
{#each proxyRules.rules as proxyRule (proxyRule.$id)}
- {@const isRetryable = proxyRule.status === 'created' || proxyRule.status === 'unverified'}
- {@const isLogsViewable =
- proxyRule.logs?.length > 0 &&
- (proxyRule.status === 'verifying' || proxyRule.status === 'unverified')}
+ {@const isRetryable = isProxyRuleRetryable(proxyRule.status)}
+ {@const isLogsViewable = isProxyRuleLogsViewable(proxyRule)}
+ {@const statusBadge = getProxyRuleStatusBadge(proxyRule.status)}
{#each $columns as column}
@@ -99,17 +98,11 @@
- {#if proxyRule.status !== 'verified'}
+ {#if statusBadge}
{/if}
{#if isRetryable}
@@ -140,7 +133,7 @@
{:else if column.id === 'target'}
{proxyTarget(proxyRule)}
- {:else if column.id === 'updated' && proxyRule.status !== 'verified'}
+ {:else if column.id === 'updated' && !isProxyRuleVerified(proxyRule.status)}
{
await sdk.forProject(page.params.region, page.params.project).sites.createVariable({
siteId: page.params.site,
+ variableId: ID.unique(),
key,
value,
secret
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/disconnectRepo.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/disconnectRepo.svelte
index aa2e303ba..fcf3ec1b0 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/disconnectRepo.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/disconnectRepo.svelte
@@ -27,6 +27,7 @@
timeout: site.timeout || undefined,
installCommand: site.installCommand || undefined,
buildCommand: site.buildCommand || undefined,
+ startCommand: site.startCommand || undefined,
outputDirectory: site.outputDirectory || undefined,
buildRuntime: (site?.buildRuntime as BuildRuntime) || undefined,
adapter: (site?.adapter as Adapter) || undefined,
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateBuildSettings.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateBuildSettings.svelte
index f3ee02264..6ad84b6c6 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateBuildSettings.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateBuildSettings.svelte
@@ -12,7 +12,7 @@
import { Link } from '$lib/elements';
import { IconInfo } from '@appwrite.io/pink-icons-svelte';
import { adapterDataList } from './store';
- import { getFrameworkIcon } from '$lib/stores/sites';
+ import { getFrameworkIcon, type FrameworkAdapterWithStartCommand } from '$lib/stores/sites';
import { page } from '$app/state';
let {
@@ -28,40 +28,37 @@
let frameworkKey = $state(site.framework);
let installCommand = $state(site?.installCommand);
let buildCommand = $state(site?.buildCommand);
+ let startCommand = $state(site?.startCommand);
let outputDirectory = $state(site?.outputDirectory);
let fallback = $state(site?.fallbackFile);
let adapter: Adapter = $state(site.adapter as Adapter);
- let selectedFramework: Models.Framework = $derived(
+ let selectedFramework = $state(
frameworks.find((framework) => framework.key === site.framework)
);
let showFallback = $derived(adapter === Adapter.Static);
+ let lastFrameworkAdapterKey = $state('');
let isUntouched = $derived(
installCommand === site?.installCommand &&
buildCommand === site?.buildCommand &&
+ startCommand === site?.startCommand &&
outputDirectory === site?.outputDirectory &&
selectedFramework?.key === site?.framework &&
(fallback ?? '') === (site?.fallbackFile ?? '') &&
(adapter ?? '') === (site?.adapter ?? '')
);
- let frameworkAdapterData = $derived(
- selectedFramework.adapters.find((a) => a.key === adapter) ?? selectedFramework.adapters[0]
+ let frameworkAdapterData: FrameworkAdapterWithStartCommand = $derived(
+ (selectedFramework.adapters.find((a) => a.key === adapter) ??
+ selectedFramework.adapters[0]) as FrameworkAdapterWithStartCommand
);
$effect(() => {
- if (adapter) {
- const data = selectedFramework.adapters.find((a) => a.key === adapter);
- if (data) {
- installCommand = data.installCommand;
- buildCommand = data.buildCommand;
- outputDirectory = data.outputDirectory;
- fallback = data.fallbackFile;
- }
- }
- });
+ if (!selectedFramework) return;
+
+ const frameworkAdapterKey = `${selectedFramework.key}:${adapter ?? ''}`;
+ const hasFrameworkSelectionChanged = frameworkAdapterKey !== lastFrameworkAdapterKey;
- $effect(() => {
if (selectedFramework?.key !== site.framework) {
// Update adapter
const singleAdapter = selectedFramework?.adapters?.length <= 1;
@@ -78,21 +75,37 @@
}
//Update values
- const data =
- selectedFramework.adapters.find((a) => a.key === adapter) ??
- selectedFramework.adapters[0];
+ const data = (selectedFramework.adapters.find((a) => a.key === adapter) ??
+ selectedFramework.adapters[0]) as FrameworkAdapterWithStartCommand;
installCommand = data.installCommand;
buildCommand = data.buildCommand;
+ startCommand = data.startCommand;
outputDirectory = data.outputDirectory;
adapter = data.key as Adapter;
fallback = data.fallbackFile;
- } else {
- adapter = site.adapter as Adapter;
- installCommand = site?.installCommand ?? frameworkAdapterData.installCommand;
- buildCommand = site?.buildCommand ?? frameworkAdapterData.buildCommand;
- outputDirectory = site?.outputDirectory ?? frameworkAdapterData.outputDirectory;
- fallback = site?.fallbackFile ?? frameworkAdapterData.fallbackFile;
+ } else if (hasFrameworkSelectionChanged) {
+ const data = (selectedFramework.adapters.find((a) => a.key === adapter) ??
+ selectedFramework.adapters[0]) as FrameworkAdapterWithStartCommand;
+ const isOriginalAdapter = adapter === site.adapter;
+
+ installCommand = isOriginalAdapter
+ ? (site?.installCommand ?? frameworkAdapterData.installCommand)
+ : data.installCommand;
+ buildCommand = isOriginalAdapter
+ ? (site?.buildCommand ?? frameworkAdapterData.buildCommand)
+ : data.buildCommand;
+ startCommand = isOriginalAdapter
+ ? (site?.startCommand ?? frameworkAdapterData.startCommand)
+ : data.startCommand;
+ outputDirectory = isOriginalAdapter
+ ? (site?.outputDirectory ?? frameworkAdapterData.outputDirectory)
+ : data.outputDirectory;
+ fallback = isOriginalAdapter
+ ? (site?.fallbackFile ?? data.fallbackFile)
+ : data.fallbackFile;
}
+
+ lastFrameworkAdapterKey = `${selectedFramework.key}:${adapter ?? ''}`;
});
$effect(() => {
@@ -149,6 +162,7 @@
timeout: site.timeout || undefined,
installCommand: installCommand || undefined,
buildCommand: buildCommand || undefined,
+ startCommand: startCommand || undefined,
outputDirectory: outputDirectory || undefined,
buildRuntime: (site?.buildRuntime as BuildRuntime) || undefined,
adapter: (adptr?.key as Adapter) || undefined,
@@ -178,13 +192,17 @@
}
}
- function reset(type: 'installCommand' | 'buildCommand' | 'outputDirectory') {
- const data = selectedFramework.adapters.find((a) => a.key === adapter);
+ function reset(type: 'installCommand' | 'buildCommand' | 'startCommand' | 'outputDirectory') {
+ const data = selectedFramework.adapters.find(
+ (a) => a.key === adapter
+ ) as FrameworkAdapterWithStartCommand;
if (type === 'installCommand') {
installCommand = data.installCommand;
} else if (type === 'buildCommand') {
buildCommand = data.buildCommand;
+ } else if (type === 'startCommand') {
+ startCommand = data.startCommand;
} else if (type === 'outputDirectory') {
outputDirectory = data.outputDirectory;
}
@@ -292,7 +310,8 @@
secondary
size="s"
on:click={() => reset('installCommand')}
- disabled={installCommand === frameworkAdapterData?.installCommand}>
+ disabled={(installCommand ?? '') ===
+ (frameworkAdapterData?.installCommand ?? '')}>
Reset
@@ -306,11 +325,30 @@
+ {#if adapter === Adapter.Ssr}
+
+
+
+
+ {/if}
- import { base } from '$app/paths';
- import { page } from '$app/state';
- import { Container, Usage } from '$lib/layout';
+ import { Container } from '$lib/layout';
export let data;
- $: total = data.deploymentsTotal;
- $: count = data.deployments;
-
- // $: totalBuilds = data.buildsTotal;
- // $: countBuilds = data.builds;
-
-
-
-
-
+
diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts
index 169caa3e5..80b1ec6bf 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/usage/[[period]]/+page.ts
@@ -1,17 +1,3 @@
-import { isValueOfStringEnum } from '$lib/helpers/types';
-import { sdk } from '$lib/stores/sdk';
-import { UsageRange } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-export const load: PageLoad = async ({ params }) => {
- const period = isValueOfStringEnum(UsageRange, params.period)
- ? params.period
- : UsageRange.ThirtyDays;
-
- return {
- ...(await sdk.forProject(params.region, params.project).sites.getUsage({
- siteId: params.site,
- range: period
- }))
- };
-};
+export const load: PageLoad = async () => ({});
diff --git a/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.svelte
index 4dec5a14e..3ef899e53 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.svelte
@@ -1,20 +1,5 @@
-
-
-
+
diff --git a/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.ts
index f9782fef9..80b1ec6bf 100644
--- a/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/sites/usage/[[period]]/+page.ts
@@ -1,14 +1,3 @@
-import { isValueOfStringEnum } from '$lib/helpers/types';
-import { sdk } from '$lib/stores/sdk';
-import { UsageRange } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-export const load: PageLoad = async ({ params }) => {
- const period = isValueOfStringEnum(UsageRange, params.period)
- ? params.period
- : UsageRange.ThirtyDays;
-
- return {
- ...(await sdk.forProject(params.region, params.project).sites.listUsage({ range: period }))
- };
-};
+export const load: PageLoad = async () => ({});
diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte
index e0d6f5a45..ef5988aee 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/+page.svelte
@@ -162,7 +162,10 @@
return uploader.subscribe(() => {
isUploading = $uploader.files.some(
(file) =>
- file.status !== 'success' && file.progress < 100 && file.status !== 'failed'
+ file.kind === 'storage' &&
+ file.status !== 'success' &&
+ file.progress < 100 &&
+ file.status !== 'failed'
);
});
});
diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/header.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/header.svelte
index 5bdf52183..8748b494b 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/header.svelte
+++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/header.svelte
@@ -17,12 +17,6 @@
event: 'files',
hasChildren: true
},
- {
- href: `${path}/usage`,
- title: 'Usage',
- event: 'usage',
- hasChildren: true
- },
{
href: `${path}/settings`,
event: 'settings',
diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.svelte
index 3c39c5f9e..3ef899e53 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.svelte
@@ -1,33 +1,5 @@
-
-
-
-
-
+
diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts
index e840f385b..80b1ec6bf 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/usage/[[period]]/+page.ts
@@ -1,22 +1,3 @@
-import { sdk } from '$lib/stores/sdk';
import type { PageLoad } from './$types';
-import { isValueOfStringEnum } from '$lib/helpers/types';
-import { UsageRange, type Models } from '@appwrite.io/console';
-export const load: PageLoad = async ({ params }) => {
- const period = isValueOfStringEnum(UsageRange, params.period)
- ? params.period
- : UsageRange.ThirtyDays;
-
- const response = await sdk.forProject(params.region, params.project).storage.getBucketUsage({
- bucketId: params.bucket,
- range: period
- });
-
- return {
- filesTotal: response.filesTotal,
- files: response.files as Models.Metric[],
- imageTransformationsTotal: response.imageTransformationsTotal,
- imageTransformations: response.imageTransformations as Models.Metric[]
- };
-};
+export const load: PageLoad = async () => ({});
diff --git a/src/routes/(console)/project-[region]-[project]/storage/header.svelte b/src/routes/(console)/project-[region]-[project]/storage/header.svelte
index 24aa16ec3..8a63a5c9f 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/header.svelte
+++ b/src/routes/(console)/project-[region]-[project]/storage/header.svelte
@@ -13,12 +13,6 @@
title: 'Buckets',
event: 'buckets',
hasChildren: true
- },
- {
- href: `${path}/usage`,
- title: 'Usage',
- event: 'usage',
- hasChildren: true
}
];
diff --git a/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.svelte
index 659277fbd..3ef899e53 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.svelte
+++ b/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.svelte
@@ -1,20 +1,5 @@
-
-
-
+
diff --git a/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.ts
index 619804280..80b1ec6bf 100644
--- a/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.ts
+++ b/src/routes/(console)/project-[region]-[project]/storage/usage/[[period]]/+page.ts
@@ -1,14 +1,3 @@
-import { isValueOfStringEnum } from '$lib/helpers/types';
-import { sdk } from '$lib/stores/sdk';
-import { UsageRange } from '@appwrite.io/console';
import type { PageLoad } from './$types';
-export const load: PageLoad = async ({ params }) => {
- const period = isValueOfStringEnum(UsageRange, params.period)
- ? params.period
- : UsageRange.ThirtyDays;
-
- return {
- ...(await sdk.forProject(params.region, params.project).storage.getUsage({ range: period }))
- };
-};
+export const load: PageLoad = async () => ({});
diff --git a/src/routes/(console)/supportWizard.svelte b/src/routes/(console)/supportWizard.svelte
index 23c1b4de7..a56ab2183 100644
--- a/src/routes/(console)/supportWizard.svelte
+++ b/src/routes/(console)/supportWizard.svelte
@@ -1,25 +1,10 @@
-{#snippet severityPopover()}
-
-
-
-
-
- Critical: System is down or a critical component is non-functional, causing
- a complete stoppage of work or significant business impact.
-
-
- High: Major functionality is impaired, but a workaround is available, or a
- critical component is significantly degraded.
-
-
- Medium: Minor functionality is impaired without significant business impact.
-
-
- Low: Issue has minor impact on business operations; workaround is not necessary.
-
-
- Question: Requests for information, general guidance, or feature requests.
-
-
-
-
-{/snippet}
-