diff --git a/package.json b/package.json index c019bb95..8741c3d8 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,7 @@ "tauri": "tauri", "test": "vitest run --coverage", "preview": "vite preview", - "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "minify-icons": "node src/tools/minify-icon-font.js", "version": "node src/tools/version.js && git add src-tauri/Cargo.toml && git add src-tauri/tauri.conf.json", "lint": "prettier --check .", diff --git a/src/env.d.ts b/src/env.d.ts index f634f50e..7f6b0b03 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -11,7 +11,7 @@ interface ImportMetaEnv { readonly VITE_HOMEPAGE_URL: string; readonly VITE_BUGS_URL: string; readonly VITE_DOCS_URL: string; - readonly VIET_LEARN_URL: string; + readonly VITE_LEARN_URL: string; readonly VITE_LATEST_FIRMWARE: string; } diff --git a/src/i18n/formatters.ts b/src/i18n/formatters.ts index 80e1342d..2b7f8c77 100644 --- a/src/i18n/formatters.ts +++ b/src/i18n/formatters.ts @@ -2,7 +2,7 @@ import type { FormattersInitializer } from "typesafe-i18n"; import type { Locales, Formatters } from "./i18n-types"; export const initFormatters: FormattersInitializer = ( - locale: Locales, + _locale: Locales, ) => { const formatters: Formatters = { // add your formatter functions here diff --git a/src/lib/backup/backup.ts b/src/lib/backup/backup.ts index dd5f19e6..82a9eb97 100644 --- a/src/lib/backup/backup.ts +++ b/src/lib/backup/backup.ts @@ -95,6 +95,7 @@ export function restoreFromFile( switch (file.type) { case "backup": { const recent = file.history[0]; + if (!recent) return; if (recent[1].device !== get(serialPort)?.device) { alert("Backup is incompatible with this device"); throw new Error("Backup is incompatible with this device"); @@ -177,7 +178,7 @@ export function getChangesFromLayoutFile(file: CharaLayoutFile) { const changes: Change[] = []; for (const [layer, keys] of file.layout.entries()) { for (const [id, action] of keys.entries()) { - if (get(layout)[layer][id].action !== action) { + if (get(layout)[layer]?.[id]?.action !== action) { changes.push({ type: ChangeType.Layout, layer, diff --git a/src/lib/backup/compat/legacy-chords.ts b/src/lib/backup/compat/legacy-chords.ts index 2450975c..7a565bdc 100644 --- a/src/lib/backup/compat/legacy-chords.ts +++ b/src/lib/backup/compat/legacy-chords.ts @@ -13,11 +13,11 @@ export function csvChordsToJson(csv: string): CharaChordFile { .map((line) => { const [input, output] = line.split(/,(?=[^,]*$)/, 2); return [ - input + input! .split("+") .map((it) => KEYMAP_IDS.get(it.trim())?.code ?? 0) .sort((a, b) => a - b), - output + output! .trim() .split("") .map((it) => KEYMAP_IDS.get(SPECIAL_KEYS.get(it) ?? it)?.code ?? 0), diff --git a/src/lib/backup/compat/legacy-layout.ts b/src/lib/backup/compat/legacy-layout.ts index 2efbb315..07e04bf4 100644 --- a/src/lib/backup/compat/legacy-layout.ts +++ b/src/lib/backup/compat/legacy-layout.ts @@ -17,7 +17,7 @@ export function csvLayoutToJson( for (const layer of csv.trim().split("\n")) { const [layerId, key, action] = layer.substring(1).split(",").map(Number); - layout.layout[Number(layerId) - 1][Number(key)] = Number(action); + layout.layout[Number(layerId) - 1]![Number(key)] = Number(action); } return layout; diff --git a/src/lib/components/Action.svelte b/src/lib/components/Action.svelte index 35674aeb..96351740 100644 --- a/src/lib/components/Action.svelte +++ b/src/lib/components/Action.svelte @@ -10,7 +10,7 @@ $: info = typeof action === "number" - ? KEYMAP_CODES[action] ?? { code: action } + ? KEYMAP_CODES.get(action) ?? { code: action } : action; $: dynamicMapping = info.keyCode && $osLayout.get(info.keyCode); diff --git a/src/lib/components/ActionListItem.svelte b/src/lib/components/ActionListItem.svelte index 380d085a..fbd6f8ca 100644 --- a/src/lib/components/ActionListItem.svelte +++ b/src/lib/components/ActionListItem.svelte @@ -6,7 +6,7 @@ export let id: number | KeyInfo; - $: key = (typeof id === "number" ? KEYMAP_CODES[id] ?? id : id) as + $: key = (typeof id === "number" ? KEYMAP_CODES.get(id) ?? id : id) as | number | KeyInfo; @@ -25,10 +25,10 @@ {#if key.description} {key.description} {/if} - {#if key.category.name === "ASCII Macros"} + {#if key.category?.name === "ASCII Macros"} {@html $LL.actionSearch.SHIFT_WARNING()} {/if} - {#if key.category.name === "CP-1252"} + {#if key.category?.name === "CP-1252"} {@html $LL.actionSearch.ALT_CODE_WARNING()} {/if} diff --git a/src/lib/components/PwaStatus.svelte b/src/lib/components/PwaStatus.svelte index 337b2e99..ac27e9bb 100644 --- a/src/lib/components/PwaStatus.svelte +++ b/src/lib/components/PwaStatus.svelte @@ -1,4 +1,5 @@ {#each positions as position, layer} - {@const { action: actionId, isApplied } = $layout[layer][key.id] ?? { + {@const { action: actionId, isApplied } = $layout[layer]?.[key.id] ?? { action: 0, isApplied: true, }} - {@const { code, icon, id, display, title, keyCode, variant } = KEYMAP_CODES[ - actionId - ] ?? { code: actionId }} + {@const { code, icon, id, display, title, keyCode, variant } = + KEYMAP_CODES.get(actionId) ?? { code: actionId }} {@const dynamicMapping = keyCode && $osLayout.get(keyCode)} {@const tooltip = (title ?? id ?? `0x${code.toString(16)}`) + @@ -53,7 +52,7 @@ style:scale={isActive ? 1 : `var(--inactive-scale, ${inactiveScale})`} style:translate={isActive ? "0 0 0" - : `${direction[0].toPrecision(2)}px ${direction[1].toPrecision(2)}px 0`} + : `${direction[0]?.toPrecision(2)}px ${direction[1]?.toPrecision(2)}px 0`} style:rotate="{rotate}deg" use:action={{ title: tooltip }} > diff --git a/src/lib/dialogs/PickChangesDialog.svelte b/src/lib/dialogs/PickChangesDialog.svelte index 353705b6..8b5079bb 100644 --- a/src/lib/dialogs/PickChangesDialog.svelte +++ b/src/lib/dialogs/PickChangesDialog.svelte @@ -119,17 +119,21 @@ diff --git a/src/lib/serial/TauriSerialDialog.svelte b/src/lib/serial/TauriSerialDialog.svelte index 93ebc52e..44dcd091 100644 --- a/src/lib/serial/TauriSerialDialog.svelte +++ b/src/lib/serial/TauriSerialDialog.svelte @@ -3,7 +3,7 @@ export let ports: SerialPort[]; const dispatch = createEventDispatcher<{ confirm: SerialPort | undefined }>(); - let selected = ports[0].getInfo().name; + let selected = ports[0]?.getInfo().name; diff --git a/src/lib/serial/chord.ts b/src/lib/serial/chord.ts index 0ccf2ac8..959be4e3 100644 --- a/src/lib/serial/chord.ts +++ b/src/lib/serial/chord.ts @@ -37,7 +37,7 @@ export function serializeActions(actions: number[]): bigint { let native = 0n; for (let i = 1; i <= actions.length; i++) { native |= - BigInt(actions[actions.length - i] & 0x3ff) << BigInt((12 - i) * 10); + BigInt(actions[actions.length - i]! & 0x3ff) << BigInt((12 - i) * 10); } return native; } diff --git a/src/lib/serial/connection.ts b/src/lib/serial/connection.ts index 6cc863b5..862e9b6d 100644 --- a/src/lib/serial/connection.ts +++ b/src/lib/serial/connection.ts @@ -67,7 +67,9 @@ export async function sync() { syncStatus.set("downloading"); const max = - Object.keys(settingInfo.settings).length + device.keyCount * 3 + chordCount; + Object.keys(settingInfo["settings"]).length + + device.keyCount * 3 + + chordCount; let current = 0; syncProgress.set({ max, current }); function progressTick() { @@ -76,7 +78,7 @@ export async function sync() { } const parsedSettings: number[] = []; - for (const key in settingInfo.settings) { + for (const key in settingInfo["settings"]) { try { parsedSettings[Number.parseInt(key)] = await device.getSetting( Number.parseInt(key), @@ -89,7 +91,7 @@ export async function sync() { const parsedLayout: CharaLayout = [[], [], []]; for (let layer = 1; layer <= 3; layer++) { for (let i = 0; i < device.keyCount; i++) { - parsedLayout[layer - 1][i] = await device.getLayoutKey(layer, i); + parsedLayout[layer - 1]![i] = await device.getLayoutKey(layer, i); progressTick(); } } diff --git a/src/lib/serial/device.ts b/src/lib/serial/device.ts index ece1ebf9..6e1f11e9 100644 --- a/src/lib/serial/device.ts +++ b/src/lib/serial/device.ts @@ -48,11 +48,17 @@ export async function getViablePorts(): Promise { ); } +type LengthArray = number extends N + ? T[] + : R["length"] extends N + ? R + : LengthArray; + export async function canAutoConnect() { return getViablePorts().then((it) => it.length === 1); } -function timeout(promise: Promise, ms: number): Promise { +async function timeout(promise: Promise, ms: number): Promise { let timer: number; return Promise.race([ promise, @@ -96,7 +102,7 @@ export class CharaDevice { const ports = await getViablePorts(); this.port = !manual && ports.length === 1 - ? ports[0] + ? ports[0]! : await navigator.serial.requestPort({ filters: [...PORT_FILTERS.values()], }); @@ -115,9 +121,9 @@ export class CharaDevice { await this.port.close(); this.version = new SemVer( - await this.send("VERSION").then(([version]) => version), + await this.send(1, "VERSION").then(([version]) => version), ); - const [company, device, chipset] = await this.send("ID"); + const [company, device, chipset] = await this.send(3, "ID"); this.company = company as "CHARACHORDER"; this.device = device as "ONE" | "LITE" | "X"; this.chipset = chipset as "M0" | "S2"; @@ -186,6 +192,7 @@ export class CharaDevice { return it; }); } + return undefined; } /** @@ -256,20 +263,38 @@ export class CharaDevice { /** * Send to serial port */ - async send(...command: string[]) { + async send( + expectedLength: T, + ...command: string[] + ): Promise> { return this.runWith(async (send, read) => { await send(...command); const commandString = command .join(" ") .replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); - return read().then((it) => - it.replace(new RegExp(`^${commandString} `), "").split(" "), - ); + const readResult = await read(); + if (readResult === undefined) { + console.error("No response"); + return Array(expectedLength).fill("NO_RESPONSE") as LengthArray< + string, + T + >; + } + const array = readResult + .replace(new RegExp(`^${commandString} `), "") + .split(" "); + if (array.length < expectedLength) { + console.error("Response too short"); + return array.concat( + Array(expectedLength - array.length).fill("TOO_SHORT"), + ) as LengthArray; + } + return array as LengthArray; }); } async getChordCount(): Promise { - const [count] = await this.send("CML C0"); + const [count] = await this.send(1, "CML C0"); return Number.parseInt(count); } @@ -277,7 +302,7 @@ export class CharaDevice { * Retrieves a chord by index */ async getChord(index: number | number[]): Promise { - const [actions, phrase] = await this.send(`CML C1 ${index}`); + const [actions, phrase] = await this.send(2, `CML C1 ${index}`); return { actions: parseChordActions(actions), phrase: parsePhrase(phrase), @@ -289,6 +314,7 @@ export class CharaDevice { */ async getChordPhrase(actions: number[]): Promise { const [phrase] = await this.send( + 1, `CML C2 ${stringifyChordActions(actions)}`, ); return phrase === "2" ? undefined : parsePhrase(phrase); @@ -296,6 +322,7 @@ export class CharaDevice { async setChord(chord: Chord) { const [status] = await this.send( + 1, "CML", "C3", stringifyChordActions(chord.actions), @@ -306,10 +333,10 @@ export class CharaDevice { async deleteChord(chord: Pick) { const status = await this.send( + 1, `CML C4 ${stringifyChordActions(chord.actions)}`, ); - console.log(status); - if (status.at(-1) !== "2" && status.at(-1) !== "0") + if (status?.at(-1) !== "2" && status?.at(-1) !== "0") throw new Error(`Failed with status ${status}`); } @@ -320,8 +347,7 @@ export class CharaDevice { * @param action the assigned action id */ async setLayoutKey(layer: number, id: number, action: number) { - const [status] = await this.send(`VAR B4 A${layer} ${id} ${action}`); - console.log(status); + const [status] = await this.send(1, `VAR B4 A${layer} ${id} ${action}`); if (status !== "0") throw new Error(`Failed with status ${status}`); } @@ -332,7 +358,7 @@ export class CharaDevice { * @returns the assigned action id */ async getLayoutKey(layer: number, id: number) { - const [position, status] = await this.send(`VAR B3 A${layer} ${id}`); + const [position, status] = await this.send(2, `VAR B3 A${layer} ${id}`); if (status !== "0") throw new Error(`Failed with status ${status}`); return Number(position); } @@ -345,7 +371,7 @@ export class CharaDevice { * **This does not need to be called for chords** */ async commit() { - const [status] = await this.send("VAR B0"); + const [status] = await this.send(1, "VAR B0"); if (status !== "0") throw new Error(`Failed with status ${status}`); } @@ -357,6 +383,7 @@ export class CharaDevice { */ async setSetting(id: number, value: number) { const [status] = await this.send( + 1, `VAR B2 ${id.toString(16).toUpperCase()} ${value}`, ); if (status !== "0") throw new Error(`Failed with status ${status}`); @@ -367,6 +394,7 @@ export class CharaDevice { */ async getSetting(id: number): Promise { const [value, status] = await this.send( + 2, `VAR B1 ${id.toString(16).toUpperCase()}`, ); if (status !== "0") @@ -380,14 +408,14 @@ export class CharaDevice { * Reboots the device */ async reboot() { - await this.send("RST"); + await this.send(0, "RST"); } /** * Reboots the device to the bootloader */ async bootloader() { - await this.send("RST BOOTLOADER"); + await this.send(0, "RST BOOTLOADER"); } /** @@ -396,7 +424,7 @@ export class CharaDevice { async reset( type: "FACTORY" | "PARAMS" | "KEYMAPS" | "STARTER" | "CLEARCML" | "FUNC", ) { - await this.send(`RST ${type}`); + await this.send(0, `RST ${type}`); } /** @@ -405,6 +433,6 @@ export class CharaDevice { * This is useful for debugging when there is a suspected heap or stack issue. */ async getRamBytesAvailable(): Promise { - return Number(await this.send("RAM")); + return Number(await this.send(1, "RAM").then(([bytes]) => bytes)); } } diff --git a/src/lib/serial/keymap-codes.ts b/src/lib/serial/keymap-codes.ts index 0fe1c999..b9912f0b 100644 --- a/src/lib/serial/keymap-codes.ts +++ b/src/lib/serial/keymap-codes.ts @@ -2,7 +2,7 @@ import type { ActionInfo, KeymapCategory } from "$lib/assets/keymaps/keymap"; export interface KeyInfo extends Partial { code: number; - category: KeymapCategory; + category?: KeymapCategory; } export const KEYMAP_CATEGORIES = (await Promise.all( @@ -11,7 +11,7 @@ export const KEYMAP_CATEGORIES = (await Promise.all( ), )) as KeymapCategory[]; -export const KEYMAP_CODES: Record = Object.fromEntries( +export const KEYMAP_CODES = new Map( KEYMAP_CATEGORIES.flatMap((category) => Object.entries(category.actions).map(([code, action]) => [ Number(code), @@ -20,7 +20,7 @@ export const KEYMAP_CODES: Record = Object.fromEntries( ), ); -export const KEYMAP_KEYCODES: Map = new Map( +export const KEYMAP_KEYCODES = new Map( KEYMAP_CATEGORIES.flatMap((category) => Object.entries(category.actions).map( ([code, action]) => [action.keyCode!, Number(code)] as const, @@ -28,7 +28,7 @@ export const KEYMAP_KEYCODES: Map = new Map( ).filter(([keyCode]) => keyCode !== undefined), ); -export const KEYMAP_IDS: Map = new Map( +export const KEYMAP_IDS = new Map( KEYMAP_CATEGORIES.flatMap((category) => Object.entries(category.actions).map( ([code, action]) => diff --git a/src/lib/serial/sem-ver.ts b/src/lib/serial/sem-ver.ts index 665872d9..63b83085 100644 --- a/src/lib/serial/sem-ver.ts +++ b/src/lib/serial/sem-ver.ts @@ -14,9 +14,9 @@ export class SemVer { console.error("Invalid version string:", versionString); } else { const [, major, minor, patch, preRelease, meta] = result; - this.major = Number.parseInt(major); - this.minor = Number.parseInt(minor); - this.patch = Number.parseInt(patch); + this.major = Number.parseInt(major ?? "NaN"); + this.minor = Number.parseInt(minor ?? "NaN"); + this.patch = Number.parseInt(patch ?? "NaN"); if (preRelease) this.preRelease = preRelease; if (meta) this.meta = meta; } diff --git a/src/lib/serial/tauri-serial.ts b/src/lib/serial/tauri-serial.ts index acf3f9c7..4f4cd309 100644 --- a/src/lib/serial/tauri-serial.ts +++ b/src/lib/serial/tauri-serial.ts @@ -40,7 +40,6 @@ function NativeSerialPort(info: SerialPortInfo): TauriSerialPort { } // @ts-expect-error polyfill -// noinspection JSConstantReassignment navigator.serial = { async getPorts(): Promise { return invoke("plugin:serial|get_serial_ports").then((ports) => @@ -69,6 +68,7 @@ navigator.serial = { props: { ports }, }); const port = await new Promise((resolve) => + // @ts-expect-error polyfill dialog.$on("confirm", resolve), ); dialog.$destroy(); diff --git a/src/lib/serial/updater.ts b/src/lib/serial/updater.ts deleted file mode 100644 index de4537ea..00000000 --- a/src/lib/serial/updater.ts +++ /dev/null @@ -1,12 +0,0 @@ -export async function updateDevice(port: SerialPort) { - await port.open({ - baudRate: 115200, - dataBits: 8, - stopBits: 1, - parity: "none", - bufferSize: 255,; - }) - - const writer = port.writable!.getWriter() - const reader = port.readable!.getReader() -} diff --git a/src/lib/serialization/actions.ts b/src/lib/serialization/actions.ts index b6e01d0b..03d8680b 100644 --- a/src/lib/serialization/actions.ts +++ b/src/lib/serialization/actions.ts @@ -23,9 +23,9 @@ export function compressActions(actions: number[]): Uint8Array { export function decompressActions(raw: Uint8Array): number[] { const actions: number[] = []; for (let i = 0; i < raw.length; i++) { - let action = raw[i]; - if (action > 0 && action < 32) { - action = (action << 8) | raw[++i]; + let action = raw[i]!; + if (action > 0 && action < 32 && i + 1 < raw.length) { + action = (action << 8) | raw[++i]!; } actions.push(action); } diff --git a/src/lib/setting.ts b/src/lib/setting.ts index 263e610c..83c990bd 100644 --- a/src/lib/setting.ts +++ b/src/lib/setting.ts @@ -16,7 +16,7 @@ export const setting: Action< const unsubscribe = settings.subscribe(async (settings) => { if (id in settings) { - const { value, isApplied } = settings[id]; + const { value, isApplied } = settings[id]!; if (type === "number") { node.value = ( inverse !== undefined diff --git a/src/lib/share.ts b/src/lib/share.ts index a50c6a76..0ce1dd81 100644 --- a/src/lib/share.ts +++ b/src/lib/share.ts @@ -10,7 +10,7 @@ export function triggerShare(event: Event) { } export const share: Action void> = ( - node, + _node, callback: (event: Event) => void, ) => { setCanShare.set(true); diff --git a/src/lib/undo-redo.ts b/src/lib/undo-redo.ts index 0885e05e..413131df 100644 --- a/src/lib/undo-redo.ts +++ b/src/lib/undo-redo.ts @@ -60,7 +60,7 @@ export const overlay = derived(changes, (changes) => { for (const change of changes) { switch (change.type) { case ChangeType.Layout: - overlay.layout[change.layer].set(change.id, change.action); + overlay.layout[change.layer]?.set(change.id, change.action); break; case ChangeType.Chord: overlay.chords.set(JSON.stringify(change.id), { @@ -92,8 +92,8 @@ export const layout = derived([overlay, deviceLayout], ([overlay, layout]) => layout.map( (actions, layer) => actions.map((action, id) => ({ - action: overlay.layout[layer].get(id) ?? action, - isApplied: !overlay.layout[layer].has(id), + action: overlay.layout[layer]?.get(id) ?? action, + isApplied: !overlay.layout[layer]?.has(id), })) as [KeyInfo, KeyInfo, KeyInfo], ), ); @@ -118,7 +118,7 @@ export const chords = derived([overlay, deviceChords], ([overlay, chords]) => { return { id: chord.actions, // use the old phrase for stable editing - sortBy: chord.phrase.map((it) => KEYMAP_CODES[it]?.id ?? it).join(), + sortBy: chord.phrase.map((it) => KEYMAP_CODES.get(it)?.id ?? it).join(), actions: changedChord.actions, phrase: changedChord.phrase, actionsChanged: id !== JSON.stringify(changedChord.actions), @@ -130,7 +130,7 @@ export const chords = derived([overlay, deviceChords], ([overlay, chords]) => { } else { return { id: chord.actions, - sortBy: chord.phrase.map((it) => KEYMAP_CODES[it]?.id ?? it).join(), + sortBy: chord.phrase.map((it) => KEYMAP_CODES.get(it)?.id ?? it).join(), actions: chord.actions, phrase: chord.phrase, phraseChanged: false, diff --git a/src/routes/ConnectionPopup.svelte b/src/routes/ConnectionPopup.svelte index 37b3c08e..fa72e2c9 100644 --- a/src/routes/ConnectionPopup.svelte +++ b/src/routes/ConnectionPopup.svelte @@ -23,16 +23,6 @@ powerDialog = false; } - async function updateFirmware() { - const { usbVendorId: vendorId, usbProductId: productId } = - $serialPort!.portInfo; - $serialPort!.bootloader(); - await new Promise((resolve) => setTimeout(resolve, 1000)); - console.log( - await navigator.usb.requestDevice({ filters: [{ vendorId, productId }] }), - ); - } - let rebootInfo = false; let terminal = false; let powerDialog = false; diff --git a/src/routes/EditActions.svelte b/src/routes/EditActions.svelte index bae7a2cb..bb3cd1d1 100644 --- a/src/routes/EditActions.svelte +++ b/src/routes/EditActions.svelte @@ -32,12 +32,13 @@ } function redo() { - const [change, ...queue] = redoQueue; - changes.update((it) => { - it.push(change); - return it; - }); - redoQueue = queue; + const change = redoQueue.shift(); + if (change) { + changes.update((it) => { + it.push(change); + return it; + }); + } } let redoQueue: Change[] = []; @@ -57,7 +58,7 @@ $LL.configure.chords.conflict.TITLE(), $LL.configure.chords.conflict.DESCRIPTION( actions - .map((it) => `${KEYMAP_CODES[it].id}`) + .map((it) => `${KEYMAP_CODES.get(it)?.id}`) .join(" "), ), $LL.configure.chords.conflict.CONFIRM(), diff --git a/src/routes/Footer.svelte b/src/routes/Footer.svelte index 692c9db1..d27522f3 100644 --- a/src/routes/Footer.svelte +++ b/src/routes/Footer.svelte @@ -68,6 +68,7 @@ {/if} + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch",
  • KEYMAP_CODES[it]?.id) + .map((it) => KEYMAP_CODES.get(it)?.id) .filter((it) => !!it) .join(""), ); @@ -51,7 +51,9 @@ function search(event: Event) { const query = (event.target as HTMLInputElement).value; searchFilter.set( - query && searchIndex ? searchIndex.search(query) : undefined, + query && searchIndex + ? (searchIndex.search(query) as number[]) + : undefined, ); page = 0; } @@ -131,10 +133,12 @@ > {/if} {#if $lastPage !== -1} - {#each $items.slice(page * $pageSize - (page === 0 ? 0 : 1), (page + 1) * $pageSize - 1) as [chord] (JSON.stringify(chord.id))} - - - + {#each $items.slice(page * $pageSize - (page === 0 ? 0 : 1), (page + 1) * $pageSize - 1) as [chord] (JSON.stringify(chord?.id))} + {#if chord} + + + + {/if} {/each} {:else} {$LL.configure.chords.search.NO_RESULTS()} diff --git a/src/routes/config/chords/ChordActionEdit.svelte b/src/routes/config/chords/ChordActionEdit.svelte index 477cdf04..fb20d1b4 100644 --- a/src/routes/config/chords/ChordActionEdit.svelte +++ b/src/routes/config/chords/ChordActionEdit.svelte @@ -51,6 +51,7 @@ }); return changes; }); + return undefined; } function addSpecial(event: MouseEvent) { diff --git a/src/routes/config/chords/ChordEdit.svelte b/src/routes/config/chords/ChordEdit.svelte index 45adc430..37d60d98 100644 --- a/src/routes/config/chords/ChordEdit.svelte +++ b/src/routes/config/chords/ChordEdit.svelte @@ -59,7 +59,7 @@ onHidden(instance) { instance.destroy(); }, - onDestroy(instance) { + onDestroy(_instance) { shareComponent.$destroy(); }, }).show(); diff --git a/src/routes/plugin/example-plugin.js b/src/routes/plugin/example-plugin.js index 1a28efc9..97c70533 100644 --- a/src/routes/plugin/example-plugin.js +++ b/src/routes/plugin/example-plugin.js @@ -1,3 +1,4 @@ +// @ts-nocheck /******************************* * HOLD UP AND READ THIS FIRST * ******************************* diff --git a/src/routes/sandbox/+page.svelte b/src/routes/sandbox/+page.svelte index 4d0482b2..b9a2ac6b 100644 --- a/src/routes/sandbox/+page.svelte +++ b/src/routes/sandbox/+page.svelte @@ -1,4 +1,5 @@