chore: Enable "curly" rule to avoid single-statement if confusion/errors.

This commit is contained in:
cpojer
2026-01-31 16:19:20 +09:00
parent 009b16fab8
commit 5ceff756e1
1266 changed files with 27871 additions and 9393 deletions

View File

@@ -53,16 +53,24 @@ const UUID_COMPACT_RE = /^[0-9a-f]{32}$/i;
const SLACK_CHANNEL_TYPE_CACHE = new Map<string, "channel" | "group" | "dm" | "unknown">();
function looksLikeUuid(value: string): boolean {
if (UUID_RE.test(value) || UUID_COMPACT_RE.test(value)) return true;
if (UUID_RE.test(value) || UUID_COMPACT_RE.test(value)) {
return true;
}
const compact = value.replace(/-/g, "");
if (!/^[0-9a-f]+$/i.test(compact)) return false;
if (!/^[0-9a-f]+$/i.test(compact)) {
return false;
}
return /[a-f]/i.test(compact);
}
function normalizeThreadId(value?: string | number | null): string | undefined {
if (value == null) return undefined;
if (value == null) {
return undefined;
}
if (typeof value === "number") {
if (!Number.isFinite(value)) return undefined;
if (!Number.isFinite(value)) {
return undefined;
}
return String(Math.trunc(value));
}
const trimmed = value.trim();
@@ -73,7 +81,9 @@ function stripProviderPrefix(raw: string, channel: string): string {
const trimmed = raw.trim();
const lower = trimmed.toLowerCase();
const prefix = `${channel.toLowerCase()}:`;
if (lower.startsWith(prefix)) return trimmed.slice(prefix.length).trim();
if (lower.startsWith(prefix)) {
return trimmed.slice(prefix.length).trim();
}
return trimmed;
}
@@ -86,14 +96,20 @@ function inferPeerKind(params: {
resolvedTarget?: ResolvedMessagingTarget;
}): RoutePeerKind {
const resolvedKind = params.resolvedTarget?.kind;
if (resolvedKind === "user") return "dm";
if (resolvedKind === "channel") return "channel";
if (resolvedKind === "user") {
return "dm";
}
if (resolvedKind === "channel") {
return "channel";
}
if (resolvedKind === "group") {
const plugin = getChannelPlugin(params.channel);
const chatTypes = plugin?.capabilities?.chatTypes ?? [];
const supportsChannel = chatTypes.includes("channel");
const supportsGroup = chatTypes.includes("group");
if (supportsChannel && !supportsGroup) return "channel";
if (supportsChannel && !supportsGroup) {
return "channel";
}
return "group";
}
return "dm";
@@ -123,9 +139,13 @@ async function resolveSlackChannelType(params: {
channelId: string;
}): Promise<"channel" | "group" | "dm" | "unknown"> {
const channelId = params.channelId.trim();
if (!channelId) return "unknown";
if (!channelId) {
return "unknown";
}
const cached = SLACK_CHANNEL_TYPE_CACHE.get(`${params.accountId ?? "default"}:${channelId}`);
if (cached) return cached;
if (cached) {
return cached;
}
const account = resolveSlackAccount({ cfg: params.cfg, accountId: params.accountId });
const groupChannels = normalizeAllowListLower(account.dm?.groupChannels);
@@ -181,7 +201,9 @@ async function resolveSlackSession(
params: ResolveOutboundSessionRouteParams,
): Promise<OutboundSessionRoute | null> {
const parsed = parseSlackTarget(params.target, { defaultKind: "channel" });
if (!parsed) return null;
if (!parsed) {
return null;
}
const isDm = parsed.kind === "user";
let peerKind: RoutePeerKind = isDm ? "dm" : "channel";
if (!isDm && /^G/i.test(parsed.id)) {
@@ -191,8 +213,12 @@ async function resolveSlackSession(
accountId: params.accountId,
channelId: parsed.id,
});
if (channelType === "group") peerKind = "group";
if (channelType === "dm") peerKind = "dm";
if (channelType === "group") {
peerKind = "group";
}
if (channelType === "dm") {
peerKind = "dm";
}
}
const peer: RoutePeer = {
kind: peerKind,
@@ -230,7 +256,9 @@ function resolveDiscordSession(
params: ResolveOutboundSessionRouteParams,
): OutboundSessionRoute | null {
const parsed = parseDiscordTarget(params.target, { defaultKind: "channel" });
if (!parsed) return null;
if (!parsed) {
return null;
}
const isDm = parsed.kind === "user";
const peer: RoutePeer = {
kind: isDm ? "dm" : "channel",
@@ -267,7 +295,9 @@ function resolveTelegramSession(
): OutboundSessionRoute | null {
const parsed = parseTelegramTarget(params.target);
const chatId = parsed.chatId.trim();
if (!chatId) return null;
if (!chatId) {
return null;
}
const parsedThreadId = parsed.messageThreadId;
const fallbackThreadId = normalizeThreadId(params.threadId);
const resolvedThreadId =
@@ -307,7 +337,9 @@ function resolveWhatsAppSession(
params: ResolveOutboundSessionRouteParams,
): OutboundSessionRoute | null {
const normalized = normalizeWhatsAppTarget(params.target);
if (!normalized) return null;
if (!normalized) {
return null;
}
const isGroup = isWhatsAppGroupJid(normalized);
const peer: RoutePeer = {
kind: isGroup ? "group" : "dm",
@@ -337,7 +369,9 @@ function resolveSignalSession(
const lowered = stripped.toLowerCase();
if (lowered.startsWith("group:")) {
const groupId = stripped.slice("group:".length).trim();
if (!groupId) return null;
if (!groupId) {
return null;
}
const peer: RoutePeer = { kind: "group", id: groupId };
const baseSessionKey = buildBaseSessionKey({
cfg: params.cfg,
@@ -362,7 +396,9 @@ function resolveSignalSession(
} else if (lowered.startsWith("u:")) {
recipient = stripped.slice("u:".length).trim();
}
if (!recipient) return null;
if (!recipient) {
return null;
}
const uuidCandidate = recipient.toLowerCase().startsWith("uuid:")
? recipient.slice("uuid:".length)
@@ -397,7 +433,9 @@ function resolveIMessageSession(
const parsed = parseIMessageTarget(params.target);
if (parsed.kind === "handle") {
const handle = normalizeIMessageHandle(parsed.to);
if (!handle) return null;
if (!handle) {
return null;
}
const peer: RoutePeer = { kind: "dm", id: handle };
const baseSessionKey = buildBaseSessionKey({
cfg: params.cfg,
@@ -422,7 +460,9 @@ function resolveIMessageSession(
: parsed.kind === "chat_guid"
? parsed.chatGuid
: parsed.chatIdentifier;
if (!peerId) return null;
if (!peerId) {
return null;
}
const peer: RoutePeer = { kind: "group", id: peerId };
const baseSessionKey = buildBaseSessionKey({
cfg: params.cfg,
@@ -454,7 +494,9 @@ function resolveMatrixSession(
const isUser =
params.resolvedTarget?.kind === "user" || stripped.startsWith("@") || /^user:/i.test(stripped);
const rawId = stripKindPrefix(stripped);
if (!rawId) return null;
if (!rawId) {
return null;
}
const peer: RoutePeer = { kind: isUser ? "dm" : "channel", id: rawId };
const baseSessionKey = buildBaseSessionKey({
cfg: params.cfg,
@@ -477,13 +519,17 @@ function resolveMSTeamsSession(
params: ResolveOutboundSessionRouteParams,
): OutboundSessionRoute | null {
let trimmed = params.target.trim();
if (!trimmed) return null;
if (!trimmed) {
return null;
}
trimmed = trimmed.replace(/^(msteams|teams):/i, "").trim();
const lower = trimmed.toLowerCase();
const isUser = lower.startsWith("user:");
const rawId = stripKindPrefix(trimmed);
if (!rawId) return null;
if (!rawId) {
return null;
}
const conversationId = rawId.split(";")[0] ?? rawId;
const isChannel = !isUser && /@thread\.tacv2/i.test(conversationId);
const peer: RoutePeer = {
@@ -515,7 +561,9 @@ function resolveMattermostSession(
params: ResolveOutboundSessionRouteParams,
): OutboundSessionRoute | null {
let trimmed = params.target.trim();
if (!trimmed) return null;
if (!trimmed) {
return null;
}
trimmed = trimmed.replace(/^mattermost:/i, "").trim();
const lower = trimmed.toLowerCase();
const isUser = lower.startsWith("user:") || trimmed.startsWith("@");
@@ -523,7 +571,9 @@ function resolveMattermostSession(
trimmed = trimmed.slice(1).trim();
}
const rawId = stripKindPrefix(trimmed);
if (!rawId) return null;
if (!rawId) {
return null;
}
const peer: RoutePeer = { kind: isUser ? "dm" : "channel", id: rawId };
const baseSessionKey = buildBaseSessionKey({
cfg: params.cfg,
@@ -565,7 +615,9 @@ function resolveBlueBubblesSession(
const peerId = isGroup
? rawPeerId.replace(/^(chat_id|chat_guid|chat_identifier):/i, "")
: rawPeerId;
if (!peerId) return null;
if (!peerId) {
return null;
}
const peer: RoutePeer = {
kind: isGroup ? "group" : "dm",
id: peerId,
@@ -591,10 +643,14 @@ function resolveNextcloudTalkSession(
params: ResolveOutboundSessionRouteParams,
): OutboundSessionRoute | null {
let trimmed = params.target.trim();
if (!trimmed) return null;
if (!trimmed) {
return null;
}
trimmed = trimmed.replace(/^(nextcloud-talk|nc-talk|nc):/i, "").trim();
trimmed = trimmed.replace(/^room:/i, "").trim();
if (!trimmed) return null;
if (!trimmed) {
return null;
}
const peer: RoutePeer = { kind: "group", id: trimmed };
const baseSessionKey = buildBaseSessionKey({
cfg: params.cfg,
@@ -619,7 +675,9 @@ function resolveZaloSession(
const trimmed = stripProviderPrefix(params.target, "zalo")
.replace(/^(zl):/i, "")
.trim();
if (!trimmed) return null;
if (!trimmed) {
return null;
}
const isGroup = trimmed.toLowerCase().startsWith("group:");
const peerId = stripKindPrefix(trimmed);
const peer: RoutePeer = { kind: isGroup ? "group" : "dm", id: peerId };
@@ -646,7 +704,9 @@ function resolveZalouserSession(
const trimmed = stripProviderPrefix(params.target, "zalouser")
.replace(/^(zlu):/i, "")
.trim();
if (!trimmed) return null;
if (!trimmed) {
return null;
}
const isGroup = trimmed.toLowerCase().startsWith("group:");
const peerId = stripKindPrefix(trimmed);
// Keep DM vs group aligned with inbound sessions for Zalo Personal.
@@ -672,7 +732,9 @@ function resolveNostrSession(
params: ResolveOutboundSessionRouteParams,
): OutboundSessionRoute | null {
const trimmed = stripProviderPrefix(params.target, "nostr").trim();
if (!trimmed) return null;
if (!trimmed) {
return null;
}
const peer: RoutePeer = { kind: "dm", id: trimmed };
const baseSessionKey = buildBaseSessionKey({
cfg: params.cfg,
@@ -693,7 +755,9 @@ function resolveNostrSession(
function normalizeTlonShip(raw: string): string {
const trimmed = raw.trim();
if (!trimmed) return trimmed;
if (!trimmed) {
return trimmed;
}
return trimmed.startsWith("~") ? trimmed : `~${trimmed}`;
}
@@ -702,7 +766,9 @@ function resolveTlonSession(
): OutboundSessionRoute | null {
let trimmed = stripProviderPrefix(params.target, "tlon");
trimmed = trimmed.trim();
if (!trimmed) return null;
if (!trimmed) {
return null;
}
const lower = trimmed.toLowerCase();
let isGroup =
lower.startsWith("group:") || lower.startsWith("room:") || lower.startsWith("chat/");
@@ -754,13 +820,17 @@ function resolveFallbackSession(
params: ResolveOutboundSessionRouteParams,
): OutboundSessionRoute | null {
const trimmed = stripProviderPrefix(params.target, params.channel).trim();
if (!trimmed) return null;
if (!trimmed) {
return null;
}
const peerKind = inferPeerKind({
channel: params.channel,
resolvedTarget: params.resolvedTarget,
});
const peerId = stripKindPrefix(trimmed);
if (!peerId) return null;
if (!peerId) {
return null;
}
const peer: RoutePeer = { kind: peerKind, id: peerId };
const baseSessionKey = buildBaseSessionKey({
cfg: params.cfg,
@@ -786,7 +856,9 @@ export async function resolveOutboundSessionRoute(
params: ResolveOutboundSessionRouteParams,
): Promise<OutboundSessionRoute | null> {
const target = params.target.trim();
if (!target) return null;
if (!target) {
return null;
}
switch (params.channel) {
case "slack":
return await resolveSlackSession({ ...params, target });