import {
formatBulletList,
formatDate,
formatEmptyState,
formatFooter,
formatHeading,
formatProjectContext,
formatTable,
} from "../../shared/utils/formatter.util.js";
/**
* {{domainNamePascal}} formatter functions for converting API responses to user-friendly Markdown.
* Generated on {{date}} for {{domainDescription}}.
*/
{{#if:list}}
/**
* Format a list of {{domainName}} into Markdown.
* @param {{domainName}}Data - API response containing {{domainName}} list
* @param projectId - The project ID for context
* @returns Formatted Markdown string
*/
export function format{{domainNamePascal}}List(
{{domainName}}Data: unknown,
projectId: string,
): string {
const lines: string[] = [];
// Add main heading
const totalCount = {{domainName}}Data.totalResults || {{domainName}}Data.items?.length || 0;
lines.push(formatHeading(`{{domainNamePascal}} List (${totalCount})`, 1));
lines.push("");
if (!{{domainName}}Data.items || {{domainName}}Data.items.length === 0) {
const suggestions = [
"Create your first {{domainName}} to get started",
"Check if you have the correct project ID",
"Verify your permissions for this project",
];
lines.push(formatEmptyState("{{domainName}}", "this project", suggestions));
lines.push(formatProjectContext(projectId));
lines.push(formatFooter("List retrieved"));
return lines.join("\n");
}
// Add summary section
lines.push(formatHeading("Summary", 2));
const summary: Record<string, unknown> = {
"Total {{domainNamePascal}}": totalCount,
"Current Page": {{domainName}}Data.currentPage || 1,
"Total Pages": {{domainName}}Data.totalPages || 1,
"Results Per Page": {{domainName}}Data.resultsPerPage || {{domainName}}Data.items.length,
};
lines.push(formatBulletList(summary));
lines.push("");
// Add {{domainName}} table
lines.push(formatHeading("{{domainNamePascal}}", 2));
// TODO: Customize table columns based on actual {{domainName}} properties
const tableData = {{domainName}}Data.items.map((item: unknown) => ({
id: item.id || item.{{domainName}}_id || "N/A",
name: item.name || item.title || "Unnamed",
description: item.description || "-",
created: item.created_at ? formatDate(new Date(item.created_at)) : "-",
}));
const table = formatTable(tableData, [
{ key: "id", header: "ID" },
{ key: "name", header: "Name" },
{ key: "description", header: "Description" },
{ key: "created", header: "Created" },
]);
lines.push(table);
lines.push("");
// Add pagination info if applicable
if ({{domainName}}Data.totalPages > 1) {
lines.push(formatHeading("Pagination", 2));
lines.push(`Page ${{{domainName}}Data.currentPage} of ${{{domainName}}Data.totalPages}`);
if ({{domainName}}Data.currentPage < {{domainName}}Data.totalPages) {
lines.push(`- Next page: ${{{domainName}}Data.currentPage + 1}`);
}
if ({{domainName}}Data.currentPage > 1) {
lines.push(`- Previous page: ${{{domainName}}Data.currentPage - 1}`);
}
lines.push("");
}
// Add project context
lines.push(formatProjectContext(projectId));
// Add footer
lines.push(formatFooter("List retrieved"));
return lines.join("\n");
}
{{/if:list}}
{{#if:get}}
/**
* Format {{domainName}} details into Markdown.
* @param {{domainName}} - {{domainNamePascal}} data from API
* @param projectId - The project ID for context
* @returns Formatted Markdown string
*/
export function format{{domainNamePascal}}Details(
{{domainName}}: unknown,
projectId: string,
): string {
const lines: string[] = [];
// Add main heading
const title = {{domainName}}.name || {{domainName}}.title || `{{domainNamePascal}} ${{{domainName}}.id}`;
lines.push(formatHeading(`{{domainNamePascal}}: ${title}`, 1));
lines.push("");
// Add basic information section
lines.push(formatHeading("Basic Information", 2));
// TODO: Customize fields based on actual {{domainName}} properties
const basicInfo: Record<string, unknown> = {
"{{domainNamePascal}} ID": {{domainName}}.id || {{domainName}}.{{domainName}}_id,
"Name": {{domainName}}.name || {{domainName}}.title || "N/A",
"Description": {{domainName}}.description || "No description provided",
"Created": {{domainName}}.created_at ? formatDate(new Date({{domainName}}.created_at)) : "Unknown",
"Updated": {{domainName}}.updated_at ? formatDate(new Date({{domainName}}.updated_at)) : "Unknown",
};
lines.push(formatBulletList(basicInfo));
lines.push("");
// TODO: Add domain-specific sections here
// Example: Add metadata, settings, relationships, etc.
// Add project context with dashboard link
const sections = [
{
path: `/{{apiEndpoint}}/${{{domainName}}.id}`,
label: "View {{domainNamePascal}} in Lokalise Dashboard",
},
];
lines.push(formatProjectContext(projectId, sections));
// Add footer
lines.push(formatFooter("Details retrieved"));
return lines.join("\n");
}
{{/if:get}}
{{#if:create}}
/**
* Format {{domainName}} creation result into Markdown.
* @param {{domainName}} - The created {{domainName}} data
* @param projectId - The project ID for context
* @returns Formatted Markdown string
*/
export function formatCreate{{domainNamePascal}}Result(
{{domainName}}: unknown,
projectId: string,
): string {
const lines: string[] = [];
// Add main heading
lines.push(formatHeading("{{domainNamePascal}} Created Successfully", 1));
lines.push("");
// Add creation summary
lines.push(formatHeading("Creation Summary", 2));
const summary: Record<string, unknown> = {
"{{domainNamePascal}} ID": {{domainName}}.id || {{domainName}}.{{domainName}}_id,
"Name": {{domainName}}.name || {{domainName}}.title,
"Created At": formatDate(new Date()),
"Project ID": projectId,
};
lines.push(formatBulletList(summary));
lines.push("");
// Add created {{domainName}} details
lines.push(formatHeading("{{domainNamePascal}} Details", 2));
// TODO: Customize based on actual {{domainName}} properties
const details: Record<string, unknown> = {
"Description": {{domainName}}.description || "No description provided",
// Add more domain-specific fields here
};
lines.push(formatBulletList(details));
lines.push("");
// Add next steps
lines.push(formatHeading("Next Steps", 2));
const nextSteps = [
"Configure additional settings for your {{domainName}}",
"Add related resources or associations",
"Review and update {{domainName}} properties as needed",
];
for (const step of nextSteps) {
lines.push(`- ${step}`);
}
lines.push("");
// Add project context
const sections = [
{
path: `/{{apiEndpoint}}/${{{domainName}}.id}`,
label: "View {{domainNamePascal}} in Lokalise Dashboard",
},
];
lines.push(formatProjectContext(projectId, sections));
// Add footer
lines.push(formatFooter("{{domainNamePascal}} created"));
return lines.join("\n");
}
{{/if:create}}
{{#if:update}}
/**
* Format {{domainName}} update result into Markdown.
* @param {{domainName}} - The updated {{domainName}} data
* @param projectId - The project ID for context
* @returns Formatted Markdown string
*/
export function formatUpdate{{domainNamePascal}}Result(
{{domainName}}: unknown,
projectId: string,
): string {
const lines: string[] = [];
// Add main heading
lines.push(formatHeading("{{domainNamePascal}} Updated Successfully", 1));
lines.push("");
// Add update summary
lines.push(formatHeading("Update Summary", 2));
const summary: Record<string, unknown> = {
"{{domainNamePascal}} ID": {{domainName}}.id || {{domainName}}.{{domainName}}_id,
"Name": {{domainName}}.name || {{domainName}}.title,
"Updated At": formatDate(new Date()),
"Project ID": projectId,
};
lines.push(formatBulletList(summary));
lines.push("");
// Add updated fields
lines.push(formatHeading("Updated Information", 2));
// TODO: Show which fields were actually updated
const updatedInfo: Record<string, unknown> = {
"Description": {{domainName}}.description || "No description",
"Last Modified": {{domainName}}.updated_at ? formatDate(new Date({{domainName}}.updated_at)) : "Just now",
// Add more domain-specific fields here
};
lines.push(formatBulletList(updatedInfo));
lines.push("");
// Add project context
const sections = [
{
path: `/{{apiEndpoint}}/${{{domainName}}.id}`,
label: "View {{domainNamePascal}} in Lokalise Dashboard",
},
];
lines.push(formatProjectContext(projectId, sections));
// Add footer
lines.push(formatFooter("{{domainNamePascal}} updated"));
return lines.join("\n");
}
{{/if:update}}
{{#if:delete}}
/**
* Format {{domainName}} deletion result into Markdown.
* @param {{domainName}}Id - The ID of the deleted {{domainName}}
* @param projectId - The project ID for context
* @returns Formatted Markdown string
*/
export function formatDelete{{domainNamePascal}}Result(
{{domainName}}Id: number,
projectId: string,
): string {
const lines: string[] = [];
// Add main heading
lines.push(formatHeading("{{domainNamePascal}} Deleted Successfully", 1));
lines.push("");
// Add deletion details
lines.push(formatHeading("Deletion Details", 2));
const details: Record<string, unknown> = {
"Deleted {{domainNamePascal}} ID": {{domainName}}Id,
"Project ID": projectId,
"Deletion Time": formatDate(new Date()),
"Status": "Successfully removed",
};
lines.push(formatBulletList(details));
lines.push("");
// Add warning
lines.push(formatHeading("⚠️ Important", 2));
lines.push("- This action cannot be undone");
lines.push("- All associated data has been permanently removed");
lines.push("- Consider creating a backup before deleting {{domainName}} in the future");
lines.push("");
// Add project context
lines.push(formatProjectContext(projectId));
// Add footer
lines.push(formatFooter("{{domainNamePascal}} deleted"));
return lines.join("\n");
}
{{/if:delete}}
{{#if:bulkCreate}}
/**
* Format bulk {{domainName}} creation result into Markdown.
* @param result - The bulk creation result from API
* @param projectId - The project ID for context
* @returns Formatted Markdown string
*/
export function formatBulkCreate{{domainNamePascal}}Result(
result: unknown,
projectId: string,
): string {
const lines: string[] = [];
// Add main heading
lines.push(formatHeading("Bulk {{domainNamePascal}} Creation Result", 1));
lines.push("");
// Add summary
lines.push(formatHeading("Operation Summary", 2));
const successCount = result.items?.length || 0;
const errorCount = result.errors?.length || 0;
const totalRequested = successCount + errorCount;
const summary: Record<string, unknown> = {
"Total Requested": totalRequested,
"Successfully Created": successCount,
"Failed": errorCount,
"Success Rate": totalRequested > 0 ? `${Math.round((successCount / totalRequested) * 100)}%` : "N/A",
"Operation Time": formatDate(new Date()),
};
lines.push(formatBulletList(summary));
lines.push("");
// Show created {{domainName}}s if any
if (successCount > 0) {
lines.push(formatHeading(`Created {{domainNamePascal}} (${successCount})`, 2));
const tableData = result.items.slice(0, 10).map((item: unknown) => ({
id: item.id || item.{{domainName}}_id,
name: item.name || item.title || "Unnamed",
status: "✅ Created",
}));
const table = formatTable(tableData, [
{ key: "id", header: "ID" },
{ key: "name", header: "Name" },
{ key: "status", header: "Status" },
]);
lines.push(table);
if (successCount > 10) {
lines.push(`\n... and ${successCount - 10} more {{domainName}}s created successfully.`);
}
lines.push("");
}
// Show errors if any
if (errorCount > 0) {
lines.push(formatHeading(`Failed Operations (${errorCount})`, 2));
result.errors.slice(0, 5).forEach((error: unknown) => {
lines.push(`- **Error**: ${error.message || "Unknown error"}`);
if (error.key || error.name) {
lines.push(` - Item: ${error.key || error.name}`);
}
if (error.code) {
lines.push(` - Code: ${error.code}`);
}
});
if (errorCount > 5) {
lines.push(`\n... and ${errorCount - 5} more errors.`);
}
lines.push("");
}
// Add project context
lines.push(formatProjectContext(projectId));
// Add footer
lines.push(formatFooter("Bulk creation completed"));
return lines.join("\n");
}
{{/if:bulkCreate}}
{{#if:bulkUpdate}}
/**
* Format bulk {{domainName}} update result into Markdown.
* @param result - The bulk update result from API
* @param projectId - The project ID for context
* @returns Formatted Markdown string
*/
export function formatBulkUpdate{{domainNamePascal}}Result(
result: unknown,
projectId: string,
): string {
const lines: string[] = [];
// Add main heading
lines.push(formatHeading("Bulk {{domainNamePascal}} Update Result", 1));
lines.push("");
// Add summary
lines.push(formatHeading("Operation Summary", 2));
const successCount = result.items?.length || 0;
const errorCount = result.errors?.length || 0;
const totalRequested = successCount + errorCount;
const summary: Record<string, unknown> = {
"Total Requested": totalRequested,
"Successfully Updated": successCount,
"Failed": errorCount,
"Success Rate": totalRequested > 0 ? `${Math.round((successCount / totalRequested) * 100)}%` : "N/A",
"Operation Time": formatDate(new Date()),
};
lines.push(formatBulletList(summary));
lines.push("");
// Show updated {{domainName}}s if any
if (successCount > 0) {
lines.push(formatHeading(`Updated {{domainNamePascal}} (${successCount})`, 2));
const tableData = result.items.slice(0, 10).map((item: unknown) => ({
id: item.id || item.{{domainName}}_id,
name: item.name || item.title || "Unnamed",
status: "✅ Updated",
}));
const table = formatTable(tableData, [
{ key: "id", header: "ID" },
{ key: "name", header: "Name" },
{ key: "status", header: "Status" },
]);
lines.push(table);
if (successCount > 10) {
lines.push(`\n... and ${successCount - 10} more {{domainName}}s updated successfully.`);
}
lines.push("");
}
// Show errors if any
if (errorCount > 0) {
lines.push(formatHeading(`Failed Operations (${errorCount})`, 2));
result.errors.slice(0, 5).forEach((error: unknown) => {
lines.push(`- **Error**: ${error.message || "Unknown error"}`);
if (error.{{domainName}}_id) {
lines.push(` - {{domainNamePascal}} ID: ${error.{{domainName}}_id}`);
}
if (error.code) {
lines.push(` - Code: ${error.code}`);
}
});
if (errorCount > 5) {
lines.push(`\n... and ${errorCount - 5} more errors.`);
}
lines.push("");
}
// Add project context
lines.push(formatProjectContext(projectId));
// Add footer
lines.push(formatFooter("Bulk update completed"));
return lines.join("\n");
}
{{/if:bulkUpdate}}
{{#if:bulkDelete}}
/**
* Format bulk {{domainName}} deletion result into Markdown.
* @param result - The bulk deletion result from API
* @param projectId - The project ID for context
* @returns Formatted Markdown string
*/
export function formatBulkDelete{{domainNamePascal}}Result(
result: unknown,
projectId: string,
): string {
const lines: string[] = [];
// Add main heading
lines.push(formatHeading("Bulk {{domainNamePascal}} Deletion Result", 1));
lines.push("");
// Add summary
lines.push(formatHeading("Operation Summary", 2));
const deletedCount = result.deleted || result.{{domainName}}s_deleted || 0;
const requestedCount = result.requested || deletedCount;
const summary: Record<string, unknown> = {
"Total Requested": requestedCount,
"Successfully Deleted": deletedCount,
"Operation Time": formatDate(new Date()),
"Status": deletedCount === requestedCount ? "✅ All deleted successfully" : "⚠️ Partial success",
};
lines.push(formatBulletList(summary));
lines.push("");
// Add warning
lines.push(formatHeading("⚠️ Important", 2));
lines.push(`- ${deletedCount} {{domainName}}(s) have been permanently deleted`);
lines.push("- This action cannot be undone");
lines.push("- All associated data has been removed");
lines.push("");
// Add project context
lines.push(formatProjectContext(projectId));
// Add footer
lines.push(formatFooter("Bulk deletion completed"));
return lines.join("\n");
}
{{/if:bulkDelete}}
/**
* TODO: Add more formatting functions as needed
*
* Consider adding:
* - Error formatting helpers
* - Status badge formatters
* - Progress indicators
* - Relationship formatters
* - Custom domain-specific formatters
*/