run formatter

This commit is contained in:
evanpelle
2026-05-06 21:43:03 -06:00
parent 0976d6f0ec
commit 4d0324c5cc
6 changed files with 26 additions and 46 deletions
-1
View File
@@ -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").
-4
View File
@@ -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
+1 -3
View File
@@ -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;
+1 -2
View File
@@ -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 }[] }[];
} }
+22 -33
View File
@@ -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 }),
); );