diff --git a/oxlint.config.ts b/oxlint.config.ts index 3e21053..b648c90 100644 --- a/oxlint.config.ts +++ b/oxlint.config.ts @@ -6,7 +6,6 @@ const restrictedImportRoots = [ "@/commands", "@/components/layout", "@/components/screens", - "@/components/dialogs", ]; const restrictedImportPatterns = restrictedImportRoots.flatMap((root) => [root, `${root}/**`]); diff --git a/package.json b/package.json index fbfada8..3faff6a 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,6 @@ "@tauri-store/zustand": "^1.2.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "immer": "^11.1.15", "lucide-react": "^1.27.0", "radix-ui": "^1.6.7", "react": "^19.2.8", @@ -65,7 +64,6 @@ "@testing-library/jest-dom": "^7.0.0", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", - "@types/babel__core": "^7.20.5", "@types/node": "^25.9.5", "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a0b0af6..6ef4614 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,9 +53,6 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 - immer: - specifier: ^11.1.15 - version: 11.1.15 lucide-react: specifier: ^1.27.0 version: 1.27.0(react@19.2.8) @@ -108,9 +105,6 @@ importers: '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) - '@types/babel__core': - specifier: ^7.20.5 - version: 7.20.5 '@types/node': specifier: ^25.9.5 version: 25.9.5 @@ -1753,18 +1747,6 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -4810,27 +4792,6 @@ snapshots: '@types/aria-query@5.0.4': {} - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.29.7 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - - '@types/babel__traverse@7.28.0': - dependencies: - '@babel/types': 7.29.7 - '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -5245,7 +5206,8 @@ snapshots: husky@9.1.7: {} - immer@11.1.15: {} + immer@11.1.15: + optional: true import-meta-resolve@4.2.0: {} diff --git a/src/features/preferences/stores/recentItems.ts b/src/features/preferences/stores/recentItems.ts index 8326d21..7ffc4f0 100644 --- a/src/features/preferences/stores/recentItems.ts +++ b/src/features/preferences/stores/recentItems.ts @@ -1,5 +1,4 @@ import { create } from "zustand"; -import { immer } from "zustand/middleware/immer"; import { isSamePath } from "@/lib/path"; import { createPersistedTauriStore, definePersistedState } from "@/lib/persistedTauriStore"; @@ -40,25 +39,15 @@ const addRecentPath = (items: string[], path: string) => ? [path, ...items.filter((item) => !isSamePath(item, path))].slice(0, RECENT_ITEM_LIMIT) : items; -export const useRecentItemsStore = create()( - immer((set) => ({ - ...createDefaultRecentItemsState(), - clearRecentItems: () => - set((state) => { - state.recentFiles = []; - state.recentFolders = []; - }), - recordRecentFile: (path) => - set((state) => { - state.recentFiles = addRecentPath(state.recentFiles, path); - }), - recordRecentFolder: (path) => - set((state) => { - state.recentFolders = addRecentPath(state.recentFolders, path); - }), - reset: () => set(createDefaultRecentItemsState()), - })), -); +export const useRecentItemsStore = create()((set) => ({ + ...createDefaultRecentItemsState(), + clearRecentItems: () => set({ recentFiles: [], recentFolders: [] }), + recordRecentFile: (path) => + set((state) => ({ recentFiles: addRecentPath(state.recentFiles, path) })), + recordRecentFolder: (path) => + set((state) => ({ recentFolders: addRecentPath(state.recentFolders, path) })), + reset: () => set(createDefaultRecentItemsState()), +})); export const recentItemsStoreTauriHandler = createPersistedTauriStore( "recent-items", diff --git a/src/features/preferences/stores/settings.ts b/src/features/preferences/stores/settings.ts index 9ca5371..f0a12c7 100644 --- a/src/features/preferences/stores/settings.ts +++ b/src/features/preferences/stores/settings.ts @@ -1,5 +1,4 @@ import { create } from "zustand"; -import { immer } from "zustand/middleware/immer"; import { LINE_ENDINGS, @@ -90,24 +89,22 @@ const SETTINGS_CONTRACT = definePersistedState({ export const sanitizeSettingsPersistedState = SETTINGS_CONTRACT.sanitize; -export const useSettingsStore = create()( - immer((set) => ({ - ...createDefaultSettingsState(), - version: SETTINGS_VERSION, - - updateSetting: (key, value) => - set((state) => { - (state as SettingsState)[key] = value; - }), - - reset: () => { - set(() => ({ - ...createDefaultSettingsState(), - version: SETTINGS_VERSION, - })); - }, - })), -); +export const useSettingsStore = create()((set) => ({ + ...createDefaultSettingsState(), + version: SETTINGS_VERSION, + + updateSetting: (key, value) => + set((state) => ({ + ...state, + [key]: value, + })), + + reset: () => + set({ + ...createDefaultSettingsState(), + version: SETTINGS_VERSION, + }), +})); export const settingsStoreTauriHandler = createPersistedTauriStore( "settings", diff --git a/src/lib/async.ts b/src/lib/async.ts index df167dd..57d8937 100644 --- a/src/lib/async.ts +++ b/src/lib/async.ts @@ -1,6 +1,5 @@ import { CancellationError, CancellationToken, CancellationTokenSource } from "./cancellation"; import { type Disposable, MutableDisposable } from "./lifecycle"; -import { runTaskAsPromise } from "./task"; export interface AsyncLazyOptions { retryOnFailure?: boolean; @@ -29,7 +28,7 @@ export class AsyncLazy { get value() { if (!this.valuePromise) { - const nextValuePromise = runTaskAsPromise(this.task); + const nextValuePromise = Promise.try(this.task); this.valuePromise = nextValuePromise; if (this.options.retryOnFailure) { @@ -111,7 +110,7 @@ export class TaskLimiter { this.activeTaskCount += 1; try { - const result = await runTaskAsPromise(task); + const result = await Promise.try(task); this.finishTask(); resolve(result); } catch (error) { @@ -142,9 +141,7 @@ export class SequentialTaskQueue { private tail: Promise | null = null; run(task: () => T | PromiseLike) { - const queuedTask = this.tail - ? this.tail.then(() => runTaskAsPromise(task)) - : runTaskAsPromise(task); + const queuedTask = this.tail ? this.tail.then(() => Promise.try(task)) : Promise.try(task); const nextTail = queuedTask.then(ignorePromiseResult, ignorePromiseResult); this.tail = nextTail; @@ -258,7 +255,7 @@ export class DebouncedTaskRunner implements Disposable { this.activeRun = activeRun; try { - const result = await runTaskAsPromise(() => this.runner(activeRun.cancellation.token)); + const result = await Promise.try(() => this.runner(activeRun.cancellation.token)); if (this.activeRun === activeRun) { activeRun.deferred.resolve(result); diff --git a/src/lib/cancellation.ts b/src/lib/cancellation.ts index 78b92b9..f6c4ef2 100644 --- a/src/lib/cancellation.ts +++ b/src/lib/cancellation.ts @@ -1,6 +1,5 @@ import type { Disposable } from "./lifecycle"; import { Signal, SignalSource } from "./signal"; -import { runTaskAsPromise } from "./task"; export interface CancellationToken { readonly isCancellationRequested: boolean; @@ -80,7 +79,7 @@ export const raceWithCancellation = async ( }); try { - return await Promise.race([runTaskAsPromise(task), promise]); + return await Promise.race([Promise.try(task), promise]); } finally { listenerDisposable.dispose(); } diff --git a/src/lib/task.ts b/src/lib/task.ts deleted file mode 100644 index a813b49..0000000 --- a/src/lib/task.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const runTaskAsPromise = (task: () => T | PromiseLike) => { - try { - return Promise.resolve(task()); - } catch (error) { - return Promise.reject(error); - } -}; diff --git a/src/main.tsx b/src/main.tsx index a56373b..564398f 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,4 +1,3 @@ -import { enableArrayMethods, enableMapSet } from "immer"; import { StrictMode } from "react"; import ReactDOM from "react-dom/client"; @@ -7,8 +6,6 @@ import { installUnexpectedErrorDiagnostics } from "./features/diagnostics"; import { installUnexpectedErrorHandlers, invariant } from "./lib/errors"; import { Providers } from "./Providers"; -enableArrayMethods(); -enableMapSet(); const cleanupUnexpectedErrorHandlers = installUnexpectedErrorHandlers(); const cleanupUnexpectedErrorDiagnostics = installUnexpectedErrorDiagnostics();