Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions src/lib/stores/sites.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
import type { Models } from '@appwrite.io/console';

export type FrameworkAdapterWithStartCommand = Models.FrameworkAdapter & {
startCommand?: string;
};

export function getFrameworkIcon(framework: string) {
switch (true) {
case framework.toLocaleLowerCase().includes('sveltekit'):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,20 @@
import { Fieldset, Layout, Accordion } from '@appwrite.io/pink-svelte';
import type { Models } from '@appwrite.io/console';
import { iconPath } from '$lib/stores/app';
import { getFrameworkIcon, type FrameworkAdapterWithStartCommand } from '$lib/stores/sites';
import { getFrameworkIcon } 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'
)) as FrameworkAdapterWithStartCommand;
$: adapterData =
frameworkData?.adapters.find((adapter) => adapter.key === 'ssr') ??
frameworkData?.adapters.find((adapter) => adapter.key === 'static');

export let variables: Partial<Models.Variable>[] = [];
export let isLoading = false;
export let installCommand = '';
export let buildCommand = '';
export let startCommand = '';
export let outputDirectory = '';

let frameworkId = selectedFramework.key;
Expand All @@ -28,7 +26,6 @@
$: if (frameworkData && adapterDefaultsKey !== lastAdapterDefaultsKey) {
installCommand = adapterData?.installCommand ?? '';
buildCommand = adapterData?.buildCommand ?? '';
startCommand = adapterData?.startCommand ?? '';
outputDirectory = adapterData?.outputDirectory ?? '';
lastAdapterDefaultsKey = adapterDefaultsKey;
}
Expand Down Expand Up @@ -86,24 +83,6 @@
Reset
</Button>
</Layout.Stack>
{#if adapterData?.key === 'ssr'}
<Layout.Stack gap="s" direction="row" alignItems="flex-end">
<InputText
id="startCommand"
label="Start command"
bind:value={startCommand}
placeholder={adapterData?.startCommand ||
'Enter start command'} />
<Button
secondary
size="s"
disabled={(adapterData?.startCommand ?? '') ===
(startCommand ?? '')}
on:click={() => (startCommand = adapterData?.startCommand)}>
Reset
</Button>
</Layout.Stack>
{/if}
<Layout.Stack gap="s" direction="row" alignItems="flex-end">
<InputText
id="outputDirectory"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import { writable } from 'svelte/store';
import { getLatestTag } from '$lib/helpers/github';
import Link from '$lib/elements/link.svelte';
import type { FrameworkAdapterWithStartCommand } from '$lib/stores/sites';

let {
data
Expand All @@ -46,7 +45,6 @@
let domain = $state('');
let rootDir = $state(data.repository?.rootDirectory || '');
let buildCommand = $state('');
let startCommand = $state('');
let installCommand = $state('');
let outputDirectory = $state('');
let domainIsValid = $state(false);
Expand Down Expand Up @@ -82,19 +80,13 @@
}))
);

const primaryAdapter = $derived.by(
() => 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);
if (fw && fw.adapters && fw.adapters.length > 0) {
const adapter = fw.adapters[0];
installCommand = adapter.installCommand || '';
buildCommand = adapter.buildCommand || '';
startCommand = (adapter as FrameworkAdapterWithStartCommand).startCommand || '';
outputDirectory = adapter.outputDirectory || '';
}
}
Expand All @@ -111,11 +103,10 @@
// 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 || startCommand || outputDirectory);
hasCustomCommands = !!(installCommand || buildCommand || outputDirectory);

// If no custom commands, auto-fill from framework defaults
if (!hasCustomCommands && data.frameworks) {
Expand All @@ -124,7 +115,6 @@
const adapter = fw.adapters[0];
installCommand = adapter.installCommand || '';
buildCommand = adapter.buildCommand || '';
startCommand = (adapter as FrameworkAdapterWithStartCommand).startCommand || '';
outputDirectory = adapter.outputDirectory || '';
}
}
Expand Down Expand Up @@ -155,7 +145,6 @@
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
Expand Down Expand Up @@ -284,12 +273,6 @@
label="Build command"
placeholder={buildCommand || 'npm run build'}
bind:value={buildCommand} />
{#if shouldShowStartCommand}
<Input.Text
label="Start command"
placeholder={startCommand || 'npm run start'}
bind:value={startCommand} />
{/if}
<Input.Text
label="Output directory"
placeholder={outputDirectory || 'dist'}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import { currentPlan } from '$lib/stores/organization';
import Domain from '../domain.svelte';
import { uploader } from '$lib/stores/uploader';
import type { FrameworkAdapterWithStartCommand } from '$lib/stores/sites';

export let data;
let showExitModal = false;
Expand All @@ -41,10 +40,9 @@
let framework: Models.Framework =
data.frameworks.frameworks?.find((f) => f.key === 'other') ??
data.frameworks.frameworks?.[0];
let adapter = framework?.adapters[0] as FrameworkAdapterWithStartCommand;
let adapter = framework?.adapters[0];
let installCommand = adapter?.installCommand;
let buildCommand = adapter?.buildCommand;
let startCommand = adapter?.startCommand;
let outputDirectory = adapter?.outputDirectory;
let variables: Partial<Models.Variable>[] = [];
let files: FileList;
Expand Down Expand Up @@ -79,7 +77,6 @@
buildRuntime,
installCommand: installCommand || undefined,
buildCommand: buildCommand || undefined,
startCommand: startCommand || undefined,
outputDirectory: outputDirectory || undefined
});

