mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-21 19:56:43 +00:00
26f5d40819
- Replace Webpack with Vite for faster client bundling and HMR. - Migrate tests from Jest to Vitest and update configuration. - Update Web Worker instantiation to standard ESM syntax. - Implement Env utility in `src/core` for safe, hybrid environment variable access (Vite vs Node). - Refactor configuration loaders to remove direct `process.env` dependencies in shared code. - Update TypeScript environment definitions and project scripts for the new toolchain. - Remove the [depracated usage of the husky](https://github.com/typicode/husky/releases/tag/v9.0.1). ## Description: migrate build system to Vite and test runner to Vitest & Remove depracated husky usage ## Please complete the following: - [X] I have added screenshots for all UI updates - [X] I process any text displayed to the user through translateText() and I've added it to the en.json file - [ ] I have added relevant tests to the test directory - [X] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: wraith4081 --------- Co-authored-by: evanpelle <evanpelle@gmail.com>
112 lines
3.6 KiB
TypeScript
112 lines
3.6 KiB
TypeScript
// Mocking the obscenity library to control its behavior in tests.
|
|
vi.mock("obscenity", () => {
|
|
return {
|
|
RegExpMatcher: class {
|
|
private dummy: string[] = ["foo", "bar", "leet", "code"];
|
|
constructor(_opts: any) {}
|
|
hasMatch(input: string): boolean {
|
|
const lower = input.toLowerCase();
|
|
const decoded = lower
|
|
.replace(/4/g, "a")
|
|
.replace(/3/g, "e")
|
|
.replace(/1/g, "i")
|
|
.replace(/0/g, "o")
|
|
.replace(/5/g, "s")
|
|
.replace(/7/g, "t");
|
|
return this.dummy.some((token) => decoded.includes(token));
|
|
}
|
|
},
|
|
collapseDuplicatesTransformer: () => ({}),
|
|
englishRecommendedTransformers: {},
|
|
englishDataset: { build: () => ({}) },
|
|
resolveConfusablesTransformer: () => ({}),
|
|
resolveLeetSpeakTransformer: () => ({}),
|
|
skipNonAlphabeticTransformer: () => ({}),
|
|
};
|
|
});
|
|
|
|
// Mocks the output of translation functions to return predictable values.
|
|
vi.mock("../src/client/Utils", () => ({
|
|
translateText: (key: string, vars?: any) =>
|
|
vars ? `${key}:${JSON.stringify(vars)}` : key,
|
|
}));
|
|
|
|
import {
|
|
fixProfaneUsername,
|
|
isProfaneUsername,
|
|
MAX_USERNAME_LENGTH,
|
|
validateUsername,
|
|
} from "../src/core/validations/username";
|
|
|
|
describe("username.ts functions", () => {
|
|
const shadowNames = [
|
|
"NicePeopleOnly",
|
|
"BeKindPlz",
|
|
"LearningManners",
|
|
"StayClassy",
|
|
"BeNicer",
|
|
"NeedHugs",
|
|
"MakeFriends",
|
|
];
|
|
|
|
describe("isProfaneUsername & fixProfaneUsername with leet decoding (mocked)", () => {
|
|
test.each([
|
|
{ username: "l33t", profane: true }, // decodes to "leet"
|
|
{ username: "L33T", profane: true },
|
|
{ username: "l33tc0de", profane: true }, // decodes to "leetcode", contains "leet" and "code"
|
|
{ username: "L33TC0DE", profane: true },
|
|
{ username: "foo123", profane: true }, // contains "foo"
|
|
{ username: "b4r", profane: true }, // decodes to "bar"
|
|
{ username: "safeName", profane: false },
|
|
{ username: "s4f3", profane: false }, // decodes to "safe" but "safe" not in dummy list
|
|
])('isProfaneUsername("%s") → %s', ({ username, profane }) => {
|
|
expect(isProfaneUsername(username)).toBe(profane);
|
|
});
|
|
|
|
test.each([
|
|
{ username: "safeName" },
|
|
{ username: "l33t" },
|
|
{ username: "b4rUser" },
|
|
])('fixProfaneUsername("%s") behavior', ({ username }) => {
|
|
const profane = isProfaneUsername(username);
|
|
const fixed = fixProfaneUsername(username);
|
|
if (!profane) {
|
|
expect(fixed).toBe(username);
|
|
} else {
|
|
// When profane: result should be one of shadowNames
|
|
expect(shadowNames).toContain(fixed);
|
|
}
|
|
});
|
|
});
|
|
|
|
describe("validateUsername", () => {
|
|
test("rejects non-string", () => {
|
|
// @ts-expect-error: Testing non-string input to validateUsername on purpose
|
|
const res = validateUsername(123);
|
|
expect(res.isValid).toBe(false);
|
|
expect(res.error).toBeDefined();
|
|
});
|
|
test("rejects too short", () => {
|
|
const res = validateUsername("ab");
|
|
expect(res.isValid).toBe(false);
|
|
});
|
|
test("rejects too long", () => {
|
|
const long = "a".repeat(MAX_USERNAME_LENGTH + 1);
|
|
const res = validateUsername(long);
|
|
expect(res.isValid).toBe(false);
|
|
});
|
|
test("rejects invalid chars", () => {
|
|
const res = validateUsername("Invalid!Name");
|
|
expect(res.isValid).toBe(false);
|
|
});
|
|
test("accepts valid ASCII names", () => {
|
|
const res = validateUsername("Good_Name123");
|
|
expect(res.isValid).toBe(true);
|
|
});
|
|
test("accepts allowed Unicode like ü", () => {
|
|
const res = validateUsername("Üser");
|
|
expect(res.isValid).toBe(true);
|
|
});
|
|
});
|
|
});
|