diff --git a/src/lib/components/git/connectGit.svelte b/src/lib/components/git/connectGit.svelte index faeb61019..8b8e2273d 100644 --- a/src/lib/components/git/connectGit.svelte +++ b/src/lib/components/git/connectGit.svelte @@ -41,6 +41,7 @@ {/if} diff --git a/src/lib/helpers/files.ts b/src/lib/helpers/files.ts index 97a3b8939..619d58b0f 100644 --- a/src/lib/helpers/files.ts +++ b/src/lib/helpers/files.ts @@ -1,4 +1,6 @@ +import { addNotification } from '$lib/stores/notifications'; import ignore from 'ignore'; +import { createTarGzip } from 'nanotar'; export interface FileData { path: string; @@ -42,6 +44,48 @@ export async function processFileList(files: FileList): Promise { return Promise.all(filePromises); } +export async function gzipUpload(files: FileList) { + let uploadFile: File; + const tick = performance.now(); + if (!files?.length) return; + + // If the file is a tar.gz file, then return it as is + if ( + files?.length === 1 && + files.item(0).type === 'application/gzip' && + files.item(0).name.split('.').pop() === 'tar' + ) { + uploadFile = files.item(0); + } + // Else process the file to mantain the folder structure and create a .tar.gz file + else { + try { + const processedFiles = await processFileList(files); + const tar = await createTarGzip( + processedFiles.map((f) => ({ + name: f.path, + data: f.buffer + })) + ); + const blob = new Blob([tar], { type: 'application/gzip' }); + const file = new File([blob], 'deployment.tar.gz', { + type: 'application/gzip' + }); + uploadFile = file; + } catch (e) { + addNotification({ + type: 'error', + message: e + }); + } + } + console.log(uploadFile); + const tock = performance.now(); + console.log('Time taken to process files:', tock - tick); + + return uploadFile; +} + export const defaultIgnore = ` ### Node ### # Logs diff --git a/src/lib/layout/wizard.svelte b/src/lib/layout/wizard.svelte index 589fe9a6f..8074d4792 100644 --- a/src/lib/layout/wizard.svelte +++ b/src/lib/layout/wizard.svelte @@ -117,4 +117,8 @@ max-height: 100dvh; overflow-y: auto; } + + :globla(html) { + overflow-y: hidden; + } diff --git a/src/routes/(console)/project-[project]/createVariable.svelte b/src/routes/(console)/project-[project]/createVariable.svelte index 27568f2e3..8e4373f22 100644 --- a/src/routes/(console)/project-[project]/createVariable.svelte +++ b/src/routes/(console)/project-[project]/createVariable.svelte @@ -1,5 +1,5 @@ + + + + Set the environment variables or secret that will be passed to your site. Global variables + can be set in project settings. + + + + + + + + + + + diff --git a/src/routes/(console)/project-[project]/sites/create-site/manual/+page.svelte b/src/routes/(console)/project-[project]/sites/create-site/manual/+page.svelte index 2e2e3dafb..ac3fef04f 100644 --- a/src/routes/(console)/project-[project]/sites/create-site/manual/+page.svelte +++ b/src/routes/(console)/project-[project]/sites/create-site/manual/+page.svelte @@ -11,12 +11,12 @@ import { IconInfo } from '@appwrite.io/pink-icons-svelte'; import { writable } from 'svelte/store'; import Details from '../details.svelte'; - import Configuration from './configuration.svelte'; import Aside from './aside.svelte'; - import { BuildRuntime, Framework, ID, Query } from '@appwrite.io/console'; + import { BuildRuntime, Framework, ID } from '@appwrite.io/console'; import type { Models } from '@appwrite.io/console'; - import { processFileList } from '$lib/helpers/files'; - import { createTarGzip } from 'nanotar'; + import { gzipUpload } from '$lib/helpers/files'; + import Configuration from '../configuration.svelte'; + import Domain from '../domain.svelte'; export let data; let showExitModal = false; @@ -25,7 +25,9 @@ let isSubmitting = writable(false); let name = ''; - let id = ''; + let id = ID.unique(); + let domain = id; + let domainIsValid = true; let framework: Models.Framework = data.frameworks.frameworks[0]; let adapter = framework?.adapters[0]; let installCommand = adapter?.installCommand; @@ -36,40 +38,7 @@ let uploadFile: File; async function handleChange() { - const tick = performance.now(); - if (!files?.length) return; - - // If the file is a tar.gz file, then return it as is - if ( - files?.length === 1 && - files.item(0).type === 'application/gzip' && - files.item(0).name.split('.').pop() === 'tar' - ) { - uploadFile = files.item(0); - } - // Else process the file to mantain the folder structure and create a .tar.gz file - else { - try { - const processedFiles = await processFileList(files); - const tar = await createTarGzip( - processedFiles.map((f) => ({ - name: f.path, - data: f.buffer - })) - ); - const blob = new Blob([tar], { type: 'application/gzip' }); - const file = new File([blob], 'deployment.tar.gz', { type: 'application/gzip' }); - uploadFile = file; - } catch (e) { - addNotification({ - type: 'error', - message: e - }); - } - } - console.log(uploadFile); - const tock = performance.now(); - console.log('Time taken to process files:', tock - tick); + uploadFile = await gzipUpload(files); } async function create() { @@ -85,9 +54,9 @@ buildRuntime, undefined, undefined, - installCommand, - buildCommand, - outputDirectory, + installCommand || undefined, + buildCommand || undefined, + outputDirectory || undefined, undefined, framework.adapters[Object.keys(framework.adapters)[0]].key, //TODO: fix this undefined, @@ -98,28 +67,31 @@ undefined ); + //Add variables + const promises = variables.map((variable) => + sdk.forProject.sites.createVariable( + site.$id, + variable.key, + variable.value, + variable?.secret ?? false + ) + ); + await Promise.all(promises); + + const deployment = await sdk.forProject.sites.createDeployment( + site.$id, + uploadFile, + true, + installCommand || undefined, + buildCommand || undefined, + outputDirectory || undefined + ); + trackEvent(Submit.SiteCreate, { source: 'manual', framework: framework.key }); - //Add variables - await Promise.all( - Object.keys(variables).map(async (key) => { - await sdk.forProject.sites.createVariable( - site.$id, - key, - variables[key].value, - variables[key].secret - ); - }) - ); - - const { deployments } = await sdk.forProject.sites.listDeployments(site.$id, [ - Query.limit(1) - ]); - console.log(deployments); - const deployment = deployments[0]; await goto( `${base}/project-${$page.params.project}/sites/create-site/deploying?site=${site.$id}&deployment=${deployment.$id}` ); @@ -146,7 +118,10 @@ - + - Only PNG, JPEG, PDF files allowed + Only zipped files allowed @@ -177,7 +152,7 @@ bind:variables frameworks={data.frameworks.frameworks} /> - + diff --git a/src/routes/(console)/project-[project]/sites/create-site/manual/configuration.svelte b/src/routes/(console)/project-[project]/sites/create-site/manual/configuration.svelte deleted file mode 100644 index 1716552f8..000000000 --- a/src/routes/(console)/project-[project]/sites/create-site/manual/configuration.svelte +++ /dev/null @@ -1,219 +0,0 @@ - - -
- - ({ - value: framework.key, - label: framework.name - }))} - on:change={() => { - selectedFramework = frameworks.find((framework) => framework.key === frameworkId); - }} /> - - - - - Set up how your project is built and where the output files are stored. - - - - - - - - - - - - - - - - - - - Set up environment variables to securely manage keys and settings for your - project. - - {#if variables?.length} - - - Key - Value - - - {#each variables as variable} - - {variable.key} - - -
- {#if variable.secret} - - {:else} - - {/if} -
-
- -
- - - - - { - showEditorModal = true; - }}> - Edit - - {#if !variable?.secret} - { - currentVariable = variable; - showSecretModal = true; - }}> - Secret - - {/if} - { - showImportModal = true; - }}> - Delete - - - - -
-
-
- {/each} -
- {:else} - Create variables to get started - {/if} -
- - - - - - - -
-
-
-
-
- -{#if showEditorModal} - -{/if} - -{#if showSecretModal} - -{/if} - -{#if showImportModal} - -{/if} diff --git a/src/routes/(console)/project-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte b/src/routes/(console)/project-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte index a08a2ea9e..f9f9fe5ec 100644 --- a/src/routes/(console)/project-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte +++ b/src/routes/(console)/project-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte @@ -14,11 +14,12 @@ import { writable } from 'svelte/store'; import Details from '../../details.svelte'; import ProductionBranch from '../../productionBranch.svelte'; - import Configuration from './configuration.svelte'; import Aside from '../../aside.svelte'; import { BuildRuntime, Framework, ID, Query } from '@appwrite.io/console'; import type { Models } from '@appwrite.io/console'; import { onMount } from 'svelte'; + import Configuration from '../../configuration.svelte'; + import Domain from '../../domain.svelte'; export let data; let showExitModal = false; @@ -27,7 +28,7 @@ let isSubmitting = writable(false); let name = ''; - let id = ''; + let id = ID.unique(); let framework: Models.Framework = data.frameworks.frameworks[0]; let adapter = framework?.adapters[0]; let branch: string; @@ -37,6 +38,8 @@ let outputDirectory = adapter?.outputDirectory; let variables: Partial[] = []; let silentMode = false; + let domain = id; + let domainIsValid = true; onMount(() => { installation.set(data.installation); @@ -60,64 +63,69 @@ } async function create() { - try { - const fr = Object.values(Framework).find((f) => f === framework.key); - const buildRuntime = Object.values(BuildRuntime).find( - (f) => f === framework.buildRuntime - ); - let site = await sdk.forProject.sites.create( - id || ID.unique(), - name, - fr, - buildRuntime, - undefined, - undefined, - installCommand, - buildCommand, - outputDirectory, - undefined, - framework.adapters[Object.keys(framework.adapters)[0]].key, //TODO: fix this - data.installation.$id, - null, - data.repository.id, - branch, - silentMode, - rootDir - ); - trackEvent(Submit.SiteCreate, { - source: 'repository', - framework: framework.key - }); - - //Add variables - const promises = variables.map((variable) => - sdk.forProject.sites.createVariable( - site.$id, - variable.key, - variable.value, - variable?.secret ?? false - ) - ); - await Promise.all(promises); - - const { deployments } = await sdk.forProject.sites.listDeployments(site.$id, [ - Query.limit(1) - ]); - console.log(deployments); - const deployment = deployments[0]; - await goto( - `${base}/project-${$page.params.project}/sites/create-site/deploying?site=${site.$id}&deployment=${deployment.$id}` - ); - } catch (e) { + if (!domainIsValid) { addNotification({ type: 'error', - message: e.message + message: 'Please enter a valid domain' }); - trackError(e, Submit.SiteCreate); + return; + } else { + try { + const fr = Object.values(Framework).find((f) => f === framework.key); + const buildRuntime = Object.values(BuildRuntime).find( + (f) => f === framework.buildRuntime + ); + let site = await sdk.forProject.sites.create( + id || ID.unique(), + name, + fr, + buildRuntime, + undefined, + undefined, + installCommand, + buildCommand, + outputDirectory, + domain || undefined, + framework.adapters[Object.keys(framework.adapters)[0]].key, //TODO: fix this + data.installation.$id, + null, + data.repository.id, + branch, + silentMode, + rootDir + ); + trackEvent(Submit.SiteCreate, { + source: 'repository', + framework: framework.key + }); + + //Add variables + const promises = variables.map((variable) => + sdk.forProject.sites.createVariable( + site.$id, + variable.key, + variable.value, + variable?.secret ?? false + ) + ); + await Promise.all(promises); + + const { deployments } = await sdk.forProject.sites.listDeployments(site.$id, [ + Query.limit(1) + ]); + const deployment = deployments[0]; + await goto( + `${base}/project-${$page.params.project}/sites/create-site/deploying?site=${site.$id}&deployment=${deployment.$id}` + ); + } catch (e) { + addNotification({ + type: 'error', + message: e.message + }); + trackError(e, Submit.SiteCreate); + } } } - - $: console.log(variables); @@ -179,7 +187,7 @@ bind:variables frameworks={data.frameworks.frameworks} /> - +
@@ -187,11 +195,8 @@ - +