diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/createVariableModal.svelte b/src/lib/components/variables/createVariableModal.svelte similarity index 83% rename from src/routes/(console)/project-[region]-[project]/sites/create-site/createVariableModal.svelte rename to src/lib/components/variables/createVariableModal.svelte index 8dc28a966d..06b73ea54f 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/create-site/createVariableModal.svelte +++ b/src/lib/components/variables/createVariableModal.svelte @@ -9,12 +9,29 @@ import { page } from '$app/state'; import { IconPlus, IconX } from '@appwrite.io/pink-icons-svelte'; - export let show = false; - export let variables: Partial[]; + export type ProductLabel = 'site' | 'function'; - let newVariables: Partial[] = [{ key: '', value: '' }]; - let secret = false; - let error = ''; + let { + show = $bindable(false), + variables = $bindable(), + productLabel = 'site' + }: { + show: boolean; + variables: Partial[]; + productLabel?: ProductLabel; + } = $props(); + + let newVariables = $state[]>([{ key: '', value: '' }]); + let secret = $state(false); + let error = $state(''); + + $effect(() => { + if (!show) { + newVariables = [{ key: '', value: '' }]; + secret = false; + error = ''; + } + }); function handleVariable() { try { @@ -54,19 +71,17 @@ function removeVariable(index: number) { if (newVariables.length === 1) { - newVariables[0].key = ''; - newVariables[0].value = ''; + newVariables = [{ key: '', value: '' }]; } else { - newVariables.splice(index, 1); - newVariables = [...newVariables]; + newVariables = newVariables.filter((_, i) => i !== index); } } - Set the environment variables or secret that will be passed to your site. Global variables - can be set in project settings removeVariable(i)}> + onclick={() => removeVariable(i)}> diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/deleteVariableModal.svelte b/src/lib/components/variables/deleteVariableModal.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/sites/create-site/deleteVariableModal.svelte rename to src/lib/components/variables/deleteVariableModal.svelte diff --git a/src/lib/components/variables/environmentVariables.svelte b/src/lib/components/variables/environmentVariables.svelte new file mode 100644 index 0000000000..8b4edb8c38 --- /dev/null +++ b/src/lib/components/variables/environmentVariables.svelte @@ -0,0 +1,271 @@ + + + + + Set up environment variables to securely manage keys and settings for your project. + + + + + + + {#if variables?.length} + + {/if} + + + {#if isLoading && !variables?.length} + + + Key + Value + + + {#each Array(3) as _} + + + + + + + + + + + + {/each} + + {:else if variables?.length} + + {#snippet children(paginatedItems)} + + + Key + Value + + + {#each paginatedItems as variable} + + {variable.key} + + +
+ {#if variable.secret} + + + + This value is secret, you cannot see its + value. + + + {:else} + + {/if} +
+
+ +
+ + { + e.preventDefault(); + toggle(e); + }}> + + + + + + {#if !variable?.secret} + { + toggle(e); + currentVariable = variable; + showUpdate = true; + }}> + Update + + {/if} + {#if !variable?.secret} + { + toggle(e); + currentVariable = variable; + showSecretModal = true; + }}> + Secret + + {/if} + { + toggle(e); + currentVariable = variable; + showDelete = true; + }}> + Delete + + + + +
+
+
+ {/each} +
+ {/snippet} +
+ {:else} + { + showCreate = true; + trackEvent(Click.VariablesCreateClick, { + source: createSource + }); + }}>Create variables to get started + {/if} +
+
+
+ +{#if showEditorModal} + +{/if} + +{#if showSecretModal} + +{/if} + +{#if showImportModal} + +{/if} + +{#if showCreate} + +{/if} +{#if showUpdate} + +{/if} + +{#if showDelete} + +{/if} diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/importSiteVariablesModal.svelte b/src/lib/components/variables/importVariablesModal.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/sites/create-site/importSiteVariablesModal.svelte rename to src/lib/components/variables/importVariablesModal.svelte diff --git a/src/lib/components/variables/index.ts b/src/lib/components/variables/index.ts new file mode 100644 index 0000000000..f8680034b8 --- /dev/null +++ b/src/lib/components/variables/index.ts @@ -0,0 +1,7 @@ +export { default as CreateVariableModal, type ProductLabel } from './createVariableModal.svelte'; +export { default as DeleteVariableModal } from './deleteVariableModal.svelte'; +export { default as EnvironmentVariables } from './environmentVariables.svelte'; +export { default as ImportVariablesModal } from './importVariablesModal.svelte'; +export { default as SecretVariableModal } from './secretVariableModal.svelte'; +export { default as UpdateVariableModal } from './updateVariableModal.svelte'; +export { default as VariableEditorModal } from './variableEditorModal.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/secretVariableModal.svelte b/src/lib/components/variables/secretVariableModal.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/sites/create-site/secretVariableModal.svelte rename to src/lib/components/variables/secretVariableModal.svelte diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/updateVariableModal.svelte b/src/lib/components/variables/updateVariableModal.svelte similarity index 94% rename from src/routes/(console)/project-[region]-[project]/sites/create-site/updateVariableModal.svelte rename to src/lib/components/variables/updateVariableModal.svelte index c678007f98..bf48d8b62f 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/create-site/updateVariableModal.svelte +++ b/src/lib/components/variables/updateVariableModal.svelte @@ -11,6 +11,7 @@ export let show = false; export let selectedVar: Partial; export let variables: Partial[]; + export let productLabel = 'site'; let pair = { $id: selectedVar?.$id, @@ -40,7 +41,8 @@ - Update the environment variable for your site. Global variables can be set in project settings[]; + export let docsLink = + 'https://appwrite.io/docs/products/sites/develop#accessing-environment-variables'; const editableVariables = variables.filter((variable) => !variable.secret); const secretVariables = variables.filter((variable) => variable.secret); @@ -122,11 +124,7 @@ {#if secretVariables?.length > 0} {secretVariables.length} secret variables are hidden from the editor. Their values will - remain unchanged. Learn more. + remain unchanged. Learn more. {/if} diff --git a/src/lib/helpers/variables.ts b/src/lib/helpers/variables.ts new file mode 100644 index 0000000000..90219499ed --- /dev/null +++ b/src/lib/helpers/variables.ts @@ -0,0 +1,35 @@ +import type { Models } from '@appwrite.io/console'; + +export function normalizeDetectedVariables( + detected: Models.DetectionVariable[] = [] +): Partial[] { + const normalized: Partial[] = []; + for (const variable of detected) { + const key = variable.name?.trim(); + if (!key) { + continue; + } + normalized.push({ + key, + value: variable.value ?? '', + secret: false + }); + } + return normalized; +} + +export function mergeVariables( + existing: Partial[], + detected: Partial[] +) { + const map = new Map(existing.map((variable) => [variable.key, variable])); + detected.forEach((variable) => { + if (!variable.key) { + return; + } + if (!map.has(variable.key)) { + map.set(variable.key, variable); + } + }); + return Array.from(map.values()); +} diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/+page.svelte index 9a06f70dd6..0f3fbd874a 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/+page.svelte @@ -22,6 +22,7 @@ import RepoCard from './repoCard.svelte'; import { getIconFromRuntime } from '$lib/stores/runtimes'; import { regionalConsoleVariables } from '$routes/(console)/project-[region]-[project]/store'; + import { normalizeDetectedVariables, mergeVariables } from '$lib/helpers/variables'; export let data; @@ -82,6 +83,10 @@ entrypoint = detections.entrypoint; buildCommand = detections.commands; runtime = detections.runtime as Runtime; + const detectedVariables = normalizeDetectedVariables(detections?.variables); + if (detectedVariables.length) { + variables = mergeVariables(variables, detectedVariables); + } trackEvent(Submit.FrameworkDetect, { runtime, source: 'repository' }); } catch (error) { @@ -189,7 +194,11 @@ installationId={data.installation.$id} repositoryId={data.repository.id} /> - + diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/configuration.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/configuration.svelte index 8f3091f39e..c6a5dbd747 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/configuration.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/configuration.svelte @@ -3,9 +3,13 @@ import { Link } from '$lib/elements'; import { InputText } from '$lib/elements/forms'; import { Accordion, Fieldset, Layout } from '@appwrite.io/pink-svelte'; + import type { Models } from '@appwrite.io/console'; + import { EnvironmentVariables } from '$lib/components/variables'; export let buildCommand = ''; export let roles: string[] = []; + export let variables: Partial[] = []; + export let isLoading = false;
@@ -31,5 +35,11 @@ +
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 dc5d0a1403..8b1a9ad3f6 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 @@ -1,38 +1,10 @@