diff --git a/apps/dokploy/components/dashboard/project/add-template.tsx b/apps/dokploy/components/dashboard/project/add-template.tsx index 5dbbcd1d..8e9de54d 100644 --- a/apps/dokploy/components/dashboard/project/add-template.tsx +++ b/apps/dokploy/components/dashboard/project/add-template.tsx @@ -307,7 +307,7 @@ export const AddTemplate = ({ projectId, baseUrl }: Props) => { > {templates?.map((template) => (
{ )} > - {template.version} + {template?.version}
{ )} > {template.name}
- {template.name} + {template?.name} {viewMode === "detailed" && - template.tags.length > 0 && ( + template?.tags?.length > 0 && (
- {template.tags.map((tag) => ( + {template?.tags?.map((tag) => ( { {viewMode === "detailed" && (
- {template.description} + {template?.description}
)} @@ -372,25 +372,27 @@ export const AddTemplate = ({ projectId, baseUrl }: Props) => { > {viewMode === "detailed" && (
- - - - {template.links.website && ( + {template?.links?.github && ( + + + )} + {template?.links?.website && ( + )} - {template.links.docs && ( + {template?.links?.docs && ( @@ -419,7 +421,7 @@ export const AddTemplate = ({ projectId, baseUrl }: Props) => { This will create an application from the{" "} - {template.name} template and add it to your + {template?.name} template and add it to your project. diff --git a/packages/server/src/templates/processors.ts b/packages/server/src/templates/processors.ts index 86d3cdf7..31e7861a 100644 --- a/packages/server/src/templates/processors.ts +++ b/packages/server/src/templates/processors.ts @@ -1,3 +1,4 @@ +import { faker } from "@faker-js/faker"; import type { Schema } from "./index"; import { generateBase64, @@ -70,7 +71,7 @@ function processValue( schema: Schema, ): string { // First replace utility functions - let processedValue = value.replace(/\${([^}]+)}/g, (match, varName) => { + let processedValue = value?.replace(/\${([^}]+)}/g, (match, varName) => { // Handle utility functions if (varName === "domain") { return generateRandomDomain(schema); @@ -117,6 +118,14 @@ function processValue( return generateJwt(length); } + if (varName === "username") { + return faker.internet.userName().toLowerCase(); + } + + if (varName === "email") { + return faker.internet.email().toLowerCase(); + } + // If not a utility function, try to get from variables return variables[varName] || match; }); @@ -177,7 +186,14 @@ export function processDomains( variables: Record, schema: Schema, ): Template["domains"] { - if (!template?.config?.domains) return []; + if ( + !template?.config?.domains || + template.config.domains.length === 0 || + template.config.domains.every((domain) => !domain.serviceName) + ) { + return []; + } + return template?.config?.domains?.map((domain: DomainConfig) => ({ ...domain, host: domain.host @@ -194,7 +210,9 @@ export function processEnvVars( variables: Record, schema: Schema, ): Template["envs"] { - if (!template?.config?.env) return []; + if (!template?.config?.env || Object.keys(template.config.env).length === 0) { + return []; + } // Handle array of env vars if (Array.isArray(template.config.env)) { @@ -233,7 +251,13 @@ export function processMounts( variables: Record, schema: Schema, ): Template["mounts"] { - if (!template?.config?.mounts) return []; + if ( + !template?.config?.mounts || + template.config.mounts.length === 0 || + template.config.mounts.every((mount) => !mount.filePath && !mount.content) + ) { + return []; + } return template?.config?.mounts?.map((mount: MountConfig) => ({ filePath: processValue(mount.filePath, variables, schema),