106 lines · 2.3 KB · TypeScript
RawDownload
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 };}