import { FetchRepositoryBase } from "../../../shared/index.js"; import type { CreateTemplateParams, CreateTemplateResponse, ListCSSResponse, ListCustomSnippetsResponse, ListJSResponse, ListLayoutsResponse, ListSnippetsResponse, SaveTemplateRequest, SaveTemplateResponse, TemplateListType, TemplateResponse, TemplateSummary, UnpublishTemplateRequest, UpdateTemplateParams, UpdateTemplateResponse } from "./TemplatesTypes.js"; export declare class TemplatesRepository extends FetchRepositoryBase { /** * Endpoints de listado por tipo, en el orden en que se concatenan. * * `category` es la que corresponde al endpoint que devolvió el item: es un dato del origen, no * una inferencia sobre la ruta. */ private static readonly LIST_ENDPOINTS; /** * Lista los templates de un solo tipo desde su endpoint dedicado. * * Los cinco endpoints devuelven un array plano con `{id, uuid, name, path, type, status, * deletable, group}`. Se tolera además la forma `{ : [...] }` por si alguna versión de la * plataforma la envuelve. */ listTemplatesByType(siteId: number, listType: TemplateListType): Promise; /** * Lista el endpoint genérico `GET /sites/{id}/templates`. * * Fuente **complementaria**, nunca única. En sitios recién creados devuelve cero aunque el sitio * tenga sus templates (verificado: el sitio 5031 de `un.modyo.cloud` devuelve 0 aquí y 32 por los * endpoints de tipo). Pero es la única que incluye los templates de error y de contenido * —`site/errors/*`, `site/base/show`, `site/search/show`—, que no tienen endpoint dedicado: los * cinco candidatos (`/errors`, `/home`, `/category`, `/entry` y sus plurales) responden 404. * * No se pagina: esta versión de la API ignora `page` y `per_page` y no devuelve `meta`, así que * una sola llamada trae todo lo que el endpoint conoce. */ private listGenericTemplates; /** * Categoría derivada de la ruta, solo para los items que únicamente aparecen en el listado * genérico. Los que vienen de un endpoint dedicado toman su categoría del endpoint, que es un * dato del origen y no una inferencia. */ private static categorizeByPath; /** * Fetches all templates, uniendo los cinco endpoints por tipo con el listado genérico. * * Ninguna de las dos fuentes basta por sí sola: * * - El **genérico** devuelve cero en sitios recién creados. En el sitio 5031 de `un.modyo.cloud` * devuelve 0 mientras los endpoints de tipo devuelven 32, y ese cero es indistinguible de un * sitio vacío de verdad. Ver la issue #231. * - Los **endpoints por tipo** no cubren los templates de error ni los de contenido. En el sitio * 4824, donde el genérico sí funciona, devuelven 31 frente a 36: faltan `site/errors/404`, * `site/errors/disabled`, `site/errors/template`, `site/base/show` y `site/search/show`. * * La unión evita las dos pérdidas: 36 en 4824 y 32 en 5031. Queda una limitación conocida, que * ninguna de las dos fuentes puede salvar: en un sitio donde el genérico devuelve vacío, esos * cinco templates no se pueden enumerar. Por eso ninguna tool afirma `complete` sobre este * corpus. * * El genérico es best-effort: si falla, se devuelve lo que dieron los endpoints de tipo en vez de * perder también eso. La pérdida queda en el log de depuración. * * @param siteId - The ID of the site * @returns Promise resolving to the union of both sources, deduplicated by id */ getAllTemplates(siteId: number): Promise; /** * Fetches all templates with full body content. * Used by the download tool to get full template content. * * The list endpoints return templates without body. This method * fetches the list first, then retrieves each template individually * to get the body content. Uses parallel batches for performance. * * Note: Individual GET requests create temporary editing locks that * expire automatically. This is acceptable for read-only operations. * * @param siteId - The ID of the site * @returns Promise resolving to array of all templates including body */ getAllTemplatesWithBody(siteId: number): Promise; getSnippets(siteId: number): Promise; getCustomSnippets(siteId: number): Promise; getCSSTemplates(siteId: number): Promise; getJSTemplates(siteId: number): Promise; getLayouts(siteId: number): Promise; createTemplate(siteId: number, data: CreateTemplateParams): Promise; getTemplate(siteId: number, templateId: number): Promise; updateTemplate(siteId: number, templateId: number, data: UpdateTemplateParams): Promise; deleteTemplate(siteId: number, templateId: number): Promise; saveTemplate(siteId: number, templateId: number, data: SaveTemplateRequest): Promise; /** * Releases the editing lock on a template. * Uses DELETE /locks/release with lockable_type and lockable_id. * Call this after all template operations (save + get) are complete. * Errors are silently ignored since lock release is not critical. */ releaseTemplateLock(templateId: number): Promise; unpublishTemplate(siteId: number, templateId: number, data?: UnpublishTemplateRequest): Promise; /** * Normalize literal \n and \t sequences that LLMs sometimes send as two characters * (backslash + n) instead of real newline characters. Only transform if the body * has no real newlines but contains literal \n sequences, to avoid double-replacement. */ private normalizeLiteralEscapes; /** * Find a template by name, optionally restricted to one category's endpoint. * * Con `listType` consulta solo el endpoint de ese tipo; sin él, los cinco. En ningún caso pasa * por `GET /sites/{id}/templates`, que devuelve cero en sitios nuevos (#231). * * Returns the first exact match or null if not found. */ findTemplateByName(siteId: number, name: string, listType?: TemplateListType): Promise; /** * Find a template by UUID. El UUID es estable entre publicaciones, a diferencia del id. */ findTemplateByUuid(siteId: number, uuid: string): Promise; /** * Find a template by numeric id without fetching it individually. * * `getTemplate` crea un lock de edición que bloquea el `/save` posterior, así que las escrituras * resuelven por listado. Antes esto iba contra el endpoint genérico y fallaba con * `Template not found with ID` sobre templates que la lectura sí devolvía (#231). */ findTemplateById(siteId: number, id: number): Promise; /** * Find a template by name and return full template data including body. * Uses optimized server-side filtering then fetches full details. * Returns null if not found. */ findTemplateByNameWithBody(siteId: number, name: string, listType?: TemplateListType): Promise; } //# sourceMappingURL=TemplatesRepository.d.ts.map