Commit graph

267 commits

Author SHA1 Message Date
6dcc517cc6 chore: remove obsolete planning documents
Remove outdated planning and session prompt files that are no longer
needed after completing the TanStack Query migration.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 02:22:03 -08:00
65f5521c74 fix: use swap API endpoints for drag-and-drop rearrangement
The handleSwap function was calling move methods (moveWeapon,
moveCharacter, moveSummon) which validate that target positions are
empty. This caused 422 errors when dragging items to swap positions.

Switch to using swap methods (swapWeapons, swapCharacters, swapSummons)
which perform atomic swaps in a transaction and bypass position
validation, allowing items to correctly swap positions.

Also remove unreachable throw statement after return.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 02:22:03 -08:00
a0939ec695 fix: pass auth data from server to client layout
The +layout.ts universal load function was only returning queryClient
and dropping all parent data from +layout.server.ts, including auth
data. This caused the client-side auth store to never initialize even
though server-side cookies were present.

Spread parent data in the return to ensure auth, isAuthenticated, and
other server data flows to components properly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 02:22:03 -08:00
Devin AI
908fc5a44a fix: deduplicate search results to prevent duplicate key error
The API may return the same item across multiple pages during infinite scroll.
This causes Svelte's keyed each block to throw a duplicate key error.

Fix by deduplicating results by id using a Map before rendering.

Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-29 09:05:17 +00:00
Devin AI
f520457e28 feat: migrate components to TanStack Query v6
- Migrate JobSkillSelectionSidebar to use createInfiniteQuery with jobQueries.skills()
- Migrate SearchContent to use createInfiniteQuery with searchQueries
- Migrate user profile page ([username]/+page.svelte) to use createInfiniteQuery with SSR
- Migrate teams explore page to use createInfiniteQuery with partyQueries.list()

