mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-08-18 17:53:29 +00:00
run formatter
This commit is contained in:
@@ -101,7 +101,6 @@ All new features and bug fixes should include relevant tests. We use **Vitest**.
|
|||||||
## Submitting a Pull Request
|
## Submitting a Pull Request
|
||||||
|
|
||||||
1. **Commit your changes**:
|
1. **Commit your changes**:
|
||||||
|
|
||||||
- Write clear, concise commit messages.
|
- Write clear, concise commit messages.
|
||||||
- Use the present tense ("Add feature" not "Added feature").
|
- Use the present tense ("Add feature" not "Added feature").
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,6 @@ Feel free to ask questions in the translation Discord server!
|
|||||||
To ensure code quality and project stability, we use a progressive contribution system:
|
To ensure code quality and project stability, we use a progressive contribution system:
|
||||||
|
|
||||||
1. **New Contributors**: Limited to UI improvements and small bug fixes only
|
1. **New Contributors**: Limited to UI improvements and small bug fixes only
|
||||||
|
|
||||||
- This helps you become familiar with the codebase
|
- This helps you become familiar with the codebase
|
||||||
- UI changes are easier to review and less likely to break core functionality
|
- UI changes are easier to review and less likely to break core functionality
|
||||||
- Small, focused PRs have a higher chance of being accepted
|
- Small, focused PRs have a higher chance of being accepted
|
||||||
@@ -193,20 +192,17 @@ To ensure code quality and project stability, we use a progressive contribution
|
|||||||
### How to Contribute Successfully
|
### How to Contribute Successfully
|
||||||
|
|
||||||
1. **Before Starting Work**:
|
1. **Before Starting Work**:
|
||||||
|
|
||||||
- Open an issue describing what you want to contribute
|
- Open an issue describing what you want to contribute
|
||||||
- Wait for maintainer feedback before investing significant time
|
- Wait for maintainer feedback before investing significant time
|
||||||
- Small improvements can proceed directly to PR stage
|
- Small improvements can proceed directly to PR stage
|
||||||
|
|
||||||
2. **Code Quality Requirements**:
|
2. **Code Quality Requirements**:
|
||||||
|
|
||||||
- All code must be well-commented and follow existing style patterns
|
- All code must be well-commented and follow existing style patterns
|
||||||
- New features should not break existing functionality
|
- New features should not break existing functionality
|
||||||
- Code should be thoroughly tested before submission
|
- Code should be thoroughly tested before submission
|
||||||
- All code changes in src/core _MUST_ be tested.
|
- All code changes in src/core _MUST_ be tested.
|
||||||
|
|
||||||
3. **Pull Request Process**:
|
3. **Pull Request Process**:
|
||||||
|
|
||||||
- Keep PRs focused on a single feature or bug fix
|
- Keep PRs focused on a single feature or bug fix
|
||||||
- Include screenshots for UI changes
|
- Include screenshots for UI changes
|
||||||
- Describe what testing you've performed
|
- Describe what testing you've performed
|
||||||
|
|||||||
@@ -11,9 +11,7 @@ export interface ParabolaOptions {
|
|||||||
|
|
||||||
const PARABOLA_MIN_HEIGHT = 50;
|
const PARABOLA_MIN_HEIGHT = 50;
|
||||||
|
|
||||||
export class ParabolaUniversalPathFinder
|
export class ParabolaUniversalPathFinder implements SteppingPathFinder<TileRef> {
|
||||||
implements SteppingPathFinder<TileRef>
|
|
||||||
{
|
|
||||||
private curve: DistanceBasedBezierCurve | null = null;
|
private curve: DistanceBasedBezierCurve | null = null;
|
||||||
private lastTo: TileRef | null = null;
|
private lastTo: TileRef | null = null;
|
||||||
|
|
||||||
|
|||||||
@@ -121,8 +121,7 @@ export interface AttackClusteredPositionsMessage extends BaseWorkerMessage {
|
|||||||
attackID?: string;
|
attackID?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AttackClusteredPositionsResultMessage
|
export interface AttackClusteredPositionsResultMessage extends BaseWorkerMessage {
|
||||||
extends BaseWorkerMessage {
|
|
||||||
type: "attack_clustered_positions_result";
|
type: "attack_clustered_positions_result";
|
||||||
attacks: { id: string; positions: { x: number; y: number }[] }[];
|
attacks: { id: string; positions: { x: number; y: number }[] }[];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,9 +53,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
|
|
||||||
describe("handleApprove increments selectedClan.memberCount", () => {
|
describe("handleApprove increments selectedClan.memberCount", () => {
|
||||||
it("increments memberCount by 1 after successful approveClanRequest", async () => {
|
it("increments memberCount by 1 after successful approveClanRequest", async () => {
|
||||||
const { approveClanRequest, fetchClanRequests } = await import(
|
const { approveClanRequest, fetchClanRequests } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(approveClanRequest as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
(approveClanRequest as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
||||||
(fetchClanRequests as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
(fetchClanRequests as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
||||||
results: [
|
results: [
|
||||||
@@ -90,9 +89,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("does not increment memberCount when approveClanRequest fails", async () => {
|
it("does not increment memberCount when approveClanRequest fails", async () => {
|
||||||
const { approveClanRequest, fetchClanRequests } = await import(
|
const { approveClanRequest, fetchClanRequests } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(approveClanRequest as ReturnType<typeof vi.fn>).mockResolvedValue({
|
(approveClanRequest as ReturnType<typeof vi.fn>).mockResolvedValue({
|
||||||
error: "clan_modal.error_generic",
|
error: "clan_modal.error_generic",
|
||||||
});
|
});
|
||||||
@@ -125,9 +123,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("treats undefined memberCount as 0 and increments to 1", async () => {
|
it("treats undefined memberCount as 0 and increments to 1", async () => {
|
||||||
const { approveClanRequest, fetchClanRequests } = await import(
|
const { approveClanRequest, fetchClanRequests } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(approveClanRequest as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
(approveClanRequest as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
||||||
(fetchClanRequests as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
(fetchClanRequests as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
||||||
results: [
|
results: [
|
||||||
@@ -271,9 +268,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("handleBan syncs memberCount via clan-updated event on success", async () => {
|
it("handleBan syncs memberCount via clan-updated event on success", async () => {
|
||||||
const { banClanMember, fetchClanMembers } = await import(
|
const { banClanMember, fetchClanMembers } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(banClanMember as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
(banClanMember as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
||||||
// Server returns the post-ban member total (was 5, now 4).
|
// Server returns the post-ban member total (was 5, now 4).
|
||||||
(fetchClanMembers as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
(fetchClanMembers as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
||||||
@@ -310,9 +306,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
|
|
||||||
describe("handleUnban", () => {
|
describe("handleUnban", () => {
|
||||||
it("removes ban from list and decrements total on success", async () => {
|
it("removes ban from list and decrements total on success", async () => {
|
||||||
const { unbanClanMember, fetchClanBans } = await import(
|
const { unbanClanMember, fetchClanBans } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(unbanClanMember as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
(unbanClanMember as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
||||||
(fetchClanBans as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
(fetchClanBans as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
||||||
results: [
|
results: [
|
||||||
@@ -377,9 +372,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("calls kickMember and syncs memberCount on success", async () => {
|
it("calls kickMember and syncs memberCount on success", async () => {
|
||||||
const { kickMember, fetchClanMembers } = await import(
|
const { kickMember, fetchClanMembers } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(kickMember as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
(kickMember as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
||||||
(fetchClanMembers as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
(fetchClanMembers as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
||||||
results: [],
|
results: [],
|
||||||
@@ -411,9 +405,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("does not mutate state when kickMember fails", async () => {
|
it("does not mutate state when kickMember fails", async () => {
|
||||||
const { kickMember, fetchClanMembers } = await import(
|
const { kickMember, fetchClanMembers } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(kickMember as ReturnType<typeof vi.fn>).mockResolvedValue({
|
(kickMember as ReturnType<typeof vi.fn>).mockResolvedValue({
|
||||||
error: "clan_modal.error_generic",
|
error: "clan_modal.error_generic",
|
||||||
});
|
});
|
||||||
@@ -600,9 +593,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
|
|
||||||
describe("handleJoin", () => {
|
describe("handleJoin", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const { fetchClanDetail, fetchClanStats } = await import(
|
const { fetchClanDetail, fetchClanStats } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(fetchClanDetail as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
|
(fetchClanDetail as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
|
||||||
makeClan({ isOpen: true, memberCount: 5 }),
|
makeClan({ isOpen: true, memberCount: 5 }),
|
||||||
);
|
);
|
||||||
@@ -615,9 +607,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("switches detail view into member mode immediately after open-clan join", async () => {
|
it("switches detail view into member mode immediately after open-clan join", async () => {
|
||||||
const { joinClan, fetchClanMembers } = await import(
|
const { joinClan, fetchClanMembers } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(joinClan as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
(joinClan as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
|
||||||
status: "joined",
|
status: "joined",
|
||||||
});
|
});
|
||||||
@@ -781,9 +772,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("clears confirmAction and removes the dialog after confirming", async () => {
|
it("clears confirmAction and removes the dialog after confirming", async () => {
|
||||||
const { transferLeadership } = await import(
|
const { transferLeadership } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(transferLeadership as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
(transferLeadership as ReturnType<typeof vi.fn>).mockResolvedValue(true);
|
||||||
|
|
||||||
const dialog = modal.querySelector("confirm-dialog");
|
const dialog = modal.querySelector("confirm-dialog");
|
||||||
@@ -802,9 +792,8 @@ describe("ClanModal — handlers", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("clears confirmAction when cancel is clicked, without calling the API", async () => {
|
it("clears confirmAction when cancel is clicked, without calling the API", async () => {
|
||||||
const { transferLeadership } = await import(
|
const { transferLeadership } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
|
|
||||||
const dialog = modal.querySelector("confirm-dialog");
|
const dialog = modal.querySelector("confirm-dialog");
|
||||||
expect(dialog).toBeTruthy();
|
expect(dialog).toBeTruthy();
|
||||||
|
|||||||
@@ -241,9 +241,8 @@ describe("ClanModal — rendering", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("shows 0 in the stats row of the detail view when memberCount is undefined", async () => {
|
it("shows 0 in the stats row of the detail view when memberCount is undefined", async () => {
|
||||||
const { fetchClanDetail, fetchClanStats } = await import(
|
const { fetchClanDetail, fetchClanStats } =
|
||||||
"../../../src/client/ClanApi"
|
await import("../../../src/client/ClanApi");
|
||||||
);
|
|
||||||
(fetchClanDetail as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
|
(fetchClanDetail as ReturnType<typeof vi.fn>).mockResolvedValueOnce(
|
||||||
makeClan({ memberCount: undefined }),
|
makeClan({ memberCount: undefined }),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user