Expand Down Expand Up @@ -254,7 +251,6 @@
<Configuration
bind:installCommand
bind:buildCommand
bind:startCommand
bind:outputDirectory
bind:selectedFramework={framework}
bind:variables
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import Domain from '../../domain.svelte';
import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store';
import { normalizeDetectedVariables, mergeVariables } from '$lib/helpers/variables';
import type { FrameworkAdapterWithStartCommand } from '$lib/stores/sites';

export let data;
let showExitModal = false;
Expand All @@ -39,12 +38,11 @@
let name = '';
let id = ID.unique();
let framework: Models.Framework = data.frameworks.frameworks.find((f) => f.key === 'other');
let adapter = framework?.adapters[0] as FrameworkAdapterWithStartCommand;
let adapter = framework?.adapters[0];
let branch: string;
let rootDir = './';
let installCommand = adapter?.installCommand;
let buildCommand = adapter?.buildCommand;
let startCommand = adapter?.startCommand;
let outputDirectory = adapter?.outputDirectory;
let variables: Partial<Models.Variable>[] = [];
let silentMode = false;
Expand Down Expand Up @@ -83,10 +81,9 @@
if (!framework) {
framework = data.frameworks.frameworks.find((f) => f.key === 'other');
}
adapter = framework?.adapters[0] as FrameworkAdapterWithStartCommand;
adapter = framework?.adapters[0];
installCommand = adapter?.installCommand;
buildCommand = adapter?.buildCommand;
startCommand = adapter?.startCommand;
outputDirectory = adapter?.outputDirectory;
const detectedVariables = normalizeDetectedVariables(response?.variables);
if (detectedVariables.length) {
Expand Down Expand Up @@ -124,7 +121,6 @@
buildRuntime,
installCommand: installCommand || undefined,
buildCommand: buildCommand || undefined,
startCommand: startCommand || undefined,
outputDirectory: outputDirectory || undefined,
installationId: data.installation.$id,
providerRepositoryId: data.repository.id,
Expand Down Expand Up @@ -223,7 +219,6 @@
<Configuration
bind:installCommand
bind:buildCommand
bind:startCommand
bind:outputDirectory
bind:selectedFramework={framework}
bind:variables
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,20 @@
import { addNotification } from '$lib/stores/notifications';
import { sdk } from '$lib/stores/sdk';
import { Adapter, BuildRuntime, Framework, type Models } from '@appwrite.io/console';
import { Card, Fieldset, Icon, InlineCode, Layout, Tooltip } from '@appwrite.io/pink-svelte';
import {
Accordion,
Card,
Fieldset,
Icon,
InlineCode,
Layout,
Tooltip
} from '@appwrite.io/pink-svelte';
import { iconPath } from '$lib/stores/app';
import { Link } from '$lib/elements';
import { IconInfo } from '@appwrite.io/pink-icons-svelte';
import { adapterDataList } from './store';
import { getFrameworkIcon, type FrameworkAdapterWithStartCommand } from '$lib/stores/sites';
import { getFrameworkIcon } from '$lib/stores/sites';
import { page } from '$app/state';

let {
Expand Down Expand Up @@ -50,9 +58,8 @@
(fallback ?? '') === (site?.fallbackFile ?? '') &&
(adapter ?? '') === (site?.adapter ?? '')
);
let frameworkAdapterData: FrameworkAdapterWithStartCommand = $derived(
(selectedFramework.adapters.find((a) => a.key === adapter) ??
selectedFramework.adapters[0]) as FrameworkAdapterWithStartCommand
let frameworkAdapterData = $derived(
selectedFramework.adapters.find((a) => a.key === adapter) ?? selectedFramework.adapters[0]
);

$effect(() => {
Expand All @@ -77,17 +84,19 @@
}

//Update values
const data = (selectedFramework.adapters.find((a) => a.key === adapter) ??
selectedFramework.adapters[0]) as FrameworkAdapterWithStartCommand;
const data =
selectedFramework.adapters.find((a) => a.key === adapter) ??
selectedFramework.adapters[0];
installCommand = data.installCommand;
buildCommand = data.buildCommand;
startCommand = data.startCommand;
outputDirectory = data.outputDirectory;
Comment thread
greptile-apps[bot] marked this conversation as resolved.
adapter = data.key as Adapter;
fallback = data.fallbackFile;
startCommand = '';
} else if (hasFrameworkSelectionChanged) {
const data = (selectedFramework.adapters.find((a) => a.key === adapter) ??
selectedFramework.adapters[0]) as FrameworkAdapterWithStartCommand;
const data =
selectedFramework.adapters.find((a) => a.key === adapter) ??
selectedFramework.adapters[0];
const isOriginalAdapter = adapter === site.adapter;

installCommand = isOriginalAdapter
Expand All @@ -96,15 +105,13 @@
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;
startCommand = isOriginalAdapter ? (site?.startCommand ?? '') : '';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Old start command gets restored

When an SSR site is changed to another framework and its adapter is then changed away from and back to SSR, this branch restores site.startCommand solely because the adapter key matches the original adapter. The subsequent update submits the old framework's command for the newly selected framework, causing deployments to use an incompatible entrypoint.

Knowledge Base Used: Functions and Sites

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateBuildSettings.svelte
Line: 114

Comment:
**Old start command gets restored**

When an SSR site is changed to another framework and its adapter is then changed away from and back to SSR, this branch restores `site.startCommand` solely because the adapter key matches the original adapter. The subsequent update submits the old framework's command for the newly selected framework, causing deployments to use an incompatible entrypoint.

**Knowledge Base Used:** [Functions and Sites](https://app.greptile.com/appwrite/-/custom-context/knowledge-base/appwrite/console/-/docs/project-functions-sites.md)

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code Fix in Codex

}

lastFrameworkAdapterKey = `${selectedFramework.key}:${adapter ?? ''}`;
Expand Down Expand Up @@ -162,7 +169,7 @@
timeout: site.timeout || undefined,
installCommand: installCommand || undefined,
buildCommand: buildCommand || undefined,
startCommand: startCommand || undefined,
startCommand: adptr?.key === 'ssr' ? startCommand || undefined : undefined,
outputDirectory: outputDirectory || undefined,
buildRuntime: (site?.buildRuntime as BuildRuntime) || undefined,
adapter: (adptr?.key as Adapter) || undefined,
Expand Down Expand Up @@ -193,17 +200,13 @@
}
}

function reset(type: 'installCommand' | 'buildCommand' | 'startCommand' | 'outputDirectory') {
const data = selectedFramework.adapters.find(
(a) => a.key === adapter
) as FrameworkAdapterWithStartCommand;
function reset(type: 'installCommand' | 'buildCommand' | 'outputDirectory') {
const data = selectedFramework.adapters.find((a) => a.key === adapter);

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;
}
Expand Down Expand Up @@ -332,24 +335,6 @@
Reset
</Button>
</Layout.Stack>
{#if adapter === Adapter.Ssr}
<Layout.Stack gap="s" direction="row" alignItems="flex-end">
<InputText
id="startCommand"
label="Start command"
bind:value={startCommand}
placeholder={frameworkAdapterData?.startCommand ||
'Enter start command'} />
<Button
secondary
size="s"
disabled={(startCommand ?? '') ===
(frameworkAdapterData?.startCommand ?? '')}
on:click={() => reset('startCommand')}>
Reset
</Button>
</Layout.Stack>
{/if}
<Layout.Stack gap="s" direction="row" alignItems="flex-end">
<InputText
id="outputDirectory"
Expand Down Expand Up @@ -381,6 +366,19 @@
</Tooltip>
</InputText>
{/if}
{#if adapter === Adapter.Ssr}
<Accordion title="Advanced">
<Layout.Stack gap="l">
Command used to start your SSR server after a successful deploy.
Leave it empty to use the framework default.
<InputText
id="startCommand"
label="Start command"
bind:value={startCommand}
placeholder="Enter start command" />
</Layout.Stack>
</Accordion>
{/if}
</Layout.Stack>
</Fieldset>
</Layout.Stack>
Expand Down