All components now use:
- TanStack Query v6 infinite query pattern
- Debounced search (debounce the value, not the query)
- IsInViewport from runed for infinite scroll detection
- Proper loading, error, and empty states
- Type-safe query options from query factories

Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-29 08:52:32 +00:00
devin-ai-integration[bot]
5764161803
feat: add TanStack Query v6 integration with SSR support (#441)
## Summary

This PR establishes the foundation for migrating from custom Svelte 5
resource classes to TanStack Query v6 for server state management. It
adds:

**Query Options Factories** (in `src/lib/api/queries/`):
- `party.queries.ts` - Party fetching with infinite scroll support
- `job.queries.ts` - Job and skill queries with pagination
- `user.queries.ts` - User profile, parties, and favorites queries

**Mutation Configurations** (in `src/lib/api/mutations/`):
- `party.mutations.ts` - Party CRUD with cache invalidation
- `grid.mutations.ts` - Weapon/character/summon mutations with
optimistic updates
- `job.mutations.ts` - Job and skill update mutations

**Deprecation Notices**:
- Added `@deprecated` JSDoc to `search.resource.svelte.ts` and
`party.resource.svelte.ts` with migration examples

**SSR Integration** (Phase 4):
- Created `+layout.ts` to initialize QueryClient for SSR support
- Updated `+layout.svelte` to receive QueryClient from load function
- Added SSR utilities in `src/lib/query/ssr.ts`:
  - `withInitialData()` - for pages using +page.server.ts
- `prefetchQuery()` / `prefetchInfiniteQuery()` - for pages using
+page.ts
  - `setQueryData()` - for direct cache population
- Added documentation in `src/lib/query/README.md`

**Component Wiring Examples** (Phase 5):
- `JobSelectionSidebar.svelte` - Migrated from `createJobResource()` to
`createQuery(() => jobQueries.list())`. Demonstrates client-side query
pattern with automatic loading/error states.
- `teams/[id]/+page.svelte` - Added `withInitialData()` pattern for SSR
integration. Server-fetched party data is used as initial cache value
with background refetching support.

**Migration Guide**:
- Added `src/lib/query/MIGRATION.md` with follow-up prompts for
remaining component migrations (JobSkillSelectionSidebar, search modal,
user profile, teams explore, Party mutations, resource class removal)

## Updates Since Last Revision

Fixed TypeScript type errors in the TanStack Query integration:
- `party.queries.ts`: Made `total` and `perPage` optional in
`PartyPageResult` interface to match adapter return type
- `ssr.ts`: Fixed `withInitialData` to properly handle null values using
`NonNullable<TData>` return type
- `job.mutations.ts`: Fixed slot indexing by casting through `unknown`
to `keyof typeof updatedSkills`

Type checks now pass for all files modified in this PR (16 remaining
errors are pre-existing project issues unrelated to this PR - paraglide
modules not generated, hooks.ts implicit anys).

## Review & Testing Checklist for Human

- [ ] **Verify app loads correctly**: The `+layout.ts` and
`+layout.svelte` changes are critical path - confirm the app still
renders
- [ ] **Test JobSelectionSidebar**: Open job selection sidebar and
verify jobs load correctly, search/filter works, and retry button works
on error
- [ ] **Test teams/[id] page**: Navigate to a party detail page and
verify it renders without loading flash (SSR data should be immediate)
- [ ] **Review type casts**: Check `job.mutations.ts:135` - the `as
unknown as keyof typeof` cast for slot indexing is a workaround for
jobSkills having string literal keys ('0', '1', '2', '3') while slot is
a number
- [ ] **Verify withInitialData behavior**: The `NonNullable<TData>`
return type change in `ssr.ts` should work correctly with `data.party`
which can be `Party | null`

**Recommended test plan**: 
1. Run `pnpm install` to ensure dependencies are up to date
2. Start dev server and verify the app loads without errors
3. Navigate to a party detail page (`/teams/[shortcode]`) - should
render immediately without loading state
4. Open job selection sidebar (click job icon on a party you can edit) -
verify jobs load and filtering works
5. Test error handling by temporarily breaking network - verify retry
button appears

### Notes


- Pre-existing project issues remain (paraglide modules not generated,
hooks.ts implicit anys) - these are unrelated to this PR
- Local testing could not run due to missing node_modules (vite not
found) - project setup issue
- TanStack Query devtools installation was skipped due to Storybook
version conflicts
- The existing `search.queries.ts` file was used as the pattern
reference for new query factories
- SSR approach uses hybrid pattern: existing `+page.server.ts` files
work with `withInitialData()`, while new pages can use `prefetchQuery()`
in `+page.ts`
- Migration guide includes 6 follow-up prompts for completing the
remaining component migrations

**Link to Devin run**:
https://app.devin.ai/sessions/33e97a98ae3e415aa4dc35378cad3a2b
**Requested by**: Justin Edmund (justin@jedmund.com) / @jedmund

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Justin Edmund <justin@jedmund.com>
2025-11-29 00:36:59 -08:00
53405da7eb refactor: improve grid service type safety (partial Phase 3.2)
- Created GridItemData type (GridWeapon | GridSummon | GridCharacter)
- Typed GridOperation.data field with GridItemData instead of any
- Typed draggedItem and targetItem parameters with object shapes
- Made targetPosition flexible (number | string) for swaps/moves
- Added type guard for move operation to ensure type safety

Partial implementation of Phase 3.2 - reduced any usages in grid operations.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 21:51:44 -08:00
3b2782ec89 refactor: consolidate Awakening type definition
Phase 3.1: Remove duplicate Awakening interface
- Removed unused src/lib/types/Awakening.d.ts
- Using entities.ts as single source of truth for Awakening type
- Awakening now properly uses LocalizedName interface
- No breaking changes (unused file had zero imports)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 21:48:21 -08:00
271dcb3c81 refactor: add wx-svelte-grid Cell type for database cells
Phase 2.2: Add proper type definitions for wx-svelte-grid
- Created Cell interface export in wx-svelte-grid declarations
- Updated all 9 database cell components to use Cell type
- Removed custom Props interfaces with loose IRow typing
- Improved IntelliSense support for grid component props

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 21:46:48 -08:00
c074ea8bda refactor: unify visibility types to string literals
Changed from numeric (0/1/2) to string literals ('public'/'private'/'unlisted')
- Created PartyVisibility type with const assertion
- Updated Party and PartyPreview interfaces
- Updated PartyUpdatePayload interface
- Updated Zod schemas for validation
- Updated test mocks to use string literals
- Added deprecated conversion helpers for backward compat

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 21:43:55 -08:00
ca16ca145b refactor: remove type assertions in component props
- create proper UncapStarProps and TranscendenceStarProps interfaces
- use discriminated union for StarRender type
- add function overloads for createStarProps with type safety
- remove 'as any' casts from star component spreading
- remove optionalProps workaround in SegmentedControl
- stop spreading HTMLAttributes to RadioGroupPrimitive (not supported)
2025-11-28 21:40:08 -08:00
654eabbeba fix: third-party library type issues
- remove unsupported class prop from bits-ui SelectPrimitive.Root
- add type assertion for RadioGroupPrimitive spread props (as any)
- remove wx-svelte-grid Cell import (not exported)
- simplify LastUpdatedCell props with index signature for grid props
2025-11-28 21:05:00 -08:00
009758a997 fix: API adapters and type mapping
- transform job skills pagination meta to include page/perPage
- fix UserInfo avatar type (optional properties -> required when present)
- add visibility number-to-string mapping in party service (0=public, 1=private, 2=unlisted)
- change mapToApiPayload return type from Partial<Party> to CreatePartyParams
- fix raid/job mapping to use IDs instead of nested objects
- add generic type argument to RestDataProvider<any>
- add type assertion in optionalProps (value as T[keyof T])
2025-11-28 21:04:51 -08:00
073bed01d3 fix: component props and type assertions
- make UncapIndicator StarRender props optional for transcendence stars
- add type assertion for star props spreading (as any)
- fix element name type (string -> literal union with type assertion)
- fix PartySegmentedControl props (value/onValueChange -> selectedTab/onTabChange)
- remove userGender prop (component gets it from context)
- add type assertions for ResourceType and ImageVariant comparisons
- add required id/shortcode to Party object in teams/new
- fix auth hooks expiresAt (undefined -> empty string default)
- add type assertion for Select value binding (excludes null/boolean)
2025-11-28 21:04:39 -08:00
c821873ac6 fix: test fixtures and awakening type issues
- remove recruits property from Character test mock (doesn't exist in type)
- add missing subaura property to Summon test mocks
- consolidate Awakening imports to use entities source
- make awakening type/level optional in GridWeapon/GridSummon
- fix null handling in AwakeningDisplay (null -> undefined)
2025-11-28 21:04:26 -08:00
6dc10ce414 fix: Phase 8 - fix test fixture and adapter issues (24 -> 22 errors)
Fixed remaining test mock data to match actual type schemas.

Changes:
1. entity.adapter.test.ts:
   - Removed invalid maxLevel property from Character mock
   - Character interface doesn't have maxLevel

2. grid.adapter.test.ts:
   - Added missing required properties to Weapon mock:
     - maxSkillLevel: 15
     - maxAwakeningLevel: 5
     - ax: true
     - axType: 1
   - Removed invalid series property from Summon mock
     - Summon interface doesn't have series property

3. settings/+page.svelte:
   - Fixed users.update call (removed extra fetch parameter)

All test mocks now match their corresponding type definitions from
entities.ts, ensuring tests can compile and run correctly.

Result: 24 → 22 errors (-2)

Overall progress: 53 → 22 errors (58% reduction)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 20:07:34 -08:00
c9c37a2a28 fix: Phase 8a - fix users.update function call (24 -> 23 errors)
Fixed incorrect function call to users.update by removing extra fetch argument.

The issue: settings page was calling users.update(fetch, userId, updateData)
but the function signature is users.update(userId, updateData).

The fetch parameter is not needed - the users.update function uses the global
fetch internally via userAdapter.

Changes:
- src/routes/settings/+page.svelte:
  - Removed fetch argument from users.update call
  - Changed from: users.update(fetch, account.userId, updateData)
  - Changed to: users.update(account.userId, updateData)

Result: 24 → 23 errors (-1)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 20:05:12 -08:00
e0810781f4 fix: Phase 7d - fix null/undefined handling (28 -> 24 errors)
Fixed multiple null/undefined type errors by adding proper null checks
and default values.

Changes:
1. CharacterRep.svelte:
   - Changed import from '$lib/types/enums' to '$lib/utils/element'
   - getElementClass in utils/element accepts undefined, enums version doesn't

2. ItemHeader.svelte:
   - Convert null to undefined for gridUncapLevel and gridTranscendence
   - getCharacterPose expects 'number | undefined', not 'number | null | undefined'

3. UncapStatusDisplay.svelte:
   - Added null coalescing for transcendenceStep check
   - Changed from `transcendenceStep > 0` to `(transcendenceStep ?? 0) > 0`

4. base.adapter.ts:
   - Provide default no-op function for optional onError callback
   - Required<AdapterOptions> needs all properties defined

Result: 28 → 24 errors (-4)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 20:04:02 -08:00
9fb2e2485d fix: Phase 7c - fix Touch/drag-drop types (32 -> 28 errors)
Fixed TypeScript errors where custom drag data was being stored on the
native Touch type, which doesn't allow extension.

The issue: `currentTouch` was typed as `Touch | null` but the code was
trying to store custom properties (item, source, type) on it for pending
drag operations initiated by mouse pointer events.

The fix: Created a new `PendingDragData` interface to properly type the
custom drag data being stored for mouse events.

Changes:
- src/lib/composables/drag-drop.svelte.ts:
  - Added PendingDragData interface with item, source, type
  - Changed TouchState.currentTouch from `Touch | null` to `PendingDragData | null`
  - This allows storing pending drag data without conflicting with native Touch type

Result: 32 → 28 errors (-4)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 20:01:46 -08:00
c2329c2f7f fix: Phase 7b - suppress MSW optional dependency errors (34 -> 32 errors)
Fixed TypeScript errors for optional MSW (Mock Service Worker) test dependency.

MSW is intentionally optional - tests work with or without it. The dynamic
imports are wrapped in try-catch to gracefully handle when MSW is not installed.

Added @ts-expect-error comments to suppress TypeScript module resolution errors
for the optional dynamic imports, while maintaining the runtime fallback behavior.

Changes:
- src/lib/api/adapters/test-setup.ts:
  - Added @ts-expect-error for 'msw/node' dynamic import
  - Added @ts-expect-error for 'msw' dynamic import
  - Preserves optional dependency pattern

Result: 34 → 32 errors (-2)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 19:56:51 -08:00
e23276b4de fix: Phase 7 partial - fix test mock data errors (36 -> 34 errors)
Fixed multiple test fixture type errors to match actual schema definitions.

Changes:
1. Removed leftover optionalProps() call in users.ts (missed in Phase 2)
2. Fixed Character race field in entity.adapter.test.ts
   - Changed from object {race1, race2} to array [1, 2]
   - Matches entity.adapter.ts Character interface expectation
3. Added missing ULB stat fields to Weapon mocks in grid.adapter.test.ts
   - Added maxHpUlb and maxAtkUlb to hp/atk objects
   - Required by entities.ts Weapon interface

Result: 36 → 34 errors (-2)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 19:55:52 -08:00
aa87ccb7d7 fix: Phase 6 - fix ImageVariant type export (37 -> 36 errors)
Fixed TypeScript error where ImageVariant type wasn't accessible in the
same file that re-exported it.

The issue: Re-exporting a type with `export type { X } from 'module'`
doesn't create a local binding that can be used in the same file.

The fix: Import the type first to create a local binding, then re-export it.

Changes:
- src/lib/features/database/detail/image.ts:
  - Added: import type { ResourceType, ImageVariant } from '$lib/utils/images'
  - Kept: export type { ResourceType as ResourceKind, ImageVariant }
  - This allows ImageVariant to be used in the ImageArgs interface below

Result: 37 → 36 errors (-1)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 19:52:02 -08:00
ebc0e48e92 fix: Phase 5 - fix environment variable imports (38 -> 37 errors)
Resolved PUBLIC_SIERO_OAUTH_URL import issue by removing the intermediate
config.ts file and importing environment variables directly where needed.

Changes:
- Removed src/lib/config.ts (unnecessary abstraction layer)
- Updated src/lib/auth/oauth.ts to import PUBLIC_SIERO_API_URL directly
- Updated src/routes/auth/refresh/+server.ts to import directly
- Construct OAUTH_BASE locally as `${PUBLIC_SIERO_API_URL}/oauth`

This fixes the TypeScript error where svelte-check couldn't resolve
PUBLIC_SIERO_OAUTH_URL from the config file, even though the variable
was properly defined in .env and .svelte-kit/ambient.d.ts.

Result: 38 → 37 errors (-1)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 19:33:15 -08:00
7caa34452f fix: Phase 4 - fix test fixture type errors (42 -> 38 errors)
Fixed all test fixture mock data to match actual type definitions across
4 test files. Resolved 9 distinct type errors by correcting mock object
structures.

Files modified:
- entity.adapter.test.ts: Fixed Character mock to use nested hp/atk objects
- grid.adapter.test.ts: Fixed GridWeapon/GridCharacter/GridSummon mocks
  - Added proper entity objects (mockWeapon, mockCharacter, mockSummon)
  - Fixed transcendenceStage -> transcendenceStep
  - Removed invalid partyId/weaponId/characterId/summonId properties
- party.adapter.test.ts: Fixed Party mock
  - Changed visibility from 'public' string to 0 number
  - Removed invalid skills array from Job object
  - Added complete RaidGroup with all required properties
- user.adapter.test.ts: Fixed User/Party mocks
  - Created separate mockUser (User type) vs mockUserInfo (UserInfo type)
  - Fixed role type mismatch (number vs string)
  - Added required arrays (weapons, characters, summons) to Party objects

Result: 42 → 38 errors (-4)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 19:29:53 -08:00
45b51d8880 fix: Phase 3 - fix adapter type issues (43 -> 42 errors)
Fixed three key type definition issues in the adapter layer:

1. Added missing element property to Party interface
   - Added `element?: number` to Party type
   - Used throughout codebase but was missing from interface

2. Aligned onError callback types for consistency
   - Changed ResourceOptions.onError from Error to AdapterError
   - Now matches AdapterOptions.onError type signature

3. Exported Grid types from grid.adapter.ts
   - Re-exported GridWeapon, GridCharacter, GridSummon
   - Makes types available for test files

Files modified:
- src/lib/types/api/party.ts: Added element property
- src/lib/api/adapters/types.ts: Fixed onError callback type
- src/lib/api/adapters/grid.adapter.ts: Added type re-exports

Result: 43 → 42 errors (-1)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 19:25:23 -08:00
5d98bba30c fix: Phase 2 - remove optionalProps() shim misuse (45 -> 43 errors)
Removed inappropriate use of optionalProps() type shim from our own
codebase where we control the types. Type shims should only be used
for third-party library incompatibilities.

Files modified:
- base.adapter.ts: Removed shim from RequestOptions spreading
- grid.service.ts: Removed 3 usages from update methods
- party.service.ts: Removed import
- users.ts: Removed import and usage
- UserSettingsModal.svelte: Direct object construction
- drag-drop.svelte.ts: Direct object for DragOperation.target

Result: 45 → 43 errors (-2)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 19:23:14 -08:00
8fd7a6fb11 refactor: remove exactOptionalPropertyTypes and fix import casing
Phase 1: Configuration Fix
- Remove exactOptionalPropertyTypes from tsconfig.json
  This strict option caused 22+ incompatibilities with third-party libraries
  (bits-ui, wx-svelte-grid) without providing sufficient value
- Fix Switch.svelte import casing in settings page
  Changed from 'switch/switch.svelte' to 'switch/Switch.svelte'

Result: 53 → 45 errors (8 errors fixed)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 19:19:32 -08:00
365f84fae1 fix: improve users.ts avatar object handling
- Build avatar object separately with proper types before assignment
- Apply optionalProps before passing to updateProfile

This maintains 53 errors (65% reduction from original 151).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:57:01 -08:00
36e2916dea fix: add undefined to Button Props interface
- Add | undefined to all optional properties in Button Props interface
- This fixes 4 type errors related to Button component usage with exactOptionalPropertyTypes

Reduces errors from 57 to 53 (65% reduction from original 151).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:56:08 -08:00
a88dd89873 fix: resolve component prop exactOptionalPropertyTypes issues
- Add | undefined to DropZone Props interface (item, canDrop, onDrop)
- Fix users.ts by properly typing updates object with | undefined
- Apply optionalProps to SegmentedControl restProps spreading

Maintains 57 errors (some regressed, some fixed).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:55:03 -08:00
5dc207dc9c fix: add undefined to optional interface properties for exactOptionalPropertyTypes
- Update UserUpdateParams to include | undefined for all optional fields
- Add | undefined to CreatePartyParams and UpdatePartyParams interfaces
- Add | undefined to CreateGrid*Params interfaces (Weapon, Character, Summon)
- Transform UserUpdateParams to nested avatar structure in users.ts
- Remove unnecessary optionalProps wrappers (now handled by interface definitions)
- Fix TeamView awakening prop with conditional spreading

Reduces errors from 63 to 60.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:52:03 -08:00
84be6ea30f fix: resolve string undefined assignment errors
- Fix jobUtils proficiency type narrowing by storing intermediate values
- Add default empty string for openDescriptionSidebar title parameter
- Remove explicit undefined assignments in search resource tests

Reduces errors from 68 to 63.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:44:20 -08:00
a74653ee93 fix: apply exactOptionalPropertyTypes shims to adapters and services
- Add optionalProps shim to base.adapter.ts for RequestInit compatibility
- Apply optionalProps to UserSettingsModal updateData
- Use conditional spreading for Navigation Button element prop
- Apply optionalProps to drag-drop target object creation
- Apply optionalProps to party.service create/update methods
- Apply optionalProps to grid.service CRUD operations
- Fix transcendenceStage -> transcendenceStep typo in grid.service
- Update UserUpdateParams interface to include | undefined
- Update DragOperation interface properties to include | undefined

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:42:38 -08:00
16e24e337b fix: correct function signatures and remove redundant code
- DatabaseProvider.ts: Remove redundant normalizer check
  - Normalizer is applied by parent class, no need to apply twice
  - Fixes "Property 'normalizer' does not exist" error
- image.ts: Separate type and value exports for proper type resolution
- CharacterImageCell.svelte: Fix getCharacterImage parameter order
  - Changed (id, pose, variant) to (id, variant, pose)
- SearchContent.svelte: Fix getCharacterImage parameter order

Fixes ImageVariant type errors and property access errors.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:28:21 -08:00
b54ac91638 fix: correct type comparison errors
- jobUtils.ts: Remove string comparison for job.row (row is typed as number)
  - job.row === '1' comparison is always false, removed
- grid.service.ts: Fix swap operation to compare position with position
  - Changed i.id === operation.targetPosition to i.position === operation.targetPosition
  - targetPosition is a number (position), not a string (id)

Fixes "This comparison appears to be unintentional because the types have no overlap" errors.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:26:18 -08:00
b7aa0bf27b fix: handle optional properties with exactOptionalPropertyTypes
- errors.ts: Only assign retryAfter when defined, not undefined
- user.adapter.ts: Build UserProfileResponse conditionally
  - Only include optional properties (total, totalPages, perPage) when defined
  - Use intermediate variables to ensure type safety

Fixes exactOptionalPropertyTypes violations where `T | undefined` cannot be
assigned to optional property `prop?: T`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:17:01 -08:00
bbaa5bf221 fix: add null/undefined guards for array access and navigation
- MasteryDisplay.svelte: Use optional chaining for split()[0] array access
  - formatRingStat().split('+')[0] -> split('+')[0]?.trim() ?? ''
  - formatEarringStat().split('+')[0] -> split('+')[0]?.trim() ?? ''
- TeamView.svelte: Same fix for formatAxSkill().split('+')[0]
- +layout.svelte: Add null guards for 'to' parameter and 'mainContent' in callback
  - Check !to before accessing to.url
  - Re-check !mainContent inside requestAnimationFrame callback

Fixes "Object is possibly 'undefined'" and "is possibly 'null'" errors with
noUncheckedIndexedAccess: true and strict null checks.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:15:09 -08:00
de73c1937e fix: correct function call argument counts
- party.service.ts: Remove invalid `headers` parameter from adapter calls
  - create(), update(), remix() methods don't accept headers parameter
- party.ts schema: Add key type to z.record() calls
  - z.record() requires 2 arguments: z.record(keySchema, valueSchema)

Fixes "Expected N arguments, but got M" errors.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:09:05 -08:00
2da99a7bf8 fix: add type annotations for implicit any parameters
- database/weapons/+page.svelte: Add types to template functions (nameObj, rarity)
- database/summons/+page.svelte: Add types to template functions (nameObj, rarity)
- JobSkillSlot.svelte: Add type annotations to snippet parameters (locked, skill, skillIconUrl, slot)
- BasicInfoSection.svelte: Add types to map callbacks (r, p)
- DatabaseProvider.ts: Add type to normalizer callback parameter (item)

Fixes "Parameter 'X' implicitly has an 'any' type" errors (12 instances fixed).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:07:34 -08:00
e52f6ef479 fix: consolidate WeaponKey type definition
- Update entities.ts WeaponKey to include all required fields (granblue_id, series, group, order)
- Use snake_case naming (granblue_id) to match API/database conventions
- Update modifiers.ts to import from entities.ts and use snake_case property
- Removes duplicate WeaponKey type and eliminates type conflicts

Fixes "Property 'granblueId' does not exist on type 'WeaponKey'" and type assignment errors.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:05:46 -08:00
c750f5b069 fix: add null guards for uncapLevel usage
- UncapIndicator.svelte: Use nullish coalescing for uncapLevel comparison
- UncapStatusDisplay.svelte: Guard uncapLevel in badge active checks

Fixes "'uncapLevel' is possibly 'null'" errors.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:05:39 -08:00
a748884faf fix: consolidate SearchResult type definition
- Remove duplicate generic SearchResult<T> from types.ts
- Export SearchResult from search.adapter.ts via index.ts
- Eliminates type conflict between two incompatible SearchResult definitions

This fixes "Type 'SearchResult' is not assignable to type 'SearchResult<any>'" errors.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:05:33 -08:00
a4b9e0e30a fix: bits-ui component type mismatches with exactOptionalPropertyTypes
- Select.svelte: Use conditional spreading for optional `disabled` prop and `value` prop
- Switch.svelte: Conditionally spread `name` and `value` props
- Segment/RepSegment: Remove HTMLButtonAttributes extension and handle disabled prop properly
- Replace inline `import('svelte').Snippet` with proper import statements

Fixes type errors where bits-ui prop types don't include explicit `undefined` for optional properties, which conflicts with `exactOptionalPropertyTypes: true`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 18:05:27 -08:00
Devin AI
67eb624bfc fix: type errors cleanup (161 -> 130 errors)
- Fix Party.svelte: add null checks for existingChar/existingWeapon/existingSummon
- Fix DropdownItem.svelte: replace asChild with child snippet pattern for bits-ui v2
- Fix UncapStar.svelte, TranscendenceStar.svelte: tabIndex -> tabindex
- Fix Party.svelte, Navigation.svelte: remove asChild prop usage
- Fix images.ts: add | undefined to pose/element params for exactOptionalPropertyTypes
- Fix ItemHeader.svelte, UncapIndicator.svelte: accept number | null | undefined
- Fix GridRepCollection.svelte, GuidebookUnit.svelte: PartyView -> Party type
- Fix search.adapter.ts: add optional type property to SearchResult
- Update various Props interfaces for exactOptionalPropertyTypes compliance

Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-28 21:58:11 +00:00
Devin AI
8178b8592f docs: update NEXT_SESSION_PROMPT.md with current progress (161 errors remaining)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-28 21:25:11 +00:00
Devin AI
791d0b52d0 fix: DetailScaffold.svelte optional props (162 -> 161 errors)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-28 21:23:03 +00:00
Devin AI
574b4b0e7f fix: database/characters/[id]/+page.svelte UncapData type (163 -> 162 errors)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-28 21:19:50 +00:00
Devin AI
0d3aca286a fix: sidebar.svelte.ts Component type to accept any props (166 -> 163 errors)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-28 21:17:55 +00:00
Devin AI
3b89628e7e fix: Party.svelte editKey type (string | null -> string | undefined)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-28 21:15:37 +00:00
Devin AI
f07e27abe8 fix: teams/new/+page.svelte position type assertions (172 -> 166 errors)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-28 21:14:23 +00:00