diff --git a/eslint.config.mjs b/eslint.config.mjs index a1adb23e..0d47a9a8 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,15 +1,34 @@ import eslint from "@eslint/js"; import tseslint from "typescript-eslint"; +import globals from "globals"; +import eslintPluginUnicorn from "eslint-plugin-unicorn"; +import eslintPluginReactHooks from "eslint-plugin-react-hooks"; export default tseslint.config( eslint.configs.recommended, ...tseslint.configs.recommended, { + languageOptions: { + globals: { ...globals.builtin, ...globals.browser } + }, ignores: ["config/*", "scripts/*", "public/*", "*.test.tsx"], rules: { "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-explicit-any": "off" + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-expressions": "off", + "no-empty": "off", + "unicorn/no-reduce": "off", + "unicorn/no-array-for-each": "off", + "unicorn/no-array-reduce": "off", + "unicorn/no-array-callback-reference": "off", + "unicorn/no-useless-undefined": "off", + "unicorn/prevent-abbreviations": "off", + "unicorn/no-abusive-eslint-disable": "off" + }, + plugins: { + "react-hooks": eslintPluginReactHooks, + unicorn: eslintPluginUnicorn } } ); diff --git a/package.json b/package.json index 9ea0c45e..7f4fb56c 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "@types/eslint__js": "^8.42.3", "@types/jest": "^29.5.13", "@types/lodash": "^4.17.7", - "@types/ramda": "types/npm-ramda", + "@types/ramda": "^0.30.2", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@types/react-onclickoutside": "^6.7.10", @@ -129,6 +129,7 @@ "firebase": "^10.13.1", "fork-ts-checker-webpack-plugin": "^9.0.2", "fuse.js": "^7.0.0", + "globals": "^15.9.0", "hex-rgb": "^5.0.0", "html-webpack-plugin": "5.6.0", "husky": "^9.1.6", diff --git a/src/components/bottom-tabs/mobile-tabs.tsx b/src/components/bottom-tabs/mobile-tabs.tsx index 20d48f07..6cdbec00 100644 --- a/src/components/bottom-tabs/mobile-tabs.tsx +++ b/src/components/bottom-tabs/mobile-tabs.tsx @@ -70,10 +70,10 @@ const MobileTabs = ({ /> ) : mobileTabIndex === 1 - ? MobileFileTree - : mobileTabIndex === 3 - ? MobileManual - : undefined} + ? MobileFileTree + : mobileTabIndex === 3 + ? MobileManual + : undefined} @@ -266,7 +266,6 @@ function AudioPlayer({ "timeupdate", onAudioProgress ); - // eslint-disable-next-line unicorn/prefer-add-event-listener audioReference.current.onended = () => { audioReference && audioReference.current && @@ -425,8 +424,8 @@ function RenderModal({ {type === "new" ? "Generated files" : type === "mod" - ? "Files changed after render" - : "Unmodified files"} + ? "Files changed after render" + : "Unmodified files"} {Object.keys(data).map((filename) => { @@ -537,9 +536,8 @@ function RenderModal({ onClick={async () => { const bundle = new JSZip(); for (const filename of selectedFiles) { - const arrayBuffer = await csound.fs.readFile( - filename - ); + const arrayBuffer = + await csound.fs.readFile(filename); bundle.file(filename, arrayBuffer); } diff --git a/src/components/editor/plugins/show-hint.js b/src/components/editor/plugins/show-hint.js index 40a532c5..6a51f134 100644 --- a/src/components/editor/plugins/show-hint.js +++ b/src/components/editor/plugins/show-hint.js @@ -80,11 +80,10 @@ function Completion(cm, options) { this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length; - const self = this; cm.on( "cursorActivity", - (this.activityFunc = function () { - self.cursorActivity(); + (this.activityFunc = () => { + this.cursorActivity(); }) ); } @@ -152,9 +151,8 @@ Completion.prototype = { ) { this.close(); } else { - const self = this; - this.debounce = requestAnimationFrame(function () { - self.update(); + this.debounce = requestAnimationFrame(() => { + this.update(); }); if (this.widget) { this.widget.disable(); @@ -166,11 +164,11 @@ Completion.prototype = { if (!this.tick) { return; } - const self = this; const myTick = ++this.tick; - fetchHints(this.options.hint, this.cm, this.options, function (data) { - if (self.tick === myTick) { - self.finishUpdate(data, first); + + fetchHints(this.options.hint, this.cm, this.options, (data) => { + if (this.tick === myTick) { + this.finishUpdate(data, first); } }); }, @@ -321,8 +319,7 @@ function Widget(completion, data) { this.completion = completion; this.data = data; this.picked = false; - const widget = this, - cm = completion.cm; + const cm = completion.cm; const ownerDocument = cm.getInputField().ownerDocument; const parentWindow = ownerDocument.defaultView || ownerDocument.parentWindow; @@ -440,21 +437,21 @@ function Widget(completion, data) { cm.addKeyMap( (this.keyMap = buildKeyMap(completion, { - moveFocus: function (n, avoidWrap) { - widget.changeActive(widget.selectedHint + n, avoidWrap); + moveFocus: (n, avoidWrap) => { + this.changeActive(this.selectedHint + n, avoidWrap); }, - setFocus: function (n) { - widget.changeActive(n); + setFocus: (n) => { + this.changeActive(n); }, - menuSize: function () { - return widget.screenAmount(); + menuSize: () => { + return this.screenAmount(); }, length: completions.length, close: function () { completion.close(); }, - pick: function () { - widget.pick(); + pick: () => { + this.pick(); }, data: data })) @@ -502,20 +499,20 @@ function Widget(completion, data) { }) ); - CodeMirror.on(hints, "dblclick", function (event) { + CodeMirror.on(hints, "dblclick", (event) => { const t = getHintElement(hints, event.target || event.srcElement); if (t && t.hintId) { - widget.changeActive(t.hintId); - widget.pick(); + this.changeActive(t.hintId); + this.pick(); } }); - CodeMirror.on(hints, "click", function (event) { + CodeMirror.on(hints, "click", (event) => { const t = getHintElement(hints, event.target || event.srcElement); if (t && t.hintId) { - widget.changeActive(t.hintId); + this.changeActive(t.hintId); if (completion.options.completeOnSingleClick) { - widget.pick(); + this.pick(); } } }); @@ -555,10 +552,9 @@ Widget.prototype = { disable: function () { this.completion.cm.removeKeyMap(this.keyMap); - const widget = this; this.keyMap = { - Enter: function () { - widget.picked = true; + Enter: () => { + this.picked = true; } }; this.completion.cm.addKeyMap(this.keyMap); diff --git a/src/components/file-tree/context.tsx b/src/components/file-tree/context.tsx index 65c204cb..6dad16da 100644 --- a/src/components/file-tree/context.tsx +++ b/src/components/file-tree/context.tsx @@ -32,7 +32,6 @@ const initialState: DnDState = { docIdx: {} }; export const DnDStateContext = createContext(initialState); export const DnDDispatchContext = createContext( - // eslint-disable-next-line @typescript-eslint/no-empty-function,@typescript-eslint/no-unused-vars (dispatch: Record): void => {} ); @@ -129,17 +128,17 @@ const reducer = (state: DnDState, action: Record): DnDState => { ); const newState = reduceIndexed( - (accumulator, item, newIndex) => + (accumulator, item: any, newIndex) => assocPath( ["docIdx", item.uid, "index"], newIndex, accumulator ), - state, + state as DnDState, reorderedFiles ); - return newState; + return newState as DnDState; } case "setDocIdx": { return assoc("docIdx", action.docIdx, state); diff --git a/src/components/hot-keys/hot-keys.tsx b/src/components/hot-keys/hot-keys.tsx index 620a8b71..e897ae70 100644 --- a/src/components/hot-keys/hot-keys.tsx +++ b/src/components/hot-keys/hot-keys.tsx @@ -41,7 +41,6 @@ const HotKeys = ({ {}, [...keyboardCallbacks.keys()] ), - /* eslint-disable-next-line react-hooks/exhaustive-deps */ [updateCounter] ); return ( diff --git a/src/components/main/main.tsx b/src/components/main/main.tsx index 84d9aa35..19579717 100644 --- a/src/components/main/main.tsx +++ b/src/components/main/main.tsx @@ -55,7 +55,6 @@ const Main = (): React.ReactElement => { (window as any).ps_body && (window as any).ps_body.destroy(); }; - // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/src/components/profile/actions.tsx b/src/components/profile/actions.tsx index 57d38bf2..ef5b565d 100644 --- a/src/components/profile/actions.tsx +++ b/src/components/profile/actions.tsx @@ -86,7 +86,6 @@ const handleProjectTags = async (projectUid, loggedInUserUid, currentTags) => { query(tags, where(projectUid, "==", loggedInUserUid)) ); - /* eslint-disable-next-line unicorn/prefer-object-from-entries */ const currentProjTags = currentProjTagsReference.docs.reduce( (accumulator, document_) => assoc(document_.id, document_.data(), accumulator), diff --git a/src/components/project-editor/actions.tsx b/src/components/project-editor/actions.tsx index 49374e05..1c445c7e 100644 --- a/src/components/project-editor/actions.tsx +++ b/src/components/project-editor/actions.tsx @@ -1,7 +1,6 @@ import { openSimpleModal } from "@comp/modal/actions"; import { IDocument } from "@comp/projects/types"; import { ITarget } from "@comp/target-controls/types"; -import { find, propEq } from "ramda"; import { sortByStoredTabOrder } from "./utils"; import { MANUAL_LOOKUP_STRING, @@ -79,19 +78,16 @@ export const tabDockInit = ( }); }); } else if ( - /* eslint-disable-next-line unicorn/no-useless-length-check */ allDocuments.length > 0 && - /* eslint-disable-next-line unicorn/no-useless-length-check */ allDocuments.some((d) => d.filename === "project.csd") ) { - const projectCsd = find( - propEq("filename", "project.csd"), - allDocuments + const projectCsd = allDocuments.find( + (d) => d.filename === "project.csd" ); + projectCsd && - !find( - propEq("uid", projectCsd.documentUid), - initialOpenDocuments + !initialOpenDocuments.find( + (d) => d.uid === projectCsd.documentUid ) && initialOpenDocuments.push({ uid: projectCsd.documentUid diff --git a/src/components/project-editor/project-editor.tsx b/src/components/project-editor/project-editor.tsx index 87fce4d6..27441572 100644 --- a/src/components/project-editor/project-editor.tsx +++ b/src/components/project-editor/project-editor.tsx @@ -60,6 +60,8 @@ type IEditorForDocumentProperties = { isOwner: boolean; }; +type AnyTab = IDocument | IOpenDocument | NonCloudFile; + const MySplit = ({ primary, split, @@ -70,7 +72,6 @@ const MySplit = ({ onDragFinished, children }) => { - /* eslint-disable-next-line unicorn/prefer-native-coercion-functions */ const filteredChildren = children.filter(Boolean); return filteredChildren.length === 1 ? ( filteredChildren[0] @@ -182,7 +183,6 @@ const ProjectEditor = ({ activeProject ); const isOwner: boolean = useSelector(selectIsOwner(projectUid)); - // eslint-disable-next-line unicorn/no-useless-undefined const csound: CsoundObj | undefined = undefined; useEffect(() => { @@ -236,11 +236,8 @@ const ProjectEditor = ({ pathOr(-1, ["ProjectEditorReducer", "tabDock", "tabIndex"]) ); - const openDocuments: (IDocument | IOpenDocument)[] = reduce( - ( - accumulator: (IDocument | IOpenDocument)[], - tabDocument: IOpenDocument - ) => { + const openDocuments: AnyTab[] = tabDockDocuments.reduce( + (accumulator: AnyTab[], tabDocument: IOpenDocument) => { const maybeDocument = pathOr( {} as IDocument, ["documents", propOr("", "uid", tabDocument)], @@ -252,11 +249,10 @@ const ProjectEditor = ({ return isNonCloudFile ? append(tabDocument, accumulator) : maybeDocument && Object.keys(maybeDocument).length > 0 - ? append(maybeDocument, accumulator) - : accumulator; + ? append(maybeDocument, accumulator) + : accumulator; }, - [] as (IDocument | NonCloudFile)[], - tabDockDocuments + [] as AnyTab[] ); const closeTab = (documentUid, isModified) => { @@ -376,7 +372,9 @@ const ProjectEditor = ({ ) : ( <> diff --git a/src/components/project-editor/tab-styles.tsx b/src/components/project-editor/tab-styles.tsx index 584ef069..e4753149 100644 --- a/src/components/project-editor/tab-styles.tsx +++ b/src/components/project-editor/tab-styles.tsx @@ -1,4 +1,3 @@ -import React from "react"; import styled from "@emotion/styled"; import { TabListStyle, @@ -32,8 +31,10 @@ export const tabListStyle = (theme: Theme): SerializedStyles => css` z-index: 1; background-color: ${theme.background}!important; height: ${tabListHeight}px; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), - 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); + box-shadow: + 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 1px 5px 0 rgba(0, 0, 0, 0.12), + 0 3px 1px -2px rgba(0, 0, 0, 0.2); } .tablist > div { height: 100%; @@ -58,7 +59,9 @@ const TabListStyleCustom = styled(TabListStyle)` z-index: 1; background-color: ${(properties) => properties.theme.background}!important; bottom: 0; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), + box-shadow: + 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); & li::after { @@ -168,17 +171,13 @@ const PanelStyleCustom = styled(PanelStyle)` `; const TabStyles = (isBottom: boolean): Record => ({ - // eslint-disable-next-line react/display-name TabList: (properties) => ( ), - // eslint-disable-next-line react/display-name ActionButton: (properties) => ( ), - // eslint-disable-next-line react/display-name Tab: (properties) => , - // eslint-disable-next-line react/display-name Panel: (properties) => ( ) diff --git a/src/components/projects/actions.tsx b/src/components/projects/actions.tsx index d18f034e..fad23838 100644 --- a/src/components/projects/actions.tsx +++ b/src/components/projects/actions.tsx @@ -538,7 +538,6 @@ export const exportProject = (): ((dispatch: any) => Promise) => { const folders = documents .filter((d) => d.type === "folder") - /* eslint-disable unicorn/prefer-object-from-entries */ .reduce((m, f) => { return { ...m, [f.documentUid]: f }; }, {}); diff --git a/src/components/projects/modals.tsx b/src/components/projects/modals.tsx index f26fe272..7b79560c 100644 --- a/src/components/projects/modals.tsx +++ b/src/components/projects/modals.tsx @@ -116,7 +116,6 @@ export function DeleteDocumentPrompt({ // https://stackoverflow.com/questions/11100821/javascript-regex-for-validating-filenames const isValidFolderName = (name: string) => - // eslint-disable-next-line no-useless-escape !/^(con|prn|aux|nul|com\d|lpt\d)$|(["*/:<>?\\|])|([\s.])$/i.test(name); export function NewFolderPrompt({ projectUid }: { projectUid: string }) { @@ -303,7 +302,6 @@ export function NewDocumentPrompt({ export function AddDocumentPrompt({ projectUid }: { projectUid: string }) { const dispatch = useDispatch(); - /* eslint-disable-next-line unicorn/no-null */ const [files, setFiles] = useState(null as FileList | null); const [nameCollides, setNameCollides] = useState(false); diff --git a/src/components/snackbar/snackbar.tsx b/src/components/snackbar/snackbar.tsx index 86fae36d..ccbaaeee 100644 --- a/src/components/snackbar/snackbar.tsx +++ b/src/components/snackbar/snackbar.tsx @@ -1,10 +1,8 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ import React from "react"; import CheckCircleIcon from "@mui/icons-material/CheckCircle"; import ErrorIcon from "@mui/icons-material/Error"; import InfoIcon from "@mui/icons-material/Info"; import CloseIcon from "@mui/icons-material/Close"; -import { amber, green } from "@mui/material/colors"; import IconButton from "@mui/material/IconButton"; import Snackbar from "@mui/material/Snackbar"; import SnackbarContent from "@mui/material/SnackbarContent"; diff --git a/src/components/target-controls/utils.ts b/src/components/target-controls/utils.ts index 327b43c5..d44ae739 100644 --- a/src/components/target-controls/utils.ts +++ b/src/components/target-controls/utils.ts @@ -1,4 +1,3 @@ -/* eslint-disable unicorn/consistent-function-scoping */ import { curry, find, path, pathOr, propEq, values } from "ramda"; import { RootState } from "@root/store"; import { ITarget } from "./types"; diff --git a/src/elements/perfect-scrollbar.tsx b/src/elements/perfect-scrollbar.tsx index 62923f66..e2f0aee1 100644 --- a/src/elements/perfect-scrollbar.tsx +++ b/src/elements/perfect-scrollbar.tsx @@ -1,10 +1,10 @@ -import React, { forwardRef, useEffect } from "react"; -import { css } from "@emotion/react"; +import { forwardRef, useEffect } from "react"; +import { FunctionInterpolation, css } from "@emotion/react"; import PerfectScrollbar from "perfect-scrollbar"; import "perfect-scrollbar/css/perfect-scrollbar.css"; import { perfectScrollbarStyleSheet } from "@styles/_perfect-scrollbar"; -const scrollbarContainer = (theme) => css` +const scrollbarContainer: FunctionInterpolation = (theme) => css` ${perfectScrollbarStyleSheet(theme)} position: relative; height: auto; @@ -45,7 +45,6 @@ const ScrollBar = forwardRef((properties: any, reference: any) => { }, 100); }; } - // eslint-disable-next-line react-hooks/exhaustive-deps }, [reference]); return ( diff --git a/src/elements/svg-icons.tsx b/src/elements/svg-icons.tsx index 970367e0..663390e4 100644 --- a/src/elements/svg-icons.tsx +++ b/src/elements/svg-icons.tsx @@ -154,7 +154,6 @@ import fadxlrplug from "../svgs/fad-xlrplug.svg?react"; import fadzoomin from "../svgs/fad-zoomin.svg?react"; import fadzoomout from "../svgs/fad-zoomout.svg?react"; -// eslint-disable-next-line import/no-anonymous-default-export export default { fadADR, fadADSR, diff --git a/src/index.tsx b/src/index.tsx index be19851e..8b8ffed7 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -7,7 +7,6 @@ import { store } from "@root/store"; import "./config/firestore"; // import for sideffects import "react-perfect-scrollbar/dist/css/styles.css"; -/* eslint-disable-next-line unicorn/prefer-query-selector */ const container = document.getElementById("root"); const root = createRoot(container as any); const Provider = Provider_ as any; diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts index 981cd734..2d6668ff 100644 --- a/src/react-app-env.d.ts +++ b/src/react-app-env.d.ts @@ -1,66 +1,62 @@ -/// -/// -/// - declare namespace NodeJS { - interface ProcessEnv { - readonly NODE_ENV: 'development' | 'production' | 'test'; - readonly PUBLIC_URL: string; - } + interface ProcessEnv { + readonly NODE_ENV: "development" | "production" | "test"; + readonly PUBLIC_URL: string; + } } -declare module '*.bmp' { - const src: string; - export default src; +declare module "*.bmp" { + const src: string; + export default src; } -declare module '*.gif' { - const src: string; - export default src; +declare module "*.gif" { + const src: string; + export default src; } -declare module '*.jpg' { - const src: string; - export default src; +declare module "*.jpg" { + const src: string; + export default src; } -declare module '*.jpeg' { - const src: string; - export default src; +declare module "*.jpeg" { + const src: string; + export default src; } -declare module '*.png' { - const src: string; - export default src; +declare module "*.png" { + const src: string; + export default src; } -declare module '*.webp' { +declare module "*.webp" { const src: string; export default src; } -declare module '*.svg' { - import * as React from 'react'; +declare module "*.svg" { + import * as React from "react"; - export const ReactComponent: React.FunctionComponent & { title?: string }>; + export const ReactComponent: React.FunctionComponent< + React.SVGProps & { title?: string } + >; - const src: string; - export default src; + const src: string; + export default src; } -declare module '*.module.css' { - const classes: { readonly [key: string]: string }; - export default classes; +declare module "*.module.css" { + const classes: { readonly [key: string]: string }; + export default classes; } -declare module '*.module.scss' { - const classes: { readonly [key: string]: string }; - export default classes; +declare module "*.module.scss" { + const classes: { readonly [key: string]: string }; + export default classes; } -declare module '*.module.sass' { - const classes: { readonly [key: string]: string }; - export default classes; +declare module "*.module.sass" { + const classes: { readonly [key: string]: string }; + export default classes; } diff --git a/src/store/store.ts b/src/store/store.ts index 3e14bcd3..eb5cd787 100644 --- a/src/store/store.ts +++ b/src/store/store.ts @@ -1,4 +1,3 @@ -/* eslint-disable unicorn/prefer-spread,unicorn/prefer-module */ import { Action, ThunkAction, diff --git a/yarn.lock b/yarn.lock index 780f5635..f6383163 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5459,9 +5459,12 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== -"@types/ramda@types/npm-ramda": - version "0.25.0" - resolved "https://codeload.github.com/types/npm-ramda/tar.gz/16dd99c3a44a9ccb04431d5e6744bf62e3e59c99" +"@types/ramda@^0.30.2": + version "0.30.2" + resolved "https://registry.yarnpkg.com/@types/ramda/-/ramda-0.30.2.tgz#70661b20c1bb969589a551b7134ae75008ffbfb6" + integrity sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA== + dependencies: + types-ramda "^0.30.1" "@types/range-parser@*": version "1.2.4" @@ -10404,7 +10407,7 @@ globals@^14.0.0: resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globals@^15.7.0: +globals@^15.7.0, globals@^15.9.0: version "15.9.0" resolved "https://registry.yarnpkg.com/globals/-/globals-15.9.0.tgz#e9de01771091ffbc37db5714dab484f9f69ff399" integrity sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA== @@ -16867,6 +16870,11 @@ ts-pnp@1.2.0, ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== +ts-toolbelt@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz#50a25426cfed500d4a09bd1b3afb6f28879edfd5" + integrity sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w== + tsconfck@^3.0.3: version "3.1.3" resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.3.tgz#a8202f51dab684c426314796cdb0bbd0fe0cdf80" @@ -17046,6 +17054,13 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" +types-ramda@^0.30.1: + version "0.30.1" + resolved "https://registry.yarnpkg.com/types-ramda/-/types-ramda-0.30.1.tgz#03d255128e3696aeaac76281ca19949e01dddc78" + integrity sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA== + dependencies: + ts-toolbelt "^9.6.0" + typescript-eslint@^8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.5.0.tgz#041f6c302d0e9a8e116a33d60b0bb19f34036dd7"