fix: type errors in svelte-main branch (219 -> 191 errors)

- Fix paraglide aliases in svelte.config.js
- Fix Checkbox.svelte: use indeterminate prop, remove restProps spread
- Fix Switch.svelte: simplify Props interface, remove restProps spread
- Fix Button.svelte: add null checks for icon prop
- Fix sidebar.svelte.ts: use explicit undefined types for exactOptionalPropertyTypes
- Fix Party.svelte: fix import extension, remove ConflictService argument
- Fix job.resource.svelte.ts: add error property to success states, fix groupJobsByTier null checks

Co-Authored-By: Justin Edmund <justin@jedmund.com>
This commit is contained in:
Devin AI 2025-11-28 21:06:05 +00:00
parent 67dadfcba7
commit cf7a036575
7 changed files with 71 additions and 64 deletions

View file

@ -25,10 +25,10 @@ export interface JobResourceOptions {
* State for job data * State for job data
*/ */
interface JobState<T> { interface JobState<T> {
data?: T data: T | undefined
loading: boolean loading: boolean
error?: AdapterError error: AdapterError | undefined
lastFetch?: number lastFetch: number | undefined
} }
/** /**
@ -65,11 +65,11 @@ export class JobResource {
private cacheDuration: number private cacheDuration: number
// Reactive state for job data // Reactive state for job data
jobs = $state<JobState<Job[]>>({ loading: false }) jobs = $state<JobState<Job[]>>({ loading: false, data: undefined, error: undefined, lastFetch: undefined })
currentJob = $state<JobState<Job>>({ loading: false }) currentJob = $state<JobState<Job>>({ loading: false, data: undefined, error: undefined, lastFetch: undefined })
jobSkills = $state<JobState<JobSkill[]>>({ loading: false }) jobSkills = $state<JobState<JobSkill[]>>({ loading: false, data: undefined, error: undefined, lastFetch: undefined })
jobAccessories = $state<JobState<JobAccessory[]>>({ loading: false }) jobAccessories = $state<JobState<JobAccessory[]>>({ loading: false, data: undefined, error: undefined, lastFetch: undefined })
allSkills = $state<JobState<JobSkill[]>>({ loading: false }) allSkills = $state<JobState<JobSkill[]>>({ loading: false, data: undefined, error: undefined, lastFetch: undefined })
// Track active requests // Track active requests
private activeRequests = new Map<string, AbortController>() private activeRequests = new Map<string, AbortController>()
@ -108,7 +108,7 @@ export class JobResource {
try { try {
const data = await this.adapter.getAll() const data = await this.adapter.getAll()
this.jobs = { data, loading: false, lastFetch: Date.now() } this.jobs = { data, loading: false, lastFetch: Date.now(), error: undefined }
return data return data
} catch (error: any) { } catch (error: any) {
if (error.code !== 'CANCELLED') { if (error.code !== 'CANCELLED') {
@ -145,7 +145,7 @@ export class JobResource {
try { try {
const data = await this.adapter.getById(id) const data = await this.adapter.getById(id)
this.currentJob = { data, loading: false, lastFetch: Date.now() } this.currentJob = { data, loading: false, lastFetch: Date.now(), error: undefined }
return data return data
} catch (error: any) { } catch (error: any) {
if (error.code !== 'CANCELLED') { if (error.code !== 'CANCELLED') {
@ -177,7 +177,7 @@ export class JobResource {
try { try {
const data = await this.adapter.getSkills(jobId) const data = await this.adapter.getSkills(jobId)
this.jobSkills = { data, loading: false, lastFetch: Date.now() } this.jobSkills = { data, loading: false, lastFetch: Date.now(), error: undefined }
return data return data
} catch (error: any) { } catch (error: any) {
if (error.code !== 'CANCELLED') { if (error.code !== 'CANCELLED') {
@ -209,7 +209,7 @@ export class JobResource {
try { try {
const data = await this.adapter.getAccessories(jobId) const data = await this.adapter.getAccessories(jobId)
this.jobAccessories = { data, loading: false, lastFetch: Date.now() } this.jobAccessories = { data, loading: false, lastFetch: Date.now(), error: undefined }
return data return data
} catch (error: any) { } catch (error: any) {
if (error.code !== 'CANCELLED') { if (error.code !== 'CANCELLED') {
@ -246,7 +246,7 @@ export class JobResource {
try { try {
const data = await this.adapter.getAllSkills() const data = await this.adapter.getAllSkills()
this.allSkills = { data, loading: false, lastFetch: Date.now() } this.allSkills = { data, loading: false, lastFetch: Date.now(), error: undefined }
return data return data
} catch (error: any) { } catch (error: any) {
if (error.code !== 'CANCELLED') { if (error.code !== 'CANCELLED') {
@ -309,11 +309,11 @@ export class JobResource {
* Clear cached data * Clear cached data
*/ */
clearCache() { clearCache() {
this.jobs = { loading: false } this.jobs = { loading: false, data: undefined, error: undefined, lastFetch: undefined }
this.currentJob = { loading: false } this.currentJob = { loading: false, data: undefined, error: undefined, lastFetch: undefined }
this.jobSkills = { loading: false } this.jobSkills = { loading: false, data: undefined, error: undefined, lastFetch: undefined }
this.jobAccessories = { loading: false } this.jobAccessories = { loading: false, data: undefined, error: undefined, lastFetch: undefined }
this.allSkills = { loading: false } this.allSkills = { loading: false, data: undefined, error: undefined, lastFetch: undefined }
} }
} }
@ -340,15 +340,17 @@ export function groupJobsByTier(jobs: Job[]): Record<string, Job[]> {
for (const job of jobs) { for (const job of jobs) {
const tier = job.row.toString().toLowerCase() const tier = job.row.toString().toLowerCase()
if (tier in tiers) { if (tier in tiers && tiers[tier]) {
tiers[tier].push(job) tiers[tier].push(job)
} }
} }
// Sort jobs within each tier by order // Sort jobs within each tier by order
for (const tier in tiers) { for (const tier in tiers) {
if (tiers[tier]) {
tiers[tier].sort((a, b) => a.order - b.order) tiers[tier].sort((a, b) => a.order - b.order)
} }
}
return tiers return tiers
} }

