From ae1393d3e3c905c598832f9a9b6a663cef4d3bb6 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 9 Aug 2026 11:51:26 +0200 Subject: [PATCH] refactor: clean up duplicate imports and dead code - Merge type and value imports from the same module into single imports - Remove dead import-badges action (flow uses /api/admin/import/badges) - Remove unused babel-plugin-react-compiler devDependency - Remove stray test.txt file - Update knip config: track css imports, drop redundant ignore entries - Update contract test to drop obsolete dead-action assertion --- knip.json | 13 +------ package.json | 1 - pnpm-lock.yaml | 4 +- src/actions/import-badges.ts | 22 ----------- .../catalog/[id]/catalog-detail-tabs.tsx | 3 +- .../catalog-items-table.tsx | 10 ++++- .../[id]/catalog-items-table/song-picker.tsx | 3 +- .../admin/catalog-manager/inline-editor.tsx | 6 ++- .../admin/catalog/items-shop-preview.tsx | 6 ++- src/lib/admin-nav.ts | 2 +- src/lib/api-handler.ts | 3 +- src/lib/import-backend-contract.test.ts | 3 -- src/lib/services/furni-import.ts | 39 ++++++++++--------- src/lib/services/send-currency.test.ts | 4 +- test.txt | 1 - 15 files changed, 45 insertions(+), 75 deletions(-) delete mode 100644 src/actions/import-badges.ts delete mode 100644 test.txt diff --git a/knip.json b/knip.json index 60cb160f..15369a2d 100644 --- a/knip.json +++ b/knip.json @@ -7,16 +7,7 @@ "src/app/**/{error,not-found,loading,template,default,global-error}.{ts,tsx}", "scripts/migrate-aes-cbc-to-gcm.ts" ], - "project": ["src/**/*.{ts,tsx}", "scripts/**/*.{ts,js}"], - "ignoreDependencies": [ - "tailwindcss-animate", - "@tailwindcss/forms", - "@tailwindcss/typography", - "pino-pretty", - "tailwindcss", - "husky", - "@sentry/nextjs" - ], - "ignore": ["src/actions/import-badges.ts"], + "project": ["src/**/*.{ts,tsx,css}", "scripts/**/*.{ts,js}"], + "ignoreDependencies": ["@sentry/nextjs", "pino-pretty", "husky"], "ignoreBinaries": ["sendmail"] } diff --git a/package.json b/package.json index 4ea97f85..7069dbb5 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,6 @@ "@types/react": "19.2.18", "@types/react-dom": "19.2.4", "@vitest/coverage-v8": "4.1.10", - "babel-plugin-react-compiler": "^1.0.0", "dotenv": "^17.4.2", "drizzle-kit": "^0.31.10", "husky": "^9.1.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c187d5fd..bbe59ec4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,9 +164,6 @@ importers: '@vitest/coverage-v8': specifier: 4.1.10 version: 4.1.10(vitest@4.1.10) - babel-plugin-react-compiler: - specifier: ^1.0.0 - version: 1.0.0 dotenv: specifier: ^17.4.2 version: 17.4.2 @@ -4318,6 +4315,7 @@ snapshots: babel-plugin-react-compiler@1.0.0: dependencies: '@babel/types': 7.29.8 + optional: true baseline-browser-mapping@2.11.12: {} diff --git a/src/actions/import-badges.ts b/src/actions/import-badges.ts deleted file mode 100644 index 4d87c513..00000000 --- a/src/actions/import-badges.ts +++ /dev/null @@ -1,22 +0,0 @@ -"use server"; - -import { requirePermission } from "@/lib/admin/guard"; -import { PERMS } from "@/lib/permissions"; -import { importBadgeSynced } from "@/lib/services/import-badge"; - -export async function importBadgeFromRemote({ - code, - name, - description, -}: { - code: string; - name: string; - description: string; -}) { - await requirePermission(PERMS.ASSETS_IMPORT); - const result = await importBadgeSynced({ code, name, description }); - if (!result.ok) { - return { ok: false as const, error: result.error }; - } - return { ok: true as const }; -} diff --git a/src/app/admin/catalog/[id]/catalog-detail-tabs.tsx b/src/app/admin/catalog/[id]/catalog-detail-tabs.tsx index 3ccf3824..c68756dc 100644 --- a/src/app/admin/catalog/[id]/catalog-detail-tabs.tsx +++ b/src/app/admin/catalog/[id]/catalog-detail-tabs.tsx @@ -2,8 +2,7 @@ import { Languages, Package, Settings } from "lucide-react"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import type { CatalogItemData } from "./catalog-items-table"; -import { CatalogItemsTable } from "./catalog-items-table"; +import { type CatalogItemData, CatalogItemsTable } from "./catalog-items-table"; import { CatalogPageForm } from "./catalog-page-form"; import { CatalogTranslateTab } from "./catalog-translate-tab"; diff --git a/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx b/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx index ad59421d..bf626d59 100644 --- a/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx +++ b/src/app/admin/catalog/[id]/catalog-items-table/catalog-items-table.tsx @@ -90,8 +90,14 @@ import { } from "./field-helpers"; import { FurniIcon } from "./furni-icon"; import { SongPicker } from "./song-picker"; -import type { BaseItemData, CatalogItemData, InlineEdit } from "./types"; -import { DEFAULT_NEW_ITEM, getPointsLabel, POINTS_TYPES } from "./types"; +import { + type BaseItemData, + type CatalogItemData, + DEFAULT_NEW_ITEM, + getPointsLabel, + type InlineEdit, + POINTS_TYPES, +} from "./types"; export type { BaseItemData, CatalogItemData }; diff --git a/src/app/admin/catalog/[id]/catalog-items-table/song-picker.tsx b/src/app/admin/catalog/[id]/catalog-items-table/song-picker.tsx index 40dcfe8a..bf3a8ea4 100644 --- a/src/app/admin/catalog/[id]/catalog-items-table/song-picker.tsx +++ b/src/app/admin/catalog/[id]/catalog-items-table/song-picker.tsx @@ -11,13 +11,14 @@ import { } from "@/components/ui/select"; import { getCachedSongPickerOptions, + invalidateSongPickerCache, loadSongPickerOptions, type SoundtrackOption, } from "@/lib/client-cache/song-picker-cache"; // Re-export so existing `import { invalidateSongPickerCache } from '.../song-picker'` // callsites keep working. New code should import from the lib module directly. -export { invalidateSongPickerCache } from "@/lib/client-cache/song-picker-cache"; +export { invalidateSongPickerCache }; interface Props { value: number; diff --git a/src/components/admin/catalog-manager/inline-editor.tsx b/src/components/admin/catalog-manager/inline-editor.tsx index d6464b7e..42b13d61 100644 --- a/src/components/admin/catalog-manager/inline-editor.tsx +++ b/src/components/admin/catalog-manager/inline-editor.tsx @@ -16,8 +16,10 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { toast } from "sonner"; import { updateCatalogPage } from "@/actions/catalog"; import { updateBcPage } from "@/actions/catalog-bc"; -import type { CatalogItemData } from "@/app/admin/catalog/[id]/catalog-items-table"; -import { CatalogItemsTable } from "@/app/admin/catalog/[id]/catalog-items-table"; +import { + type CatalogItemData, + CatalogItemsTable, +} from "@/app/admin/catalog/[id]/catalog-items-table"; import { CatalogTranslateTab } from "@/app/admin/catalog/[id]/catalog-translate-tab"; import { BulkImportItems } from "@/components/admin/catalog/bulk-import-items"; import { CatalogImagePicker } from "@/components/admin/catalog/catalog-image-picker"; diff --git a/src/components/admin/catalog/items-shop-preview.tsx b/src/components/admin/catalog/items-shop-preview.tsx index e39e77a3..43886438 100644 --- a/src/components/admin/catalog/items-shop-preview.tsx +++ b/src/components/admin/catalog/items-shop-preview.tsx @@ -1,8 +1,10 @@ "use client"; import { Crown, Image as ImageIcon, Package, Sparkles } from "lucide-react"; -import type { CatalogItemData } from "@/app/admin/catalog/[id]/catalog-items-table/types"; -import { getPointsLabel } from "@/app/admin/catalog/[id]/catalog-items-table/types"; +import { + type CatalogItemData, + getPointsLabel, +} from "@/app/admin/catalog/[id]/catalog-items-table/types"; import { CurrencyIcon, currencyKindFromPointsType, diff --git a/src/lib/admin-nav.ts b/src/lib/admin-nav.ts index 4b7c70bb..981c3af5 100644 --- a/src/lib/admin-nav.ts +++ b/src/lib/admin-nav.ts @@ -1,4 +1,3 @@ -import type { LucideIcon } from "lucide-react"; import { Activity, AlertTriangle, @@ -19,6 +18,7 @@ import { Languages, LayoutDashboard, ListOrdered, + type LucideIcon, Megaphone, Monitor, Newspaper, diff --git a/src/lib/api-handler.ts b/src/lib/api-handler.ts index d32184a1..560b9b0a 100644 --- a/src/lib/api-handler.ts +++ b/src/lib/api-handler.ts @@ -1,5 +1,4 @@ -import type { NextRequest } from "next/server"; -import { NextResponse } from "next/server"; +import { type NextRequest, NextResponse } from "next/server"; import { logAuthorizationEvent } from "@/lib/admin/authorization-events"; import { validateCsrfToken } from "@/lib/foundation/security"; import { canAccess, getApiAdminContext } from "@/lib/permissions"; diff --git a/src/lib/import-backend-contract.test.ts b/src/lib/import-backend-contract.test.ts index 6aaf9672..a5d93bf2 100644 --- a/src/lib/import-backend-contract.test.ts +++ b/src/lib/import-backend-contract.test.ts @@ -45,9 +45,6 @@ describe("admin import backend contract", () => { expect(service).toContain("ExternalTexts.json"); expect(service).toContain("WebsiteBadges"); expect(service).toContain("importBadgeSynced"); - expect(readFileSync("src/actions/import-badges.ts", "utf8")).toContain( - "importBadgeSynced", - ); expect( readFileSync("src/app/api/admin/import/badges/route.ts", "utf8"), ).toContain("importBadgeSynced"); diff --git a/src/lib/services/furni-import.ts b/src/lib/services/furni-import.ts index 55a8cbc2..c9290551 100644 --- a/src/lib/services/furni-import.ts +++ b/src/lib/services/furni-import.ts @@ -4,23 +4,6 @@ import { and, eq, type SQL, sql } from "drizzle-orm"; import { CatalogPages, db, ItemsBase } from "@/lib/db"; import { officialHabboEnrichmentWarning } from "@/lib/habbo-gamedata-hotel"; import { logger } from "@/lib/logger"; -import { - appendFurniEntry, - buildFurniEntry, - removeFurniEntry, -} from "@/lib/services/furni-data"; -import type { OfficialHabboFurniEntry } from "@/lib/services/habbo-furnidata-cache"; -import { lookupOfficialHabboFurni } from "@/lib/services/habbo-furnidata-cache"; -import { getHabboGamedataHotel } from "@/lib/services/habbo-gamedata-hotel"; - -// Re-export the download helpers now owned by the shared import core. -// Existing furni callers keep importing them from here. -export { - downloadFile, - validatePngBytes, - validateSwfBytes, -} from "@/lib/services/import/core/download"; - import { DEFAULT_FURNI_ICON_DIR, DEFAULT_FURNI_NITRO_DIR, @@ -28,14 +11,32 @@ import { getFurniAssetDirs, getFurniAssetWriteTargets, } from "@/lib/services/furni-asset-dirs"; -import { downloadFile } from "@/lib/services/import/core/download"; -import type { ConversionResult } from "@/lib/services/swf-to-nitro"; import { + appendFurniEntry, + buildFurniEntry, + removeFurniEntry, +} from "@/lib/services/furni-data"; +import { + lookupOfficialHabboFurni, + type OfficialHabboFurniEntry, +} from "@/lib/services/habbo-furnidata-cache"; +import { getHabboGamedataHotel } from "@/lib/services/habbo-gamedata-hotel"; +import { + downloadFile, + validatePngBytes, + validateSwfBytes, +} from "@/lib/services/import/core/download"; +import { + type ConversionResult, convertSwfToNitro, extractIconFromSwf, } from "@/lib/services/swf-to-nitro"; import type { ImportSingleResult } from "@/types/furni"; +// Re-export the download helpers now owned by the shared import core. +// Existing furni callers keep importing them from here. +export { downloadFile, validatePngBytes, validateSwfBytes }; + // ── Constants ──────────────────────────────────────────────────────── // turbopackIgnore hints: this module is reached by App Router routes; without diff --git a/src/lib/services/send-currency.test.ts b/src/lib/services/send-currency.test.ts index 9392da2d..1aa814d7 100644 --- a/src/lib/services/send-currency.test.ts +++ b/src/lib/services/send-currency.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import type { CurrencyDb } from "./send-currency"; +import { type CurrencyDb, sendCurrency } from "./send-currency"; vi.mock("@/lib/db", () => ({ db: {}, @@ -9,8 +9,6 @@ vi.mock("@/lib/db", () => ({ vi.mock("@/lib/services/rcon", () => ({})); -import { sendCurrency } from "./send-currency"; - const mockDb = {} as CurrencyDb; describe("sendCurrency", () => { diff --git a/test.txt b/test.txt deleted file mode 100644 index db1db291..00000000 --- a/test.txt +++ /dev/null @@ -1 +0,0 @@ -cleanup