diff --git a/CLAUDE.md b/CLAUDE.md index 7cda7591..03204157 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -197,6 +197,28 @@ src/ - `$types` → `src/lib/types` (custom alias) - `$src` → `src/` (Vite alias) +7. **Import Patterns**: + - **Prefer direct imports over re-exports** for better clarity and tree-shaking + - Import types directly from their source files (e.g., `import type { Party } from '$lib/types/api/party'`) + - Avoid creating barrel files (index.ts) that re-export from other modules + - Exception: Generated code (like Paraglide messages) may use re-exports + - This pattern improves TypeScript performance and makes dependencies explicit + + **Correct Import Examples**: + ```typescript + // ✅ Good - Direct imports + import { partyAdapter } from '$lib/api/adapters/party.adapter' + import { userAdapter } from '$lib/api/adapters/user.adapter' + import { createSearchResource } from '$lib/api/adapters/resources/search.resource.svelte' + import type { Party } from '$lib/types/api/party' + import type { AdapterOptions } from '$lib/api/adapters/types' + import { ApiError } from '$lib/api/adapters/errors' + + // ❌ Bad - Barrel file imports + import { partyAdapter, userAdapter } from '$lib/api/adapters' + import type { Party } from '$lib/api/adapters' + ``` + ### Component Patterns Components follow a consistent structure: diff --git a/src/lib/api/adapters/index.ts b/src/lib/api/adapters/index.ts deleted file mode 100644 index d6392cef..00000000 --- a/src/lib/api/adapters/index.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Main export file for the adapter system - * - * This module re-exports all public APIs from the adapter system, - * providing a single entry point for consumers. - * - * @module adapters - */ - -// Core exports -export { BaseAdapter } from './base.adapter' -export * from './types' -export * from './errors' - -// Resource-specific adapters -export { SearchAdapter, searchAdapter } from './search.adapter' -export type { SearchParams, SearchResult, SearchResponse } from './search.adapter' - -export { PartyAdapter, partyAdapter } from './party.adapter' -export type { - Party, - GridWeapon, - GridSummon, - GridCharacter, - CreatePartyParams, - UpdatePartyParams, - ListUserPartiesParams, - GridOperation, - GridUpdateOptions, - GridUpdateResponse -} from './party.adapter' - -export { GridAdapter, gridAdapter } from './grid.adapter' -export type { - GridWeapon, - GridCharacter, - GridSummon, - CreateGridWeaponParams, - CreateGridCharacterParams, - CreateGridSummonParams, - UpdateUncapParams, - UpdatePositionParams, - SwapPositionsParams, - ResolveConflictParams -} from './grid.adapter' - -export { EntityAdapter, entityAdapter } from './entity.adapter' -export type { - Weapon, - Character, - Summon -} from './entity.adapter' - -export { UserAdapter, userAdapter } from './user.adapter' -export type { - UserInfo, - UserProfile, - UserProfileResponse -} from './user.adapter' - -// Reactive resources using Svelte 5 runes -export * from './resources' \ No newline at end of file diff --git a/src/lib/api/adapters/resources/index.ts b/src/lib/api/adapters/resources/index.ts deleted file mode 100644 index 6bb41a73..00000000 --- a/src/lib/api/adapters/resources/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Reactive Resources using Svelte 5 Runes - * - * This module exports reactive resources that provide - * state management for API operations. - * - * @module adapters/resources - */ - -export { SearchResource, createSearchResource } from './search.resource.svelte' -export type { SearchResourceOptions } from './search.resource.svelte' - -export { PartyResource, createPartyResource } from './party.resource.svelte' -export type { PartyResourceOptions } from './party.resource.svelte' - -// Future resources will be added here -// export { GridResource, createGridResource } from './grid.resource.svelte' -// export { EntityResource, createEntityResource } from './entity.resource.svelte' \ No newline at end of file diff --git a/src/lib/components/ui/index.ts b/src/lib/components/ui/index.ts deleted file mode 100644 index d5a57bc8..00000000 --- a/src/lib/components/ui/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -// UI Components barrel export -export { default as Button } from './Button.svelte' -export { default as Input } from './Input.svelte' -export { default as Select } from './Select.svelte' - -// Re-export existing UI components -export { default as Dialog } from './Dialog.svelte' -export { default as Tooltip } from './Tooltip.svelte' -export { default as ContextMenu } from './ContextMenu.svelte' diff --git a/src/lib/components/ui/segmented-control/index.ts b/src/lib/components/ui/segmented-control/index.ts deleted file mode 100644 index 9efc473c..00000000 --- a/src/lib/components/ui/segmented-control/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as SegmentedControl } from './SegmentedControl.svelte'; -export { default as Segment } from './Segment.svelte'; \ No newline at end of file diff --git a/src/lib/types/Party.d.ts b/src/lib/types/Party.d.ts deleted file mode 100644 index 66afa67c..00000000 --- a/src/lib/types/Party.d.ts +++ /dev/null @@ -1,49 +0,0 @@ -export type JobSkillList = { - [key: number]: JobSkill | undefined - 0: JobSkill | undefined - 1: JobSkill | undefined - 2: JobSkill | undefined - 3: JobSkill | undefined -} - -export type GuidebookList = { - [key: number]: Guidebook | undefined - 0: Guidebook | undefined - 1: Guidebook | undefined - 2: Guidebook | undefined -} - -export interface Party { - id: string - name: string - description: string - raid: Raid - full_auto: boolean - auto_guard: boolean - auto_summon: boolean - charge_attack: boolean - clear_time: number - button_count?: number - turn_count?: number - chain_count?: number - source_party?: Party - job: Job - master_level?: number - ultimate_mastery?: number - job_skills: JobSkillList - accessory: JobAccessory - shortcode: string - extra: boolean - guidebooks: GuidebookList - favorited: boolean - characters: Array - weapons: Array - summons: Array - user: User - local_id?: string - remix: boolean - remixes: Party[] - visibility: number - created_at: string - updated_at: string -} diff --git a/src/routes/[username]/+page.server.ts b/src/routes/[username]/+page.server.ts index 9b60337b..e4216f1c 100644 --- a/src/routes/[username]/+page.server.ts +++ b/src/routes/[username]/+page.server.ts @@ -1,6 +1,6 @@ import type { PageServerLoad } from './$types' import { error } from '@sveltejs/kit' -import { userAdapter } from '$lib/api/adapters' +import { userAdapter } from '$lib/api/adapters/user.adapter' import { parseParty } from '$lib/api/schemas/party' export const load: PageServerLoad = async ({ params, url, depends, locals }) => { diff --git a/src/routes/[username]/+page.svelte b/src/routes/[username]/+page.svelte index e1d99315..aa2ee527 100644 --- a/src/routes/[username]/+page.svelte +++ b/src/routes/[username]/+page.svelte @@ -4,7 +4,7 @@ import InfiniteScroll from '$lib/components/InfiniteScroll.svelte' import ExploreGrid from '$lib/components/explore/ExploreGrid.svelte' import { createInfiniteScrollResource } from '$lib/api/adapters/resources/infiniteScroll.resource.svelte' - import { userAdapter } from '$lib/api/adapters' + import { userAdapter } from '$lib/api/adapters/user.adapter' import { getAvatarSrc, getAvatarSrcSet } from '$lib/utils/avatar' const { data } = $props() as { data: PageData } diff --git a/src/routes/auth/login/+server.ts b/src/routes/auth/login/+server.ts index 3bf47e14..4a3d2b4a 100644 --- a/src/routes/auth/login/+server.ts +++ b/src/routes/auth/login/+server.ts @@ -2,7 +2,7 @@ import type { RequestHandler } from '@sveltejs/kit' import { json } from '@sveltejs/kit' import { z } from 'zod' import { passwordGrantLogin } from '$lib/auth/oauth' -import { UserAdapter } from '$lib/api/adapters' +import { UserAdapter } from '$lib/api/adapters/user.adapter' import { buildCookies } from '$lib/auth/map' import { setAccountCookie, setUserCookie, setRefreshCookie } from '$lib/auth/cookies' diff --git a/src/routes/database/characters/[id]/+page.server.ts b/src/routes/database/characters/[id]/+page.server.ts index c9fd51c7..7a9dfb21 100644 --- a/src/routes/database/characters/[id]/+page.server.ts +++ b/src/routes/database/characters/[id]/+page.server.ts @@ -1,5 +1,5 @@ import type { PageServerLoad } from './$types' -import { entityAdapter } from '$lib/api/adapters' +import { entityAdapter } from '$lib/api/adapters/entity.adapter' import { error } from '@sveltejs/kit' export const load: PageServerLoad = async ({ params, parent }) => { diff --git a/src/routes/database/summons/[id]/+page.server.ts b/src/routes/database/summons/[id]/+page.server.ts index 0057b292..7f6d9b0e 100644 --- a/src/routes/database/summons/[id]/+page.server.ts +++ b/src/routes/database/summons/[id]/+page.server.ts @@ -1,5 +1,5 @@ import type { PageServerLoad } from './$types' -import { entityAdapter } from '$lib/api/adapters' +import { entityAdapter } from '$lib/api/adapters/entity.adapter' import { error } from '@sveltejs/kit' export const load: PageServerLoad = async ({ params, parent }) => { diff --git a/src/routes/database/weapons/[id]/+page.server.ts b/src/routes/database/weapons/[id]/+page.server.ts index dcd38341..32ff8a12 100644 --- a/src/routes/database/weapons/[id]/+page.server.ts +++ b/src/routes/database/weapons/[id]/+page.server.ts @@ -1,5 +1,5 @@ import type { PageServerLoad } from './$types' -import { entityAdapter } from '$lib/api/adapters' +import { entityAdapter } from '$lib/api/adapters/entity.adapter' import { error } from '@sveltejs/kit' export const load: PageServerLoad = async ({ params, parent }) => { diff --git a/src/routes/teams/explore/+page.server.ts b/src/routes/teams/explore/+page.server.ts index e696ca73..93afb648 100644 --- a/src/routes/teams/explore/+page.server.ts +++ b/src/routes/teams/explore/+page.server.ts @@ -1,6 +1,6 @@ import type { PageServerLoad } from './$types' import { error } from '@sveltejs/kit' -import { partyAdapter } from '$lib/api/adapters' +import { partyAdapter } from '$lib/api/adapters/party.adapter' export const load: PageServerLoad = async ({ url, depends }) => { depends('app:parties:list') diff --git a/src/routes/teams/explore/+page.svelte b/src/routes/teams/explore/+page.svelte index 7eafe91a..f59bf34a 100644 --- a/src/routes/teams/explore/+page.svelte +++ b/src/routes/teams/explore/+page.svelte @@ -4,7 +4,7 @@ import InfiniteScroll from '$lib/components/InfiniteScroll.svelte' import ExploreGrid from '$lib/components/explore/ExploreGrid.svelte' import { createInfiniteScrollResource } from '$lib/api/adapters/resources/infiniteScroll.resource.svelte' - import { partyAdapter } from '$lib/api/adapters' + import { partyAdapter } from '$lib/api/adapters/party.adapter' const { data } = $props() as { data: PageData }