added quick mode to skip wizard

This commit is contained in:
Atharva Deosthale
2025-11-27 22:20:15 +05:30
parent f5b6f99142
commit 20ca407011
4 changed files with 226 additions and 6 deletions
@@ -1,11 +1,22 @@
import { sdk } from '$lib/stores/sdk';
import { redirect } from '@sveltejs/kit';
import { redirect, isRedirect } from '@sveltejs/kit';
import { base } from '$app/paths';
import type { PageLoad } from './$types';
import { getNestedRootDirectory, getRepositoryInfo } from '$lib/helpers/github';
import {
getNestedRootDirectory,
getRepositoryInfo,
getDefaultBranch,
validateBranch
} from '$lib/helpers/github';
import { ID, Runtime, Type } from '@appwrite.io/console';
export const load: PageLoad = async ({ url, params, parent }) => {
const { installations: vcsInstallations, runtimesList, specificationsList } = await parent();
const {
installations: vcsInstallations,
runtimesList,
specificationsList,
regionalConsoleVariables
} = await parent();
const repository = url.searchParams.get('repo') || url.searchParams.get('repository');
@@ -37,6 +48,94 @@ export const load: PageLoad = async ({ url, params, parent }) => {
const runtime = url.searchParams.get('runtime');
// Quick mode - create function and redirect directly to function page
const quickMode = url.searchParams.get('quick') === 'true';
if (quickMode) {
try {
const runtimeParam = runtime || 'node-18.0';
const selectedRuntime = runtimeParam as Runtime;
const entrypoint = url.searchParams.get('entrypoint') || '';
const installCommand = url.searchParams.get('install') || '';
const rootDir =
getNestedRootDirectory(repository) || url.searchParams.get('rootDir') || '.';
// Get branch - validate provided or use default
const branchParam = url.searchParams.get('branch');
let selectedBranch: string;
if (branchParam) {
const isValid = await validateBranch(info.owner, info.name, branchParam);
if (isValid) {
selectedBranch = branchParam;
} else {
selectedBranch = (await getDefaultBranch(info.owner, info.name)) || 'main';
}
} else {
selectedBranch = (await getDefaultBranch(info.owner, info.name)) || 'main';
}
// Get first available specification
const specification =
specificationsList?.specifications?.[0]?.slug || 's-0.5vcpu-512mb';
// Create function
const func = await sdk.forProject(params.region, params.project).functions.create({
functionId: ID.unique(),
name: info.name,
runtime: selectedRuntime,
execute: ['any'],
entrypoint: entrypoint || undefined,
commands: installCommand || undefined,
providerSilentMode: false,
specification
});
// Add auto-generated domain
await sdk.forProject(params.region, params.project).proxy.createFunctionRule({
domain: `${ID.unique()}.${regionalConsoleVariables._APP_DOMAIN_FUNCTIONS}`,
functionId: func.$id
});
// Add variables (empty values used as empty strings)
await Promise.all(
envVars.map((variable) =>
sdk.forProject(params.region, params.project).functions.createVariable({
functionId: func.$id,
key: variable.key,
value: variable.value,
secret: false
})
)
);
// Create deployment
await sdk.forProject(params.region, params.project).functions.createTemplateDeployment({
functionId: func.$id,
repository: info.name,
owner: info.owner,
rootDirectory: rootDir,
type: Type.Branch,
reference: selectedBranch,
activate: true
});
// Redirect to function page
redirect(
302,
`${base}/project-${params.region}-${params.project}/functions/function-${func.$id}`
);
} catch (e) {
// Re-throw redirects (they're not errors)
if (isRedirect(e)) {
throw e;
}
// On error, fall through to show the wizard
console.error('Quick deploy failed:', e);
}
}
let installations = vcsInstallations || null;
if (!installations) {
try {
@@ -1,10 +1,16 @@
import { sdk } from '$lib/stores/sdk';
import { redirect } from '@sveltejs/kit';
import { redirect, isRedirect } from '@sveltejs/kit';
import { base } from '$app/paths';
import type { PageLoad } from './$types';
import { getNestedRootDirectory, getRepositoryInfo } from '$lib/helpers/github';
import {
getNestedRootDirectory,
getRepositoryInfo,
getDefaultBranch,
validateBranch
} from '$lib/helpers/github';
import { Adapter, BuildRuntime, Framework, ID, Type } from '@appwrite.io/console';
export const load: PageLoad = async ({ url, params }) => {
export const load: PageLoad = async ({ url, params, parent }) => {
const repository = url.searchParams.get('repo') || url.searchParams.get('repository');
if (!repository) {
@@ -33,6 +39,115 @@ export const load: PageLoad = async ({ url, params }) => {
})
: [];
// Quick mode - create site and redirect directly to deploying page
const quickMode = url.searchParams.get('quick') === 'true';
if (quickMode) {
try {
const { regionalConsoleVariables } = await parent();
const preset = url.searchParams.get('preset') || 'nextjs';
const framework = (Object.values(Framework) as string[]).includes(preset.toLowerCase())
? (preset.toLowerCase() as Framework)
: Framework.Nextjs;
// Get framework defaults
const frameworks = await sdk
.forProject(params.region, params.project)
.sites.listFrameworks();
const fw = frameworks.frameworks.find((f) => f.key === framework);
let installCommand = url.searchParams.get('install') || '';
let buildCommand = url.searchParams.get('build') || '';
let outputDirectory = url.searchParams.get('output') || '';
// Use framework defaults if not provided
if (!installCommand && !buildCommand && !outputDirectory && fw?.adapters?.length > 0) {
const adapter = fw.adapters[0];
installCommand = adapter.installCommand || '';
buildCommand = adapter.buildCommand || '';
outputDirectory = adapter.outputDirectory || '';
}
// Get branch - validate provided or use default
const branchParam = url.searchParams.get('branch');
let selectedBranch: string;
if (branchParam) {
const isValid = await validateBranch(info.owner, info.name, branchParam);
if (isValid) {
selectedBranch = branchParam;
} else {
selectedBranch = (await getDefaultBranch(info.owner, info.name)) || 'main';
}
} else {
selectedBranch = (await getDefaultBranch(info.owner, info.name)) || 'main';
}
const rootDir =
getNestedRootDirectory(repository) || url.searchParams.get('rootDir') || '.';
const buildRuntime =
framework === Framework.Other ? BuildRuntime.Static1 : BuildRuntime.Node210;
// Create site
const site = await sdk.forProject(params.region, params.project).sites.create({
siteId: ID.unique(),
name: info.name,
framework,
buildRuntime,
installCommand: installCommand || undefined,
buildCommand: buildCommand || undefined,
outputDirectory: outputDirectory || undefined,
adapter: framework === Framework.Other ? Adapter.Static : undefined,
providerSilentMode: false
});
// Add auto-generated domain
await sdk.forProject(params.region, params.project).proxy.createSiteRule({
domain: `${ID.unique()}.${regionalConsoleVariables._APP_DOMAIN_SITES}`,
siteId: site.$id
});
// Add variables (empty values used as empty strings)
await Promise.all(
envVars.map((variable) =>
sdk.forProject(params.region, params.project).sites.createVariable({
siteId: site.$id,
key: variable.key,
value: variable.value,
secret: false
})
)
);
// Create deployment
const deployment = await sdk
.forProject(params.region, params.project)
.sites.createTemplateDeployment({
siteId: site.$id,
repository: info.name,
owner: info.owner,
rootDirectory: rootDir,
type: Type.Branch,
reference: selectedBranch,
activate: true
});
// Redirect to deploying page
redirect(
302,
`${base}/project-${params.region}-${params.project}/sites/create-site/deploying?site=${site.$id}&deployment=${deployment.$id}`
);
} catch (e) {
// Re-throw redirects (they're not errors)
if (isRedirect(e)) {
throw e;
}
// On error, fall through to show the wizard
console.error('Quick deploy failed:', e);
}
}
const [frameworks, installations] = await Promise.all([
sdk.forProject(params.region, params.project).sites.listFrameworks(),
sdk
@@ -117,6 +117,8 @@
const branch =
currentUrl.searchParams.get('branch') || data.deploymentData.repository.branch;
const quick = currentUrl.searchParams.get('quick');
if (entrypoint) url.searchParams.set('entrypoint', entrypoint);
if (install) url.searchParams.set('install', install);
if (build) url.searchParams.set('build', build);
@@ -126,6 +128,7 @@
rootDir || data.deploymentData.repository.rootDirectory
);
if (branch) url.searchParams.set('branch', branch);
if (quick === 'true') url.searchParams.set('quick', 'true');
if (data.envVars.length > 0) {
// Preserve KEY=value format for prefilled values
@@ -124,11 +124,14 @@
const branch =
currentUrl.searchParams.get('branch') || data.deploymentData.repository.branch;
const quick = currentUrl.searchParams.get('quick');
if (preset) url.searchParams.set('preset', preset);
if (install) url.searchParams.set('install', install);
if (build) url.searchParams.set('build', build);
if (output) url.searchParams.set('output', output);
if (branch) url.searchParams.set('branch', branch);
if (quick === 'true') url.searchParams.set('quick', 'true');
}
if (data.envVars.length > 0) {