release: prepare v2.0.55 metadata preview

Publish pre-download metadata resolution for 1Fichier and DDownload together with the rebuilt package-oriented link collector. Restore structured queue JSON imports and direct Ctrl+L/File-menu access to link analysis before creating release artifacts.
This commit is contained in:
Sucukdeluxe
2026-08-22 03:03:19 +02:00
parent b03f6ee1bc
commit 6a8a3828b8
5 changed files with 110 additions and 17 deletions
+38 -1
View File
@@ -5,7 +5,7 @@ import { AvatarMenu, getAvatarMenuKeyboardAction } from "../src/renderer/shell/A
import { AppHeader } from "../src/renderer/shell/AppHeader";
import { AppShell } from "../src/renderer/shell/AppShell";
import { buildMainNavigation } from "../src/renderer/shell/shell-model";
import { getSnapshotRenderDelay } from "../src/renderer/App";
import { classifyCollectorImportFileName, getSnapshotRenderDelay, readCollectorImportFiles } from "../src/renderer/App";
describe("desktop shell", () => {
it("uses keyboard-focusable controls for every copy target", () => {
@@ -37,6 +37,43 @@ describe("desktop shell", () => {
expect(removal).toContain('title: "Ausgewählte Links löschen"');
});
it("routes exported queue JSON back through the queue importer while text files stay in the collector", async () => {
expect(classifyCollectorImportFileName("queue.json")).toBe("queue");
expect(classifyCollectorImportFileName("LINKS.TXT")).toBe("links");
expect(classifyCollectorImportFileName("archive.zip")).toBe("unsupported");
const files = await readCollectorImportFiles([
{ name: "queue.json", text: async () => '{"version":1,"packages":[]}' },
{ name: "links.txt", text: async () => "https://example.test/file" },
{ name: "ignored.zip", text: async () => "not-read" }
]);
expect(files).toEqual({
queueJson: ['{"version":1,"packages":[]}'],
linkText: "https://example.test/file"
});
const source = readFileSync(new URL("../src/renderer/App.tsx", import.meta.url), "utf8");
const picker = source.slice(source.indexOf("const onImportQueue ="), source.indexOf("const setBool ="));
const drop = source.slice(source.indexOf("const onDrop ="), source.indexOf("const onExportQueue ="));
expect(picker).toContain("readCollectorImportFiles([file])");
expect(picker).toContain("importQueueJsonTexts(queueJson)");
expect(drop).toContain("readCollectorImportFiles(importFiles)");
expect(drop).toContain("importQueueJsonTexts(queueJson)");
});
it("opens the link analysis dialog from Ctrl+L and the File menu", () => {
const source = readFileSync(new URL("../src/renderer/App.tsx", import.meta.url), "utf8");
const shortcutStart = source.indexOf('e.key.toLowerCase() === "l"');
const shortcut = source.slice(shortcutStart, source.indexOf('e.key.toLowerCase() === "p"', shortcutStart));
const menuStart = source.indexOf("Text mit Links analysieren");
const menu = source.slice(source.lastIndexOf("<button", menuStart), source.indexOf("</button>", menuStart));
expect(shortcut).toContain("openCollectorInput()");
expect(shortcut).not.toContain('setTab("collector")');
expect(menu).toContain("openCollectorInput()");
});
it("places the delete confirmation opt-out below the right-aligned actions", () => {
const source = readFileSync(new URL("../src/renderer/views/downloads/DeleteConfirmationDialog.tsx", import.meta.url), "utf8");
const css = readFileSync(new URL("../src/renderer/styles.css", import.meta.url), "utf8");