View file

@ -16,7 +16,7 @@
import Button from '$lib/components/ui/Button.svelte' import Button from '$lib/components/ui/Button.svelte'
import Icon from '$lib/components/Icon.svelte' import Icon from '$lib/components/Icon.svelte'
import DescriptionRenderer from '$lib/components/DescriptionRenderer.svelte' import DescriptionRenderer from '$lib/components/DescriptionRenderer.svelte'
import { openDescriptionSidebar } from '$lib/features/description/openDescriptionSidebar.svelte.ts' import { openDescriptionSidebar } from '$lib/features/description/openDescriptionSidebar.svelte'
import { DropdownMenu } from 'bits-ui' import { DropdownMenu } from 'bits-ui'
import DropdownItem from '$lib/components/ui/dropdown/DropdownItem.svelte' import DropdownItem from '$lib/components/ui/dropdown/DropdownItem.svelte'
import JobSection from '$lib/components/job/JobSection.svelte' import JobSection from '$lib/components/job/JobSection.svelte'
@ -57,7 +57,7 @@
// Services // Services
const partyService = new PartyService() const partyService = new PartyService()
const gridService = new GridService() const gridService = new GridService()
const conflictService = new ConflictService(fetch) const conflictService = new ConflictService()
// Create drag-drop context // Create drag-drop context
const dragContext = createDragDropContext({ const dragContext = createDragDropContext({

View file

@ -118,7 +118,7 @@
<span class="accessory"> <span class="accessory">
{@render leftAccessory()} {@render leftAccessory()}
</span> </span>
{:else if hasLeftIcon && !iconOnly} {:else if hasLeftIcon && !iconOnly && icon}
<span class="accessory"> <span class="accessory">
<Icon name={icon} size={iconSizes[size]} /> <Icon name={icon} size={iconSizes[size]} />
</span> </span>
@ -136,7 +136,7 @@
<span class="accessory"> <span class="accessory">
{@render rightAccessory()} {@render rightAccessory()}
</span> </span>
{:else if hasRightIcon && !iconOnly} {:else if hasRightIcon && !iconOnly && icon}
<span class="accessory"> <span class="accessory">
<Icon name={icon} size={iconSizes[size]} /> <Icon name={icon} size={iconSizes[size]} />
</span> </span>

View file

@ -2,15 +2,15 @@
<svelte:options runes={true} /> <svelte:options runes={true} />
<script lang="ts"> <script lang="ts">
import { Checkbox as CheckboxPrimitive } from 'bits-ui'; import { Checkbox as CheckboxPrimitive } from 'bits-ui';
import type { HTMLButtonAttributes } from 'svelte/elements';
interface Props extends Omit<HTMLButtonAttributes, 'value'> { interface Props {
checked?: boolean | 'indeterminate'; checked?: boolean;
indeterminate?: boolean;
disabled?: boolean; disabled?: boolean;
required?: boolean; required?: boolean;
name?: string; name?: string;
value?: string; value?: string;
onCheckedChange?: (checked: boolean | 'indeterminate') => void; onCheckedChange?: (checked: boolean) => void;
class?: string; class?: string;
variant?: 'default' | 'bound'; variant?: 'default' | 'bound';
size?: 'small' | 'medium' | 'large'; size?: 'small' | 'medium' | 'large';
@ -18,6 +18,7 @@
let { let {
checked = $bindable(false), checked = $bindable(false),
indeterminate = false,
disabled = false, disabled = false,
required = false, required = false,
name, name,
@ -25,8 +26,7 @@
onCheckedChange, onCheckedChange,
class: className, class: className,
variant = 'default', variant = 'default',
size = 'medium', size = 'medium'
...restProps
}: Props = $props(); }: Props = $props();
$effect(() => { $effect(() => {
@ -41,20 +41,22 @@
<CheckboxPrimitive.Root <CheckboxPrimitive.Root
bind:checked bind:checked
{indeterminate}
{disabled} {disabled}
{required} {required}
{name} name={name ?? ''}
{value} value={value ?? ''}
class="checkbox {sizeClass} {variantClass} {className || ''}" class="checkbox {sizeClass} {variantClass} {className || ''}"
{...restProps}
> >
<CheckboxPrimitive.Indicator class="indicator"> {#snippet children({ checked: isChecked, indeterminate: isIndeterminate })}
{#if checked === 'indeterminate'} <span class="indicator">
{#if isIndeterminate}
<span class="icon"></span> <span class="icon"></span>
{:else if checked} {:else if isChecked}
<span class="icon"></span> <span class="icon"></span>
{/if} {/if}
</CheckboxPrimitive.Indicator> </span>
{/snippet}
</CheckboxPrimitive.Root> </CheckboxPrimitive.Root>
<style lang="scss"> <style lang="scss">

View file

@ -2,9 +2,8 @@
<svelte:options runes={true} /> <svelte:options runes={true} />
<script lang="ts"> <script lang="ts">
import { Switch as SwitchPrimitive } from 'bits-ui'; import { Switch as SwitchPrimitive } from 'bits-ui';
import type { HTMLButtonAttributes } from 'svelte/elements';
interface Props extends Omit<HTMLButtonAttributes, 'value'> { interface Props {
checked?: boolean; checked?: boolean;
disabled?: boolean; disabled?: boolean;
required?: boolean; required?: boolean;
@ -23,8 +22,7 @@
value, value,
onCheckedChange, onCheckedChange,
class: className, class: className,
thumbClass, thumbClass
...restProps
}: Props = $props(); }: Props = $props();
$effect(() => { $effect(() => {
@ -41,7 +39,6 @@
{name} {name}
{value} {value}
class="switch {className || ''}" class="switch {className || ''}"
{...restProps}
> >
<SwitchPrimitive.Thumb class="thumb {thumbClass || ''}" /> <SwitchPrimitive.Thumb class="thumb {thumbClass || ''}" />
</SwitchPrimitive.Root> </SwitchPrimitive.Root>

View file

@ -5,12 +5,12 @@ export const SIDEBAR_WIDTH = '420px'
interface SidebarState { interface SidebarState {
open: boolean open: boolean
title?: string title: string | undefined
content?: Snippet content: Snippet | undefined
component?: Component component: Component | undefined
componentProps?: Record<string, any> componentProps: Record<string, any> | undefined
scrollable?: boolean scrollable: boolean
activeItemId?: string activeItemId: string | undefined
} }
class SidebarStore { class SidebarStore {
@ -20,7 +20,8 @@ class SidebarStore {
content: undefined, content: undefined,
component: undefined, component: undefined,
componentProps: undefined, componentProps: undefined,
scrollable: true scrollable: true,
activeItemId: undefined
}) })
open(title?: string, content?: Snippet, scrollable = true) { open(title?: string, content?: Snippet, scrollable = true) {

View file

@ -8,7 +8,12 @@ const config = {
preprocess: vitePreprocess(), preprocess: vitePreprocess(),
kit: { kit: {
adapter: adapter(), adapter: adapter(),
alias: { $types: 'src/lib/types' } alias: {
$types: 'src/lib/types',
'$lib/paraglide/messages': 'src/paraglide/messages.js',
'$lib/paraglide/runtime': 'src/paraglide/runtime.js',
'$lib/paraglide/server': 'src/paraglide/server.js'
}
} }
} }