Merge branch 'main' into fix/telegram-thread-id-message-tool

This commit is contained in:
Taras Lukavyi 2026-01-28 15:37:49 +01:00 committed by GitHub
commit 55971de6b9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 53 additions and 1 deletions

View File

@ -168,6 +168,11 @@ const entries: SubCliEntry[] = [
name: "pairing", name: "pairing",
description: "Pairing helpers", description: "Pairing helpers",
register: async (program) => { register: async (program) => {
// Initialize plugins before registering pairing CLI.
// The pairing CLI calls listPairingChannels() at registration time,
// which requires the plugin registry to be populated with channel plugins.
const { registerPluginCliCommands } = await import("../../plugins/cli.js");
registerPluginCliCommands(program, await loadConfig());
const mod = await import("../pairing-cli.js"); const mod = await import("../pairing-cli.js");
mod.registerPairingCli(program); mod.registerPairingCli(program);
}, },

View File

@ -1,7 +1,7 @@
import JSZip from "jszip"; import JSZip from "jszip";
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import { detectMime, imageMimeFromFormat } from "./mime.js"; import { detectMime, extensionForMime, imageMimeFromFormat } from "./mime.js";
async function makeOoxmlZip(opts: { mainMime: string; partPath: string }): Promise<Buffer> { async function makeOoxmlZip(opts: { mainMime: string; partPath: string }): Promise<Buffer> {
const zip = new JSZip(); const zip = new JSZip();
@ -53,3 +53,47 @@ describe("mime detection", () => {
expect(mime).toBe("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); expect(mime).toBe("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}); });
}); });
describe("extensionForMime", () => {
it("maps image MIME types to extensions", () => {
expect(extensionForMime("image/jpeg")).toBe(".jpg");
expect(extensionForMime("image/png")).toBe(".png");
expect(extensionForMime("image/webp")).toBe(".webp");
expect(extensionForMime("image/gif")).toBe(".gif");
expect(extensionForMime("image/heic")).toBe(".heic");
});
it("maps audio MIME types to extensions", () => {
expect(extensionForMime("audio/mpeg")).toBe(".mp3");
expect(extensionForMime("audio/ogg")).toBe(".ogg");
expect(extensionForMime("audio/x-m4a")).toBe(".m4a");
expect(extensionForMime("audio/mp4")).toBe(".m4a");
});
it("maps video MIME types to extensions", () => {
expect(extensionForMime("video/mp4")).toBe(".mp4");
expect(extensionForMime("video/quicktime")).toBe(".mov");
});
it("maps document MIME types to extensions", () => {
expect(extensionForMime("application/pdf")).toBe(".pdf");
expect(extensionForMime("text/plain")).toBe(".txt");
expect(extensionForMime("text/markdown")).toBe(".md");
});
it("handles case insensitivity", () => {
expect(extensionForMime("IMAGE/JPEG")).toBe(".jpg");
expect(extensionForMime("Audio/X-M4A")).toBe(".m4a");
expect(extensionForMime("Video/QuickTime")).toBe(".mov");
});
it("returns undefined for unknown MIME types", () => {
expect(extensionForMime("video/unknown")).toBeUndefined();
expect(extensionForMime("application/x-custom")).toBeUndefined();
});
it("returns undefined for null or undefined input", () => {
expect(extensionForMime(null)).toBeUndefined();
expect(extensionForMime(undefined)).toBeUndefined();
});
});

View File

@ -13,7 +13,10 @@ const EXT_BY_MIME: Record<string, string> = {
"image/gif": ".gif", "image/gif": ".gif",
"audio/ogg": ".ogg", "audio/ogg": ".ogg",
"audio/mpeg": ".mp3", "audio/mpeg": ".mp3",
"audio/x-m4a": ".m4a",
"audio/mp4": ".m4a",
"video/mp4": ".mp4", "video/mp4": ".mp4",
"video/quicktime": ".mov",
"application/pdf": ".pdf", "application/pdf": ".pdf",
"application/json": ".json", "application/json": ".json",
"application/zip": ".zip", "application/zip": ".zip",