refactor: share allowFrom formatter scaffolding

This commit is contained in:
Peter Steinberger
2026-03-07 23:00:03 +00:00
parent c91bfa830a
commit feac26c3b7
13 changed files with 94 additions and 48 deletions

View File

@@ -1,5 +1,10 @@
import { describe, expect, it } from "vitest";
import { isAllowedParsedChatSender, isNormalizedSenderAllowed } from "./allow-from.js";
import {
formatAllowFromLowercase,
formatNormalizedAllowFromEntries,
isAllowedParsedChatSender,
isNormalizedSenderAllowed,
} from "./allow-from.js";
function parseAllowTarget(
entry: string,
@@ -102,3 +107,34 @@ describe("isNormalizedSenderAllowed", () => {
).toBe(false);
});
});
describe("formatAllowFromLowercase", () => {
it("trims, strips prefixes, and lowercases entries", () => {
expect(
formatAllowFromLowercase({
allowFrom: [" Telegram:UserA ", "tg:UserB", " "],
stripPrefixRe: /^(telegram|tg):/i,
}),
).toEqual(["usera", "userb"]);
});
});
describe("formatNormalizedAllowFromEntries", () => {
it("applies custom normalization after trimming", () => {
expect(
formatNormalizedAllowFromEntries({
allowFrom: [" @Alice ", "", " @Bob "],
normalizeEntry: (entry) => entry.replace(/^@/, "").toLowerCase(),
}),
).toEqual(["alice", "bob"]);
});
it("filters empty normalized entries", () => {
expect(
formatNormalizedAllowFromEntries({
allowFrom: ["@", "valid"],
normalizeEntry: (entry) => entry.replace(/^@$/, ""),
}),
).toEqual(["valid"]);
});
});

View File

@@ -9,6 +9,17 @@ export function formatAllowFromLowercase(params: {
.map((entry) => entry.toLowerCase());
}
export function formatNormalizedAllowFromEntries(params: {
allowFrom: Array<string | number>;
normalizeEntry: (entry: string) => string | undefined | null;
}): string[] {
return params.allowFrom
.map((entry) => String(entry).trim())
.filter(Boolean)
.map((entry) => params.normalizeEntry(entry))
.filter((entry): entry is string => Boolean(entry));
}
export function isNormalizedSenderAllowed(params: {
senderId: string | number;
allowFrom: Array<string | number>;

View File

@@ -274,6 +274,7 @@ export {
} from "../routing/session-key.js";
export {
formatAllowFromLowercase,
formatNormalizedAllowFromEntries,
isAllowedParsedChatSender,
isNormalizedSenderAllowed,
} from "./allow-from.js";