diff --git a/src/lib/util.ts b/src/lib/util.ts new file mode 100644 index 0000000..9f277e0 --- /dev/null +++ b/src/lib/util.ts @@ -0,0 +1,37 @@ +export const DEFAULT_BASE_URL = "http://localhost:9292"; + +export interface CfgSettings { + baseUrl?: string; + apiKey?: string; +} + +export interface LlamaSwapConfig { + baseUrl: string; + apiKey?: string; +} + +export function cfgFromSettings(settings: CfgSettings): LlamaSwapConfig { + return { + baseUrl: normalizeBaseUrl(settings.baseUrl ?? DEFAULT_BASE_URL), + apiKey: settings.apiKey || undefined, + }; +} + +export function normalizeBaseUrl(baseUrl: string): string { + return baseUrl.trim().replace(/\/+$/, ""); +} + +export function shorten(name: string, max = 14): string { + if (name.length <= max) return name; + const head = Math.floor((max - 1) * 0.7); + return `${name.slice(0, head)}…${name.slice(name.length - (max - head - 1))}`; +} + +export function escapeXml(text: string): string { + return text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} diff --git a/tests/util.test.ts b/tests/util.test.ts new file mode 100644 index 0000000..61003e6 --- /dev/null +++ b/tests/util.test.ts @@ -0,0 +1,32 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { + cfgFromSettings, + escapeXml, + normalizeBaseUrl, + shorten, +} from "../src/lib/util"; + +test("normalizeBaseUrl strips trailing slashes", () => { + assert.equal(normalizeBaseUrl("http://localhost:9292/"), "http://localhost:9292"); + assert.equal(normalizeBaseUrl("http://localhost:9292"), "http://localhost:9292"); +}); + +test("cfgFromSettings defaults baseUrl and omits empty apiKey", () => { + const cfg = cfgFromSettings({}); + assert.equal(cfg.baseUrl, "http://localhost:9292"); + assert.equal(cfg.apiKey, undefined); + assert.deepEqual(cfgFromSettings({ baseUrl: "http://x/", apiKey: "abc" }), { + baseUrl: "http://x", + apiKey: "abc", + }); +}); + +test("shorten keeps short names and truncates long ones", () => { + assert.equal(shorten("Qwen3.8-27B"), "Qwen3.8-27B"); + assert.equal(shorten("DeepSeek-V4-Flash-0731"), "DeepSeek-…0731"); +}); + +test("escapeXml escapes XML special characters", () => { + assert.equal(escapeXml(`A&B "D" 'E'`), "A&B <C> "D" 'E'"); +});