feat : quick update
CI / Verify (push) Successful in 1m5s
CI / Build immutable images and deploy (push) Successful in 1m56s

This commit is contained in:
2026-09-04 16:12:43 +07:00 Unverified
parent 262f15be27
commit c7b75a5ad4
4 changed files with 321 additions and 78 deletions
+31
View File
@@ -0,0 +1,31 @@
import { describe, expect, it } from "vitest";
import { matchesTeamSearch } from "./team-search";
const team = {
team: ["Vaporize Team"],
character: ["Mualani"],
weapon: ["Surf's Up"],
artifact: ["Obsidian Codex", "Scroll of the Hero"],
};
describe("team search", () => {
it("searches every category when the target is all", () => {
expect(matchesTeamSearch(team, "surf", "all")).toBe(true);
expect(matchesTeamSearch(team, "mualani", "all")).toBe(true);
});
it("only searches the selected target", () => {
expect(matchesTeamSearch(team, "vaporize", "team")).toBe(true);
expect(matchesTeamSearch(team, "obsidian", "team")).toBe(false);
expect(matchesTeamSearch(team, "obsidian", "artifact")).toBe(true);
});
it("ignores case and surrounding whitespace", () => {
expect(matchesTeamSearch(team, " HERO ", "artifact")).toBe(true);
});
it("matches every team when the query is empty", () => {
expect(matchesTeamSearch(team, " ", "weapon")).toBe(true);
});
});
+30
View File
@@ -0,0 +1,30 @@
export type TeamSearchTarget =
| "all"
| "team"
| "character"
| "weapon"
| "artifact";
export interface TeamSearchValues {
team: string[];
character: string[];
weapon: string[];
artifact: string[];
}
export function matchesTeamSearch(
values: TeamSearchValues,
query: string,
target: TeamSearchTarget,
): boolean {
const normalizedQuery = query.trim().toLocaleLowerCase();
if (!normalizedQuery) return true;
const candidates = target === "all"
? Object.values(values).flat()
: values[target];
return candidates.some((value) =>
value.toLocaleLowerCase().includes(normalizedQuery),
);
}