mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-09-14 21:46:35 +00:00
feat: update tools types
This commit is contained in:
@@ -112,6 +112,8 @@ export const en: Dict = {
|
|||||||
},
|
},
|
||||||
errors: {
|
errors: {
|
||||||
noImageRun: "This tool does not process images",
|
noImageRun: "This tool does not process images",
|
||||||
|
sourceRequired: "Upload an image first",
|
||||||
|
textRequired: "Enter text first",
|
||||||
workerFailed: "Worker execution failed",
|
workerFailed: "Worker execution failed",
|
||||||
workerUnavailable: "Worker is unavailable",
|
workerUnavailable: "Worker is unavailable",
|
||||||
notFound: "Tool not found",
|
notFound: "Tool not found",
|
||||||
|
|||||||
@@ -113,6 +113,8 @@ export const ru: Dict = {
|
|||||||
},
|
},
|
||||||
errors: {
|
errors: {
|
||||||
noImageRun: "Этот инструмент не обрабатывает изображения",
|
noImageRun: "Этот инструмент не обрабатывает изображения",
|
||||||
|
sourceRequired: "Сначала загрузите изображение",
|
||||||
|
textRequired: "Сначала введите текст",
|
||||||
workerFailed: "Ошибка исполнения в воркере",
|
workerFailed: "Ошибка исполнения в воркере",
|
||||||
workerUnavailable: "Воркер недоступен",
|
workerUnavailable: "Воркер недоступен",
|
||||||
notFound: "Инструмент не найден",
|
notFound: "Инструмент не найден",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import type { CategoryId } from "../preview/categories";
|
|||||||
import type { ToolSchema } from "../registry-schema";
|
import type { ToolSchema } from "../registry-schema";
|
||||||
import type { PixelImage } from "../core/types";
|
import type { PixelImage } from "../core/types";
|
||||||
import type { OutputMime } from "../core/io";
|
import type { OutputMime } from "../core/io";
|
||||||
|
import { ToolError } from "../core/errors";
|
||||||
|
|
||||||
/** Формат скачивания, отличный от PNG (bmp/jpeg/webp). */
|
/** Формат скачивания, отличный от PNG (bmp/jpeg/webp). */
|
||||||
export interface OutputFormat {
|
export interface OutputFormat {
|
||||||
@@ -10,10 +11,37 @@ export interface OutputFormat {
|
|||||||
qualityParamId?: string;
|
qualityParamId?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Чем управляется инструмент. `image` — требуется входное изображение. */
|
||||||
|
export const INPUT_MODES = {
|
||||||
|
image: "image",
|
||||||
|
text: "text",
|
||||||
|
none: "none",
|
||||||
|
} as const;
|
||||||
|
export type InputMode = (typeof INPUT_MODES)[keyof typeof INPUT_MODES];
|
||||||
|
|
||||||
|
/** Тип результата: картинка (по умолчанию), большой текст или короткий вердикт. */
|
||||||
|
export const RESULT_KINDS = {
|
||||||
|
image: "image",
|
||||||
|
text: "text",
|
||||||
|
verdict: "verdict",
|
||||||
|
} as const;
|
||||||
|
export type ResultKind = (typeof RESULT_KINDS)[keyof typeof RESULT_KINDS];
|
||||||
|
|
||||||
|
/** Единый вход инструмента. `source`/`text` присутствуют строго по `input`. */
|
||||||
|
export interface ToolContext<P> {
|
||||||
|
params: P;
|
||||||
|
source?: PixelImage;
|
||||||
|
text?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ToolResult = PixelImage | string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Инструмент нового registry: полностью типизирован на `Params`, схема —
|
* Инструмент нового registry: полностью типизирован на `Params`, схема —
|
||||||
* обязательна (единый источник дефолтов/валидации/UI). Старого `ParamDef[]`
|
* обязательна (единый источник дефолтов/валидации/UI). У каждого инструмента
|
||||||
* нет — это отдельная система от старого UI.
|
* ровно один метод `run(ctx)`; контракт входа декларируется через `input`
|
||||||
|
* (обязательное поле), а результат — через `result`. Отдельных методов
|
||||||
|
* `generate`/`runFromText`/`toText`/`textToText` нет.
|
||||||
*/
|
*/
|
||||||
export type ToolEntry<P = Record<string, unknown>> = {
|
export type ToolEntry<P = Record<string, unknown>> = {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -21,20 +49,55 @@ export type ToolEntry<P = Record<string, unknown>> = {
|
|||||||
description: string;
|
description: string;
|
||||||
category: CategoryId;
|
category: CategoryId;
|
||||||
schema: ToolSchema<P>;
|
schema: ToolSchema<P>;
|
||||||
|
/** Чем управляется инструмент: входным изображением, текстом или ничем. */
|
||||||
|
input: InputMode;
|
||||||
|
/** Тип результата: картинка (по умолчанию), большой текст или короткий вердикт. */
|
||||||
|
result?: ResultKind;
|
||||||
|
/** Единственный метод исполнения — и для генераторов, и для трансформаторов. */
|
||||||
|
run(ctx: ToolContext<P>): Promise<ToolResult> | ToolResult;
|
||||||
/** Требует DOM (canvas/document); превью-executor запускает напрямую, не в worker. */
|
/** Требует DOM (canvas/document); превью-executor запускает напрямую, не в worker. */
|
||||||
domOnly?: boolean;
|
domOnly?: boolean;
|
||||||
/** Чем управляется инструмент: файлом (по умолчанию), текстом или ничем (генератор). */
|
|
||||||
input?: "file" | "text" | "none";
|
|
||||||
/** Тип результата: картинка (по умолчанию), большой текст или короткий вердикт. */
|
|
||||||
result?: "image" | "text" | "verdict";
|
|
||||||
/** Применение к входному изображению. Для чистых генераторов отсутствует. */
|
|
||||||
run?(img: PixelImage, params: P): Promise<PixelImage> | PixelImage;
|
|
||||||
generate?(params: P): Promise<PixelImage> | PixelImage;
|
|
||||||
toText?(img: PixelImage, params: P): Promise<string> | string;
|
|
||||||
runFromText?(text: string, params: P): Promise<PixelImage> | PixelImage;
|
|
||||||
textToText?(text: string): Promise<string> | string;
|
|
||||||
preview?(img: PixelImage, params: P): Promise<PixelImage> | PixelImage;
|
|
||||||
/** Формат/качество скачивания результата; по умолчанию — PNG. */
|
/** Формат/качество скачивания результата; по умолчанию — PNG. */
|
||||||
output?: OutputFormat;
|
output?: OutputFormat;
|
||||||
icon?: string;
|
icon?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Гарантирует наличие входного изображения для трансформаторов. */
|
||||||
|
export function requireSource<P>(ctx: ToolContext<P>): PixelImage {
|
||||||
|
if (!ctx.source) {
|
||||||
|
throw new ToolError("errors.sourceRequired");
|
||||||
|
}
|
||||||
|
return ctx.source;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Гарантирует наличие текстового входа для text-инструментов. */
|
||||||
|
export function requireText<P>(ctx: ToolContext<P>): string {
|
||||||
|
if (!ctx.text?.trim()) {
|
||||||
|
throw new ToolError("errors.textRequired");
|
||||||
|
}
|
||||||
|
return ctx.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Обёртка для image-to-image инструментов: подставляет `src` и `params`
|
||||||
|
* из контекста. Позволяет оставить тело инструмента в виде `(img, p) => …`.
|
||||||
|
*/
|
||||||
|
export function imgTool<P>(
|
||||||
|
fn: (img: PixelImage, params: P) => ToolResult,
|
||||||
|
): (ctx: ToolContext<P>) => ToolResult {
|
||||||
|
return (ctx) => fn(requireSource(ctx), ctx.params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Обёртка для генераторов: инструменту нужны только параметры. */
|
||||||
|
export function genTool<P>(
|
||||||
|
fn: (params: P) => ToolResult,
|
||||||
|
): (ctx: ToolContext<P>) => ToolResult {
|
||||||
|
return (ctx) => fn(ctx.params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Обёртка для text-to-image инструментов: подставляет `text` и `params`. */
|
||||||
|
export function textGen<P>(
|
||||||
|
fn: (text: string, params: P) => ToolResult,
|
||||||
|
): (ctx: ToolContext<P>) => ToolResult {
|
||||||
|
return (ctx) => fn(requireText(ctx), ctx.params);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user