import { parse } from "toml"; /** * Complete template interface that includes both metadata and configuration */export interface CompleteTemplate { metadata: { id: string; name: string; description: string; tags: string[]; version: string; logo: string; links: { github: string; website?: string; docs?: string; }; }; variables: { [key: string]: string; }; config: { isolated?: boolean; domains: Array<{ serviceName: string; port: number; path?: string; host?: string; }>; env: Record<string, string>; mounts?: Array<{ filePath: string; content: string; }>; };} interface TemplateMetadata { id: string; name: string; description: string; version: string; logo: string; links: { github: string; website?: string; docs?: string; }; tags: string[];} /** * Fetches the list of available templates from meta.json */export async function fetchTemplatesList( baseUrl = "https://templates.dokploy.com",): Promise<TemplateMetadata[]> { const response = await fetch(`${baseUrl}/meta.json`, { signal: AbortSignal.timeout(10000), }); if (!response.ok) { throw new Error(`Failed to fetch templates: ${response.statusText}`); } const templates = (await response.json()) as TemplateMetadata[]; return templates.map((template) => ({ id: template.id, name: template.name, description: template.description, version: template.version, logo: template.logo, links: template.links, tags: template.tags, }));} /** * Fetches a specific template's files */export async function fetchTemplateFiles( templateId: string, baseUrl = "https://templates.dokploy.com",): Promise<{ config: CompleteTemplate; dockerCompose: string }> { const timeout = AbortSignal.timeout(10000); const [templateYmlResponse, dockerComposeResponse] = await Promise.all([ fetch(`${baseUrl}/blueprints/${templateId}/template.toml`, { signal: timeout, }), fetch(`${baseUrl}/blueprints/${templateId}/docker-compose.yml`, { signal: timeout, }), ]); if (!templateYmlResponse.ok || !dockerComposeResponse.ok) { throw new Error("Template files not found"); } const [templateYml, dockerCompose] = await Promise.all([ templateYmlResponse.text(), dockerComposeResponse.text(), ]); const config = parse(templateYml) as CompleteTemplate; return { config, dockerCompose };}
import { parse } from "toml";
/**
* Complete template interface that includes both metadata and configuration
*/
export interface CompleteTemplate {
metadata: {
id: string;
name: string;
description: string;
tags: string[];
version: string;
logo: string;
links: {
github: string;
website?: string;
docs?: string;
};
};
variables: {
[key: string]: string;
};
config: {
isolated?: boolean;
domains: Array<{
serviceName: string;
port: number;
path?: string;
host?: string;
}>;
env: Record<string, string>;
mounts?: Array<{
filePath: string;
content: string;
}>;
};
}
interface TemplateMetadata {
id: string;
name: string;
description: string;
version: string;
logo: string;
links: {
github: string;
website?: string;
docs?: string;
};
tags: string[];
}
/**
* Fetches the list of available templates from meta.json
*/
export async function fetchTemplatesList(
baseUrl = "https://templates.dokploy.com",
): Promise<TemplateMetadata[]> {
const response = await fetch(`${baseUrl}/meta.json`, {
signal: AbortSignal.timeout(10000),
});
if (!response.ok) {
throw new Error(`Failed to fetch templates: ${response.statusText}`);
}
const templates = (await response.json()) as TemplateMetadata[];
return templates.map((template) => ({
id: template.id,
name: template.name,
description: template.description,
version: template.version,
logo: template.logo,
links: template.links,
tags: template.tags,
}));
}
/**
* Fetches a specific template's files
*/
export async function fetchTemplateFiles(
templateId: string,
baseUrl = "https://templates.dokploy.com",
): Promise<{ config: CompleteTemplate; dockerCompose: string }> {
const timeout = AbortSignal.timeout(10000);
const [templateYmlResponse, dockerComposeResponse] = await Promise.all([
fetch(`${baseUrl}/blueprints/${templateId}/template.toml`, {
signal: timeout,
}),
fetch(`${baseUrl}/blueprints/${templateId}/docker-compose.yml`, {
signal: timeout,
}),
]);
if (!templateYmlResponse.ok || !dockerComposeResponse.ok) {
throw new Error("Template files not found");
}
const [templateYml, dockerCompose] = await Promise.all([
templateYmlResponse.text(),
dockerComposeResponse.text(),
]);
const config = parse(templateYml) as CompleteTemplate;
return { config, dockerCompose };
}