feat: pipeline templates, analytics opt-out, 83 conversion presets, positioning + e2e modernization

Lands five integrated branches: pipeline templates (#355), analytics opt-out (#354), 83 conversion presets bringing the catalog to 240 tools (#356), self-hosted positioning (#353), and e2e modernization (#351).

Integration fixes: aligned stale web analytics tests with the opt-out/allow-list model, closed 3 CodeQL incomplete-sanitization alerts in the i18n generator, resolved settings/index/docs/format-matrix conflicts, and corrected tool counts to 240.
This commit is contained in:
SnapOtter
2026-06-28 18:57:53 +08:00
committed by GitHub
parent 88af8d46fb
commit 63a03d26f2
421 changed files with 17308 additions and 2540 deletions
+16 -2
View File
@@ -1,3 +1,4 @@
import { expandConversionPresets } from "./conversion-presets.js";
import { AUDIO_INPUTS, IMAGE_INPUTS, SUBTITLE_INPUTS, VIDEO_INPUTS } from "./modality.js";
import { toolSection } from "./section.js";
import type { CategoryInfo, SocialMediaPreset, Tool } from "./types.js";
@@ -34,7 +35,7 @@ export const CATEGORIES: CategoryInfo[] = [
{ id: "archives", name: "Archives", icon: "FolderArchive", color: "#6366F1" },
];
export const TOOLS: Tool[] = [
const BASE_TOOLS: Tool[] = [
// Essentials
{
id: "resize",
@@ -78,6 +79,14 @@ export const TOOLS: Tool[] = [
route: "/convert",
modality: "image",
acceptedInputs: IMAGE_INPUTS,
keywords: [
"image converter",
"jpg to png",
"png to jpg",
"heic to jpg",
"webp to png",
"convert image format",
],
executionHint: "fast",
},
{
@@ -241,7 +250,7 @@ export const TOOLS: Tool[] = [
},
{
id: "ocr",
name: "OCR / Text Extraction",
name: "Extract Text from Image (OCR)",
description: "Extract text from images",
category: "doc-convert",
icon: "ScanText",
@@ -809,6 +818,7 @@ export const TOOLS: Tool[] = [
route: "/convert-video",
modality: "video",
acceptedInputs: VIDEO_INPUTS,
keywords: ["video converter", "mov to mp4", "mkv to mp4", "avi to mp4", "webm to mp4"],
executionHint: "long",
},
{
@@ -1111,6 +1121,7 @@ export const TOOLS: Tool[] = [
route: "/convert-audio",
modality: "audio",
acceptedInputs: AUDIO_INPUTS,
keywords: ["audio converter", "m4a to mp3", "aac to mp3", "wav to mp3", "ogg to mp3"],
executionHint: "fast",
},
{
@@ -1368,6 +1379,7 @@ export const TOOLS: Tool[] = [
route: "/convert-spreadsheet",
modality: "document",
acceptedInputs: [".xlsx", ".xls", ".ods", ".csv"],
keywords: ["excel to csv", "xlsx to csv", "spreadsheet converter"],
executionHint: "long",
},
{
@@ -1798,6 +1810,8 @@ export const TOOLS: Tool[] = [
},
];
export const TOOLS: Tool[] = [...BASE_TOOLS, ...expandConversionPresets(BASE_TOOLS)];
for (const tool of TOOLS) {
const slug = `/${toolSection(tool)}`;
if (!tool.route.startsWith(`${slug}/`)) {