diff --git a/.github/actions/publish-artifacts/src/index.ts b/.github/actions/publish-artifacts/src/index.ts index d9a30ec8..48c5ba53 100644 --- a/.github/actions/publish-artifacts/src/index.ts +++ b/.github/actions/publish-artifacts/src/index.ts @@ -20,7 +20,7 @@ interface TargetConfig { } interface BuildTarget { updater: false | Updater; - standalone: TargetConfig[]; + standalone: Array; } const osTargets = { @@ -67,7 +67,7 @@ const frontendBundle = 'apps/frontend/dist.tar.xz'; const updaterName = `OneLauncher-Updater-${os}-${arch}`; const frontendName = `OneLauncher-Frontend-${os}-${arch}`; -const globFiles = async (pattern: string): Promise => await (await glob.create(pattern)).glob(); +const globFiles = async (pattern: string): Promise> => await (await glob.create(pattern)).glob(); async function uploadFrontend() { if (!(await exists(frontendBundle))) { diff --git a/apps/oneclient/frontend/package.json b/apps/oneclient/frontend/package.json index c97fb0fb..7a5ea661 100644 --- a/apps/oneclient/frontend/package.json +++ b/apps/oneclient/frontend/package.json @@ -8,8 +8,7 @@ "build": "vite build && tsc", "serve": "vite preview", "lint": "eslint", - "format": "prettier", - "check": "prettier --write . && eslint --fix" + "check": "eslint --fix" }, "dependencies": { "@fontsource/poppins": "catalog:", diff --git a/apps/oneclient/frontend/prettier.config.js b/apps/oneclient/frontend/prettier.config.js deleted file mode 100644 index adcd2f4d..00000000 --- a/apps/oneclient/frontend/prettier.config.js +++ /dev/null @@ -1,10 +0,0 @@ -// @ts-check - -/** @type {import('prettier').Config} */ -const config = { - semi: true, - singleQuote: true, - trailingComma: 'all', -}; - -export default config; diff --git a/apps/oneclient/frontend/src/routes/app/route.tsx b/apps/oneclient/frontend/src/routes/app/route.tsx index 6a4fd5bf..5de18320 100644 --- a/apps/oneclient/frontend/src/routes/app/route.tsx +++ b/apps/oneclient/frontend/src/routes/app/route.tsx @@ -1,10 +1,11 @@ -import { useEffect, type PropsWithChildren } from 'react'; +import type { PropsWithChildren } from 'react'; import { LoaderSuspense, Navbar } from '@/components'; import { GameBackground } from '@/components/GameBackground'; import useAppShellStore from '@/stores/appShellStore'; import { AnimatedOutlet } from '@onelauncher/common/components'; import { createFileRoute, useRouter } from '@tanstack/react-router'; import { AnimatePresence } from 'motion/react'; +import { useEffect } from 'react'; export const Route = createFileRoute('/app')({ component: RouteComponent, @@ -40,12 +41,12 @@ function AppShell({ const setPrevLocation = useAppShellStore(state => state.setPrevLocation); useEffect(() => { - const unsub = router.subscribe("onBeforeNavigate", (e) => { + const unsub = router.subscribe('onBeforeNavigate', (e) => { setPrevLocation(e.fromLocation ?? null); }); return () => unsub(); - }, [router]); + }, [router, setPrevLocation]); return (
diff --git a/apps/oneclient/frontend/tsconfig.json b/apps/oneclient/frontend/tsconfig.json index 3dd88644..e442b494 100644 --- a/apps/oneclient/frontend/tsconfig.json +++ b/apps/oneclient/frontend/tsconfig.json @@ -25,5 +25,5 @@ "skipLibCheck": true, "noUncheckedSideEffectImports": true }, - "include": ["**/*.ts", "**/*.tsx", "prettier.config.js", "vite.config.js"] + "include": ["**/*.ts", "**/*.tsx", "vite.config.ts"] } diff --git a/apps/oneclient/frontend/vite.config.js b/apps/oneclient/frontend/vite.config.ts similarity index 100% rename from apps/oneclient/frontend/vite.config.js rename to apps/oneclient/frontend/vite.config.ts diff --git a/apps/onelauncher/frontend/src/components/content/PackageItem.tsx b/apps/onelauncher/frontend/src/components/content/PackageItem.tsx index d6be3924..1a1ef302 100644 --- a/apps/onelauncher/frontend/src/components/content/PackageItem.tsx +++ b/apps/onelauncher/frontend/src/components/content/PackageItem.tsx @@ -1,7 +1,7 @@ import type { Provider, SearchResult } from '@/bindings.gen'; import { abbreviateNumber, LOADERS, upperFirst } from '@/utils'; import { Show, Tooltip } from '@onelauncher/common/components'; -import { Link, useNavigate } from '@tanstack/react-router'; +import { Link } from '@tanstack/react-router'; import { Download01Icon } from '@untitled-theme/icons-react'; import { useMemo } from 'react'; import { Focusable } from 'react-aria-components'; @@ -22,7 +22,7 @@ export function PackageGrid({ items, provider }: { items: Array; p } export function PackageItem({ provider, ...item }: SearchResult & { provider: Provider }) { - const loaders = useMemo(() => item.categories.filter(cat => includes(LOADERS, cat)), []); + const loaders = useMemo(() => item.categories.filter(cat => includes(LOADERS, cat)), [item.categories]); return ( { if (query.filters?.categories || query.query) navigate({ to: '/app/browser/search' }); - }, [query]); + }, [navigate, query]); const context = useMemo(() => ({ cluster, diff --git a/apps/onelauncher/frontend/src/hooks/useCluster.tsx b/apps/onelauncher/frontend/src/hooks/useCluster.tsx index c188f7c1..23220181 100644 --- a/apps/onelauncher/frontend/src/hooks/useCluster.tsx +++ b/apps/onelauncher/frontend/src/hooks/useCluster.tsx @@ -1,10 +1,10 @@ import type { ClusterModel } from '@/bindings.gen'; import type { ModalProps } from '@/components/overlay/Modal'; +import Modal from '@/components/overlay/Modal'; import { bindings } from '@/main'; import { useCommand } from '@onelauncher/common'; -import { useEffect, useState } from 'react'; -import Modal from '@/components/overlay/Modal'; import { Button, Dropdown } from '@onelauncher/common/components'; +import { useEffect, useState } from 'react'; import { Heading } from 'react-aria-components'; export function useRecentCluster() { @@ -58,26 +58,29 @@ export function useClusters() { } type ChooseClusterModalProps = ModalProps & { - clusters?: ClusterModel[]; + clusters?: Array; confirmText?: string; - selected?: (clusters: ClusterModel[]) => number; + selected?: (clusters: Array) => number; onSelected?: (cluster: ClusterModel) => void; }; - -export function ChooseClusterModal({clusters: clusterList, selected: defaultSelected, onSelected, confirmText, ...props}: ChooseClusterModalProps) { - const clusters = useClusters() +export function ChooseClusterModal({ clusters: clusterList, selected: defaultSelected, onSelected, confirmText, ...props }: ChooseClusterModalProps) { + const clusters = useClusters(); const [selected, setSelected] = useState(0); useEffect(() => { - if (!clusters) return; - const newSelected = defaultSelected?.(clusters) - if (newSelected) setSelected(newSelected) - }, [clusters]) + if (!clusters) + return; + + const newSelected = defaultSelected?.(clusters); + + if (newSelected) + setSelected(newSelected); + }, [clusters, defaultSelected]); function chooseCluster() { - if (clusters !== undefined && selected !== undefined) { - const cluster = clusters[selected]; + if (clusters !== undefined) { + const cluster = clusters[selected] as ClusterModel | undefined; if (cluster !== undefined) onSelected?.(cluster); } @@ -87,35 +90,35 @@ export function ChooseClusterModal({clusters: clusterList, selected: defaultSele
- Select a Cluster - { - setSelected(index as number) - }} - selectedKey={selected} - > - {clusters?.map((cluster, index) => ( - - {cluster.name} - - ))} - + Select a Cluster + { + setSelected(index as number); + }} + selectedKey={selected} + > + {clusters?.map((cluster, index) => ( + + {cluster.name} + + ))} + -
-
+
+
- ) + ); // return ( // { - if (props.page === page) + if (pageIndex === page) return; - setPage(props.page); + setPage(pageIndex); }} > - {props.page} + {pageIndex} ); } diff --git a/apps/onelauncher/frontend/src/hooks/useSettings.tsx b/apps/onelauncher/frontend/src/hooks/useSettings.tsx index cf820eee..927ea61b 100644 --- a/apps/onelauncher/frontend/src/hooks/useSettings.tsx +++ b/apps/onelauncher/frontend/src/hooks/useSettings.tsx @@ -3,7 +3,7 @@ import type { Settings } from '@/bindings.gen'; import { bindings } from '@/main'; import { useCommand } from '@onelauncher/common'; -import React, { createContext, useCallback, useContext, useEffect, useState } from 'react'; +import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'; interface SettingsControllerType { settings: Settings | undefined; @@ -12,7 +12,7 @@ interface SettingsControllerType { setSettingsToSave: (settings: Partial | null) => void; settingsChanged: boolean; setSettingsChanged: (changed: boolean) => void; - createSetting: (name: K, value: V) => [V, (value: V) => void]; + createSetting: (name: K, value: V) => [V, (v: V) => void]; } const SettingsContext = createContext(null); @@ -51,14 +51,14 @@ export function SettingsProvider({ children }: SettingsProviderProps) { return () => window.removeEventListener('beforeunload', handleBeforeUnload); }, []); - const saveChangedSettings = () => { + const saveChangedSettings = useCallback(() => { if (!settings) return; writeQuery.refetch(); setSettingsChanged(false); - }; + }, [settings, writeQuery]); const handleSetSettingsToSave = useCallback((newSettings: Partial | null) => { setSettingsToSave(newSettings); @@ -86,7 +86,7 @@ export function SettingsProvider({ children }: SettingsProviderProps) { return [value, setValue]; }, [settings]); - const controller: SettingsControllerType = { + const controller: SettingsControllerType = useMemo(() => ({ settings, saveChangedSettings, settingsToSave, @@ -94,7 +94,7 @@ export function SettingsProvider({ children }: SettingsProviderProps) { settingsChanged, setSettingsChanged, createSetting, - }; + }), [createSetting, handleSetSettingsToSave, saveChangedSettings, settings, settingsChanged, settingsToSave]); if (settings === undefined) return null; diff --git a/apps/onelauncher/frontend/src/routes/app/browser/index.tsx b/apps/onelauncher/frontend/src/routes/app/browser/index.tsx index e1e7422d..d1cb8ab7 100644 --- a/apps/onelauncher/frontend/src/routes/app/browser/index.tsx +++ b/apps/onelauncher/frontend/src/routes/app/browser/index.tsx @@ -32,6 +32,7 @@ function Featured() { const navigate = useNavigate(); const featuredImageIndex = useMemo(() => featuredPackage.data?.gallery.findIndex(image => image.featured), [featuredPackage.data]); const [selectedImage, setSelectedImage] = useState(featuredImageIndex ?? 0); + return (
diff --git a/apps/onelauncher/frontend/src/routes/app/browser/package.$provider.$slug.tsx b/apps/onelauncher/frontend/src/routes/app/browser/package.$provider.$slug.tsx index 3c6e3469..5a649bb0 100644 --- a/apps/onelauncher/frontend/src/routes/app/browser/package.$provider.$slug.tsx +++ b/apps/onelauncher/frontend/src/routes/app/browser/package.$provider.$slug.tsx @@ -56,9 +56,12 @@ function RouteComponent() { if (!includes(PROVIDERS, provider)) throw new Error('Invalid provider'); const packageData = usePackageData(provider, slug, {}); + const packageContextValue = useMemo(() => ({ + pkg: packageData.data, + }), [packageData.data]); return ( - +
@@ -121,8 +124,8 @@ function getPackageUrl(pkg: ManagedPackage): string { function BrowserSidebar({ package: pkg }: { package: ManagedPackage }) { const { provider } = Route.useParams(); - const createdAt = useMemo(() => pkg.created ? new Date(pkg.created) : null, []); - const updatedAt = useMemo(() => pkg.updated ? new Date(pkg.updated) : null, []); + const createdAt = useMemo(() => pkg.created ? new Date(pkg.created) : null, [pkg.created]); + const updatedAt = useMemo(() => pkg.updated ? new Date(pkg.updated) : null, [pkg.updated]); const authors = useCommand('getUsersFromAuthor', () => bindings.core.getUsersFromAuthor(provider as Provider, pkg.author)); @@ -303,7 +306,7 @@ function InstallButton() { aria-label="cluster" isOpen={open} onOpenChange={setOpen} onSelectionChange={(e) => { - const cluster = clusters?.find(cluster => cluster.id as unknown as number === e); + const cluster = clusters?.find(item => item.id as unknown as number === e); if (cluster) browserContext.setCluster(cluster); }} @@ -382,6 +385,7 @@ function Versions() { limit: 20, offset, }); + const pagination = usePagination({ itemsCount: versions?.total as unknown as number, itemsPerPage: versions?.limit as unknown as number, diff --git a/apps/onelauncher/frontend/src/routes/app/browser/route.tsx b/apps/onelauncher/frontend/src/routes/app/browser/route.tsx index 674d375c..9b8463ee 100644 --- a/apps/onelauncher/frontend/src/routes/app/browser/route.tsx +++ b/apps/onelauncher/frontend/src/routes/app/browser/route.tsx @@ -1,11 +1,12 @@ import type { Filters } from '@/bindings.gen'; +import type { PropsWithChildren } from 'react'; import ProviderIcon from '@/components/content/ProviderIcon'; import { BrowserProvider, useBrowserContext } from '@/hooks/useBrowser'; import { useClusters } from '@/hooks/useCluster'; import { PROVIDERS } from '@/utils'; import { browserCategories } from '@/utils/browser'; import { AnimatedOutlet, Dropdown, Show, TextField } from '@onelauncher/common/components'; -import { createFileRoute, Outlet } from '@tanstack/react-router'; +import { createFileRoute } from '@tanstack/react-router'; import { SearchMdIcon } from '@untitled-theme/icons-react'; import { useEffect, useState } from 'react'; @@ -27,7 +28,7 @@ function RouteComponent() { ); } -export function BrowserLayout(props: any) { +export function BrowserLayout({ children }: PropsWithChildren) { return (
@@ -42,7 +43,7 @@ export function BrowserLayout(props: any) {
- {props.children} + {children}
@@ -56,11 +57,14 @@ export function BrowserLayout(props: any) { function BrowserSidebar() { const context = useBrowserContext(); const clusters = useClusters(); + useEffect(() => { const game_versions = context.cluster?.mc_version ? [context.cluster.mc_version] : null; const loaders = context.cluster?.mc_loader ? [context.cluster.mc_loader] : null; context.setQuery({ ...context.query, filters: { ...defaultFilters, ...context.query.filters, game_versions, loaders } }); + // eslint-disable-next-line react-hooks/exhaustive-deps -- loop }, [context.cluster]); + return (
@@ -68,7 +72,7 @@ function BrowserSidebar() {
Active Cluster
{ - const cluster = clusters?.find(cluster => cluster.id.toString() === id); + const cluster = clusters?.find(item => item.id.toString() === id); context.setCluster(cluster); }} selectedKey={context.cluster?.id.toString()} diff --git a/apps/onelauncher/frontend/src/routes/app/browser/search.tsx b/apps/onelauncher/frontend/src/routes/app/browser/search.tsx index cb84e9b1..8a2acf10 100644 --- a/apps/onelauncher/frontend/src/routes/app/browser/search.tsx +++ b/apps/onelauncher/frontend/src/routes/app/browser/search.tsx @@ -1,11 +1,9 @@ import type { Paginated, SearchResult } from '@/bindings.gen'; -import type { PaginationOptions } from '@/hooks/usePagination'; import { PackageGrid } from '@/components/content/PackageItem'; import { useBrowserContext, useBrowserSearch } from '@/hooks/useBrowser'; import usePagination from '@/hooks/usePagination'; -import { Show } from '@onelauncher/common/components'; import { createFileRoute } from '@tanstack/react-router'; -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useState } from 'react'; import { BrowserLayout } from './route'; export const Route = createFileRoute('/app/browser/search')({ @@ -25,10 +23,12 @@ function RouteComponent() { function Search() { const context = useBrowserContext(); const search = useBrowserSearch(context.provider, context.query, { + }); + useEffect(() => { search.refetch(); - }, [context.provider, context.query, context.cluster]); + }, [context.provider, context.query, context.cluster, search]); return ( <> @@ -44,19 +44,23 @@ function Search() { function Results({ results }: { results: Paginated }) { const context = useBrowserContext(); const [oldTotal, setOldTotal] = useState(results.total); + const pagination = usePagination({ itemsCount: results.total as unknown as number, itemsPerPage: context.query.limit as unknown as number, }); + useEffect(() => { context.setQuery({ ...context.query, offset: pagination.offset as unknown as bigint }); - }, [pagination.page]); + }, [context, pagination.offset, pagination.page]); + useEffect(() => { if (oldTotal === results.total) return; pagination.reset(); setOldTotal(results.total); - }, [results.total]); + }, [oldTotal, pagination, results.total]); + return (
diff --git a/apps/onelauncher/frontend/src/routes/app/cluster/index.tsx b/apps/onelauncher/frontend/src/routes/app/cluster/index.tsx index 65139f4a..fa292806 100644 --- a/apps/onelauncher/frontend/src/routes/app/cluster/index.tsx +++ b/apps/onelauncher/frontend/src/routes/app/cluster/index.tsx @@ -48,9 +48,7 @@ function RouteComponent() { })(); }, [cluster.data?.folder_name]); - const openClusterDir = async () => { - openPath(launcherDir); - }; + const openClusterDir = () => openPath(launcherDir); async function handleEditMode() { if (edit) diff --git a/apps/onelauncher/frontend/src/routes/app/index.tsx b/apps/onelauncher/frontend/src/routes/app/index.tsx index 4b66d45a..e8f90ab3 100644 --- a/apps/onelauncher/frontend/src/routes/app/index.tsx +++ b/apps/onelauncher/frontend/src/routes/app/index.tsx @@ -5,7 +5,7 @@ import { NewClusterCreate } from '@/components/launcher/cluster/ClusterCreation' import { useRecentCluster } from '@/hooks/useCluster'; import { bindings } from '@/main'; import { formatAsDuration, upperFirst } from '@/utils'; -import { useCommand, useCommandMut, useCommandSuspense } from '@onelauncher/common'; +import { useCommand, useCommandMut } from '@onelauncher/common'; import { Button, Show } from '@onelauncher/common/components'; import { createFileRoute, Link } from '@tanstack/react-router'; import { convertFileSrc } from '@tauri-apps/api/core'; diff --git a/apps/onelauncher/frontend/src/routes/app/settings/index.tsx b/apps/onelauncher/frontend/src/routes/app/settings/index.tsx index aa737658..5f3c7b25 100644 --- a/apps/onelauncher/frontend/src/routes/app/settings/index.tsx +++ b/apps/onelauncher/frontend/src/routes/app/settings/index.tsx @@ -23,9 +23,7 @@ function RouteComponent() { })(); }, []); - const openLauncherDir = async () => { - openPath(launcherDir); - }; + const openLauncherDir = () => openPath(launcherDir); const [discordRpc, setDiscordRpc] = createSetting('discord_enabled', settings?.discord_enabled); diff --git a/apps/onelauncher/frontend/src/routes/app/settings/route.tsx b/apps/onelauncher/frontend/src/routes/app/settings/route.tsx index 644e41bb..dad9e84a 100644 --- a/apps/onelauncher/frontend/src/routes/app/settings/route.tsx +++ b/apps/onelauncher/frontend/src/routes/app/settings/route.tsx @@ -86,27 +86,28 @@ function Sidebar(props: SidebarProps) { return (
- {Object.keys(links).map((section, i) => ( -
+ {Object.keys(links).map(section => ( +

{section.toUpperCase()}

- {links[section].map((link, i) => { - // eslint yaps too much tbh - if (!link) + {links[section].map((entry) => { + if (!entry) return ''; + const [Component, label, link, params] = entry; + return ( goto(link[2], link[3])} + key={link} + onClick={() => goto(link, params)} > - {link[0]} - {link[1]} + {Component} + {label} ); diff --git a/apps/onelauncher/frontend/src/routes/onboarding/route.tsx b/apps/onelauncher/frontend/src/routes/onboarding/route.tsx index 29df0956..9de124ea 100644 --- a/apps/onelauncher/frontend/src/routes/onboarding/route.tsx +++ b/apps/onelauncher/frontend/src/routes/onboarding/route.tsx @@ -104,7 +104,7 @@ function RouteComponent() { setIsForwardButtonEnabled(true); }, [currentStepIndex, tasksStage, tasksCompleted]); - const next = useCallback(async () => { + const next = useCallback(() => { const isLast = currentStepIndex === steps.length - 1; if (isLast) { @@ -140,14 +140,17 @@ function RouteComponent() { setTasksMessage('Starting setup...'); const tasksToRun = [ - async () => { + () => new Promise((resolve) => { setTasksMessage(`Setting language to ${language?.lang}...`); console.log('Language task completed for:', language?.lang); - }, - async () => { + + resolve(); + }), + () => new Promise((resolve) => { if (importInstancesMap.size === 0) { console.log('No instances selected for import.'); + resolve(); return; } @@ -165,7 +168,9 @@ function RouteComponent() { throw e; } } - }, + + resolve(); + }), ]; const results = await Promise.allSettled(tasksToRun.map(task => task())); diff --git a/apps/onelauncher/frontend/src/utils/browser.ts b/apps/onelauncher/frontend/src/utils/browser.ts index 92cc105b..64875cb4 100644 --- a/apps/onelauncher/frontend/src/utils/browser.ts +++ b/apps/onelauncher/frontend/src/utils/browser.ts @@ -1,4 +1,4 @@ -import type { PackageType, Provider } from "@/bindings.gen"; +import type { PackageType, Provider } from '@/bindings.gen'; export const BROWSER_VIEWS: Array = ['grid', 'list'] as const; diff --git a/apps/onelauncher/frontend/src/utils/index.ts b/apps/onelauncher/frontend/src/utils/index.ts index 9b4f923f..d9706760 100644 --- a/apps/onelauncher/frontend/src/utils/index.ts +++ b/apps/onelauncher/frontend/src/utils/index.ts @@ -41,12 +41,12 @@ export function int32ToBigInt([high, low]: [number, number]): bigint { } export function randomString(len: number = 6, charSet: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') { - let randomString = ''; + let str = ''; for (let i = 0; i < len; i++) { const randomPos = Math.floor(Math.random() * charSet.length); - randomString += charSet.substring(randomPos, randomPos + 1); + str += charSet.substring(randomPos, randomPos + 1); } - return randomString; + return str; } export function abbreviateNumber(n: number | bigint, locale: string = 'en-US'): string { diff --git a/apps/onelauncher/frontend/tsconfig.json b/apps/onelauncher/frontend/tsconfig.json index d92bf525..9c13de82 100644 --- a/apps/onelauncher/frontend/tsconfig.json +++ b/apps/onelauncher/frontend/tsconfig.json @@ -27,5 +27,5 @@ "skipLibCheck": true, "noUncheckedSideEffectImports": true }, - "include": ["**/*.ts", "**/*.tsx", "vite.config.js"] + "include": ["**/*.ts", "**/*.tsx", "vite.config.ts"] } diff --git a/apps/onelauncher/frontend/vite.config.js b/apps/onelauncher/frontend/vite.config.ts similarity index 100% rename from apps/onelauncher/frontend/vite.config.js rename to apps/onelauncher/frontend/vite.config.ts diff --git a/eslint.config.js b/eslint.config.js index fb2c7481..4f8eb329 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -23,6 +23,22 @@ export default defineConfig( return config; }), + { + ignores: [ + 'apps/onelauncher/old_frontend', + 'apps/*/desktop/capabilities', + 'apps/*/desktop/gen', + '**/*.gen.*', + ], + // overrides: [ + // { + // files: ['vite.config.js'], + // parserOptions: { + // project: null, // disables type-aware linting for this file + // }, + // }, + // ], + }, { rules: { 'sort-imports': 'off', // Replaced by perfectionist/sort-named-imports', @@ -31,7 +47,14 @@ export default defineConfig( 'ts/no-use-before-define': 'off', 'style/function-paren-newline': ['error', 'consistent'], 'react/no-context-provider': 'off', - "prefer-const": "off" // disabled due to maximum call stack size + 'prefer-const': 'off', // disabled due to maximum call stack size + 'eslint-comments/no-unlimited-disable': 'off', + 'eslint-comments/require-description': ['error', { + ignore: [ + 'eslint-disable', + ], + }], + 'no-shadow': 'off', }, }, ); diff --git a/package.json b/package.json index 43425058..f85c541c 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "scripts": { "prep": "pnpm scripts prep", "typecheck": "pnpm -r typecheck", - "bootstrap": "cargo clean && ./packages/scripts/setup.sh && pnpm install && pnpm prep && pnpm codegen", + "bootstrap": "cargo clean && ./packages/scripts/setup.sh && pnpm install && pnpm prep", "core": "pnpm --filter @onelauncher/core -- ", "migrate": "sea-orm-cli migrate -d ./packages/migration", diff --git a/packages/scripts/api/fetch_categories.ts b/packages/scripts/api/fetch_categories.ts index 5cd6ef5d..36b12efe 100644 --- a/packages/scripts/api/fetch_categories.ts +++ b/packages/scripts/api/fetch_categories.ts @@ -7,7 +7,7 @@ interface MappedCategoryItem { id: string; } -type MappingList = Record; +type MappingList = Record>; const packageTypes = ['mod', 'modpack', 'shader', 'resourcepack'] as const; type PackageType = typeof packageTypes[number]; @@ -43,7 +43,7 @@ async function fetchCategoriesCurseforge(packageType: PackageType): Promise }).data; // TODO: Add more calssIds const classIds: Record = { @@ -79,7 +79,7 @@ async function fetchCategoriesModrinth(packageType: PackageType): Promise; const mapping: MappingList = {}; diff --git a/packages/scripts/prepare.ts b/packages/scripts/prepare.ts index d5e04cca..cefd2b09 100644 --- a/packages/scripts/prepare.ts +++ b/packages/scripts/prepare.ts @@ -1,3 +1,4 @@ +import { exec } from 'node:child_process'; import { readFile, writeFile } from 'node:fs/promises'; import { consola } from 'consola'; import mustache from 'mustache'; @@ -77,3 +78,16 @@ catch (error) { consola.error(error); env.__exit(1); } + +consola.start('building the web_commons package...'); +exec('pnpm -w web_common build', { cwd: env.__root }, (error, stdout, stderr) => { + if (error) { + consola.error(`web_commons build failed: ${error.message}`); + env.__exit(1); + } + if (stderr) + consola.error(stderr); + + consola.success('web_commons package built successfully!'); + env.__exit(0); +}); diff --git a/packages/scripts/tauri.ts b/packages/scripts/tauri.ts index 398f0b19..f86e29f5 100644 --- a/packages/scripts/tauri.ts +++ b/packages/scripts/tauri.ts @@ -29,7 +29,7 @@ if (cargoConfig.env && typeof cargoConfig.env === 'object') function targetFilter(filter: 'b' | 't') { const filters = filter === 'b' ? ['-b', '--bundles'] : ['-t', '--target']; - return (_: string, idx: number, args: string[]) => { + return (_: string, idx: number, args: Array) => { if (idx === 0) return false; const prev = args[idx - 1] ?? ''; diff --git a/packages/scripts/utils/index.ts b/packages/scripts/utils/index.ts index fbff9fd2..1166eb51 100644 --- a/packages/scripts/utils/index.ts +++ b/packages/scripts/utils/index.ts @@ -45,9 +45,9 @@ export async function which(cmd: TemplateStringsArray): Promise { return type() === 'Windows_NT' ? where(cmd[0]!) : Promise.any( - Array.from(new Set(process.env.PATH?.split(':'))) - .map(p => fs.access(join(p, cmd[0]!), fs.constants.X_OK)), - ).then(_ => true, _ => false); + Array.from(new Set(process.env.PATH?.split(':'))) + .map(p => fs.access(join(p, cmd[0]!), fs.constants.X_OK)), + ).then(_ => true, _ => false); } export async function awaitLock(file: string): Promise { diff --git a/packages/scripts/utils/patch.ts b/packages/scripts/utils/patch.ts index 9415d202..c38605fd 100644 --- a/packages/scripts/utils/patch.ts +++ b/packages/scripts/utils/patch.ts @@ -47,7 +47,7 @@ export async function tauriUpdateKey(env: CheckedEnvironment): Promise { +export async function patchTauri(env: CheckedEnvironment, targets: Array, args: Array): Promise> { consola.start('patching tauri configuration...'); if (args.findIndex(a => ['--config', '-c'].includes(a)) !== -1) throw new Error('custom tauri build configuration is not supported!'); @@ -55,7 +55,7 @@ export async function patchTauri(env: CheckedEnvironment, targets: string[], arg const osType = type(); const tauriPatch: { build: { - features: string[]; + features: Array; }; bundle: { macOS: { minimumSystemVersion: string }; @@ -107,10 +107,10 @@ export async function patchTauri(env: CheckedEnvironment, targets: string[], arg if ( (targets.includes('aarch64-apple-darwin') || (targets.length === 0 && process.arch === 'arm64')) - && (macOSStore.minimumVersion == null || semver.lt( - semver.coerce(macOSStore.minimumVersion)!, - semver.coerce(macOSStore.defaultArm64)!, - )) + && (macOSStore.minimumVersion == null || semver.lt( + semver.coerce(macOSStore.minimumVersion)!, + semver.coerce(macOSStore.defaultArm64)!, + )) ) { macOSStore.minimumVersion = macOSStore.defaultArm64; consola.debug(`setting minimum macOS version to ${macOSStore.minimumVersion}...`); diff --git a/packages/serde_json_path_to_error/Cargo.toml b/packages/serde_json_path_to_error/Cargo.toml index d0970ba7..47523720 100644 --- a/packages/serde_json_path_to_error/Cargo.toml +++ b/packages/serde_json_path_to_error/Cargo.toml @@ -1,13 +1,20 @@ [package] name = "serde_json_path_to_error" version = "0.2.0" -authors = [ "Polyfrost", "Ethan Brierley " ] +authors = [ + "Polyfrost", + "Ethan Brierley " +] license = "MIT/Apache-2.0" readme = "README.md" description = """ A drop in replacement for serde_json where detailed errors are the default """ -keywords = [ "serde", "json", "serialization" ] +keywords = [ + "serde", + "json", + "serialization" +] documentation = "https://docs.rs/serde_json_path_to_error/" repository = "https://github.com/eopb/serde_json_path_to_error" edition = "2024" diff --git a/packages/web_common/src/components/AnimatedOutlet.tsx b/packages/web_common/src/components/AnimatedOutlet.tsx index e7b83f97..cd2f90ff 100644 --- a/packages/web_common/src/components/AnimatedOutlet.tsx +++ b/packages/web_common/src/components/AnimatedOutlet.tsx @@ -1,4 +1,3 @@ -/* eslint-disable eslint-comments/require-description -- i trust that one github discussion user on this */ /* eslint-disable react/no-unstable-default-props */ // Taken from https://github.com/TanStack/router/discussions/823#discussioncomment-12765059 diff --git a/packages/web_common/src/components/SelectList.tsx b/packages/web_common/src/components/SelectList.tsx index ada5fb10..f0d588f5 100644 --- a/packages/web_common/src/components/SelectList.tsx +++ b/packages/web_common/src/components/SelectList.tsx @@ -1,5 +1,5 @@ -import type { JSX, ReactNode } from 'react'; -import React, { createContext, useContext } from 'react'; +import type { JSX } from 'react'; +import React, { createContext, useCallback, useContext, useMemo } from 'react'; interface SelectListContextType { onSelect: (value: string) => void; @@ -30,7 +30,7 @@ export const SelectList: React.FC & { Item: React.FC { - const handleSelect = (itemValue: string): void => { + const handleSelect = useCallback((itemValue: string): void => { if (multiple) { const currentValues = Array.isArray(value) ? value : []; const newValues = currentValues.includes(itemValue) @@ -41,20 +41,20 @@ export const SelectList: React.FC & { Item: React.FC { + const isSelected = useCallback((itemValue: string): boolean => { if (multiple) return Array.isArray(value) && value.includes(itemValue); return value === itemValue; - }; + }, [multiple, value]); - const contextValue: SelectListContextType = { + const contextValue: SelectListContextType = useMemo(() => ({ onSelect: handleSelect, isSelected, multiple, - }; + }), [handleSelect, isSelected, multiple]); return ( diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e3a767fb..e8f3237f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -36,7 +36,7 @@ catalog: # --- # dependencies # --- - + # react + libraries react: ^19.0.0 react-aria-components: ^1.8.0