From 45a5ccba84dc84b4668662557e68bd7cbe4ccf78 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Sat, 4 Feb 2023 11:36:31 +1100 Subject: [PATCH] Updates code quality tooling and formats codebase - `eslint` and `prettier` configs - `husky` to format and lint via pre-commit hook - `babel-plugin-transform-imports` to treeshake `lodash` and other packages if needed Lints and formats codebase. --- invokeai/frontend/.babelrc | 13 + invokeai/frontend/.eslintignore | 5 + invokeai/frontend/.eslintrc.js | 40 + invokeai/frontend/.gitignore | 3 + invokeai/frontend/.husky/pre-commit | 4 + invokeai/frontend/.prettierignore | 5 + invokeai/frontend/.prettierrc.js | 6 + .../frontend/dist/locales/options/en.json | 1 - invokeai/frontend/package.json | 22 +- .../public/locales/parameters/en.json | 1 - invokeai/frontend/src/app/App.tsx | 8 +- .../src/app/selectors/readinessSelector.ts | 10 +- invokeai/frontend/src/app/socketio/actions.ts | 2 +- .../frontend/src/app/socketio/emitters.ts | 8 +- .../frontend/src/app/socketio/listeners.ts | 26 +- .../frontend/src/app/socketio/middleware.ts | 4 +- invokeai/frontend/src/app/store.ts | 6 +- .../src/common/components/GuideIcon.tsx | 2 +- .../src/common/components/GuidePopover.tsx | 8 +- .../src/common/components/IAIIconButton.tsx | 4 +- .../src/common/components/IAINumberInput.tsx | 19 +- .../src/common/components/IAIPopover.tsx | 4 +- .../src/common/components/IAISlider.tsx | 7 +- .../src/common/components/ImageUploader.tsx | 28 +- .../common/components/ImageUploaderButton.tsx | 2 +- .../components/ImageUploaderIconButton.tsx | 2 +- .../components/WorkInProgress/NodesWIP.tsx | 1 - .../WorkInProgress/PostProcessingWIP.tsx | 1 - .../components/WorkInProgress/Training.tsx | 1 - .../common/components/radix-ui/IAISlider.tsx | 1 - .../src/common/util/parameterTranslation.ts | 12 +- .../src/common/util/seedWeightPairs.ts | 2 +- .../features/canvas/components/IAICanvas.tsx | 41 +- .../IAICanvasBoundingBoxOverlay.tsx | 5 +- .../canvas/components/IAICanvasGrid.tsx | 11 +- .../components/IAICanvasIntermediateImage.tsx | 5 +- .../components/IAICanvasMaskCompositer.tsx | 4 +- .../canvas/components/IAICanvasMaskLines.tsx | 11 +- .../components/IAICanvasObjectRenderer.tsx | 9 +- .../canvas/components/IAICanvasResizer.tsx | 14 +- .../components/IAICanvasStagingArea.tsx | 9 +- .../IAICanvasStagingAreaToolbar.tsx | 27 +- .../canvas/components/IAICanvasStatusText.tsx | 9 +- .../IAICanvasStatusTextCursorPos.tsx | 6 +- .../components/IAICanvasToolPreview.tsx | 9 +- .../IAICanvasToolbar/IAICanvasBoundingBox.tsx | 15 +- .../IAICanvasToolbar/IAICanvasMaskOptions.tsx | 29 +- .../IAICanvasToolbar/IAICanvasRedoButton.tsx | 11 +- .../IAICanvasSettingsButtonPopover.tsx | 19 +- .../IAICanvasToolChooserOptions.tsx | 33 +- .../IAICanvasToolbar/IAICanvasToolbar.tsx | 47 +- .../IAICanvasToolbar/IAICanvasUndoButton.tsx | 11 +- .../canvas/hooks/useCanvasDragMove.ts | 9 +- .../features/canvas/hooks/useCanvasHotkeys.ts | 19 +- .../canvas/hooks/useCanvasMouseDown.ts | 13 +- .../canvas/hooks/useCanvasMouseMove.ts | 13 +- .../canvas/hooks/useCanvasMouseOut.ts | 2 +- .../features/canvas/hooks/useCanvasMouseUp.ts | 11 +- .../features/canvas/hooks/useCanvasZoom.ts | 13 +- .../canvas/hooks/useColorUnderCursor.ts | 1 - .../features/canvas/store/canvasSelectors.ts | 2 +- .../src/features/canvas/store/canvasSlice.ts | 37 +- .../src/features/canvas/store/canvasTypes.ts | 4 +- .../store/thunks/mergeAndUploadCanvas.ts | 18 +- .../src/features/canvas/util/generateMask.ts | 2 +- .../components/CurrentImageDisplay.tsx | 15 +- .../components/CurrentImagePreview.tsx | 13 +- .../gallery/components/DeleteImageModal.tsx | 35 +- .../gallery/components/HoverableImage.tsx | 2 + .../gallery/components/ImageGallery.tsx | 59 +- .../ImageMetadataViewer.tsx | 24 +- .../gallery/store/gallerySelectors.ts | 11 +- .../features/gallery/store/gallerySlice.ts | 6 +- .../gallery/store/thunks/uploadImage.ts | 8 +- .../features/lightbox/components/Lightbox.tsx | 6 +- .../lightbox/components/ReactPanZoom.tsx | 2 +- .../lightbox/store/lightboxSelectors.ts | 4 +- .../features/lightbox/store/lightboxSlice.ts | 2 +- .../AccordionItems/InvokeAccordionItem.tsx | 2 +- .../BoundingBox/BoundingBoxSettings.tsx | 5 +- .../Canvas/InfillAndScalingSettings.tsx | 5 +- .../Canvas/SeamCorrection/SeamSize.tsx | 5 +- .../Canvas/SeamCorrection/SeamSteps.tsx | 1 - .../Canvas/SeamCorrection/SeamStrength.tsx | 1 - .../FaceRestore/FaceRestoreSettings.tsx | 8 +- .../FaceRestore/FaceRestoreToggle.tsx | 2 +- .../ImageToImage/ImageFit.tsx | 2 +- .../ImageToImage/ImageToImageStrength.tsx | 1 - .../Output/SeamlessSettings.tsx | 6 +- .../AdvancedParameters/Seed/Perlin.tsx | 1 - .../AdvancedParameters/Seed/RandomizeSeed.tsx | 1 - .../AdvancedParameters/Seed/Seed.tsx | 1 - .../AdvancedParameters/Seed/SeedSettings.tsx | 2 +- .../AdvancedParameters/Seed/ShuffleSeed.tsx | 1 - .../AdvancedParameters/Seed/Threshold.tsx | 1 - .../Upscale/UpscaleSettings.tsx | 10 +- .../Upscale/UpscaleToggle.tsx | 2 +- .../Variations/GenerateVariations.tsx | 2 +- .../Variations/SeedWeights.tsx | 2 +- .../Variations/VariationAmount.tsx | 1 - .../MainParameters/MainCFGScale.tsx | 5 +- .../components/MainParameters/MainHeight.tsx | 5 +- .../MainParameters/MainIterations.tsx | 6 +- .../components/MainParameters/MainSteps.tsx | 1 - .../components/MainParameters/MainWidth.tsx | 4 +- .../components/ParametersAccordion.tsx | 2 +- .../ProcessButtons/CancelButton.tsx | 15 +- .../ProcessButtons/InvokeButton.tsx | 4 +- .../components/ProcessButtons/Loopback.tsx | 4 +- .../ProcessButtons/ProcessButtons.tsx | 6 +- .../components/PromptInput/PromptInput.tsx | 18 +- .../parameters/store/generationSelectors.ts | 4 +- .../parameters/store/generationSlice.ts | 2 +- .../store/postprocessingSelectors.ts | 3 +- .../parameters/store/postprocessingSlice.ts | 4 +- .../features/system/components/Console.tsx | 6 +- .../components/HotkeysModal/HotkeysModal.tsx | 2 +- .../HotkeysModal/HotkeysModalItem.tsx | 2 - .../system/components/LanguagePicker.tsx | 5 +- .../ModelManager/AddCheckpointModel.tsx | 12 +- .../ModelManager/AddDiffusersModel.tsx | 5 +- .../components/ModelManager/AddModel.tsx | 3 +- .../ModelManager/CheckpointModelEdit.tsx | 17 +- .../ModelManager/DiffusersModelEdit.tsx | 17 +- .../components/ModelManager/ModelList.tsx | 13 +- .../components/ModelManager/ModelListItem.tsx | 3 +- .../ModelManager/ModelManagerModal.tsx | 10 +- .../components/ModelManager/SearchModels.tsx | 19 +- .../system/components/ModelSelect.tsx | 22 +- .../system/components/ProgressBar.tsx | 2 +- .../SettingsModal/SettingsModal.tsx | 18 +- .../features/system/components/SiteHeader.tsx | 10 +- .../system/components/StatusIndicator.tsx | 8 +- .../system/components/ThemeChanger.tsx | 12 +- .../features/system/hooks/useToastWatcher.ts | 2 +- .../src/features/system/store/systemSlice.ts | 4 +- .../ui/components/FloatingGalleryButton.tsx | 8 +- .../FloatingParametersPanelButtons.tsx | 25 +- .../ImageToImage/InitialImageOverlay.tsx | 1 - .../ui/components/ImageToImage/index.tsx | 5 +- .../ui/components/InvokeParametersPanel.tsx | 15 +- .../src/features/ui/components/InvokeTabs.tsx | 21 +- .../features/ui/components/InvokeWorkarea.tsx | 12 +- .../ui/components/TextToImage/index.tsx | 2 +- .../UnifiedCanvasDisplayBeta.tsx | 19 +- .../UnifiedCanvasBaseBrushSettings.tsx | 1 - .../UnifiedCanvasBrushSettings.tsx | 1 - .../UnifiedCanvasBrushSize.tsx | 1 - .../UnifiedCanvasClearMask.tsx | 1 - .../UnifiedCanvasColorPicker.tsx | 10 +- .../UnifiedCanvasDarkenOutsideSelection.tsx | 1 - .../UnifiedCanvasEnableMask.tsx | 1 - .../UnifiedCanvasLimitStrokesToBox.tsx | 1 - .../UnifiedCanvasMaskBrushSettings.tsx | 1 - .../UnifiedCanvasMoveSettings.tsx | 1 - .../UnifiedCanvasPreserveMask.tsx | 1 - .../UnifiedCanvasSettings.tsx | 17 +- .../UnifiedCanvasShowGrid.tsx | 1 - .../UnifiedCanvasSnapToGrid.tsx | 2 +- .../UnifiedCanvasToolSettingsBeta.tsx | 7 +- .../UnifiedCanvasCopyToClipboard.tsx | 1 - .../UnifiedCanvasDownloadImage.tsx | 1 - .../UnifiedCanvasFileUploader.tsx | 1 - .../UnifiedCanvasLayerSelect.tsx | 7 +- .../UnifiedCanvasMergeVisible.tsx | 1 - .../UnifiedCanvasMoveTool.tsx | 1 - .../UnifiedCanvasProcessingButtons.tsx | 1 - .../UnifiedCanvasResetCanvas.tsx | 1 - .../UnifiedCanvasResetView.tsx | 1 - .../UnifiedCanvasSaveToGallery.tsx | 1 - .../UnifiedCanvasToolSelect.tsx | 23 +- .../UnifiedCanvasToolbarBeta.tsx | 22 +- .../UnifiedCanvas/UnifiedCanvasDisplay.tsx | 13 +- .../UnifiedCanvas/UnifiedCanvasWorkarea.tsx | 6 +- .../frontend/src/features/ui/store/tabMap.ts | 2 +- .../src/features/ui/store/uiSelectors.ts | 9 +- .../frontend/src/features/ui/store/uiSlice.ts | 2 +- invokeai/frontend/src/i18.d.ts | 10 +- invokeai/frontend/src/i18n.ts | 2 +- invokeai/frontend/src/main.tsx | 10 +- invokeai/frontend/src/persistor.ts | 2 +- .../src/styles/Mixins/_Responsive.scss | 298 +++--- .../frontend/src/styles/Mixins/index.scss | 2 +- invokeai/frontend/vite.config.ts | 12 +- invokeai/frontend/yarn.lock | 966 +++++++++++++++++- 185 files changed, 1933 insertions(+), 868 deletions(-) create mode 100644 invokeai/frontend/.babelrc create mode 100644 invokeai/frontend/.eslintignore create mode 100644 invokeai/frontend/.eslintrc.js create mode 100755 invokeai/frontend/.husky/pre-commit create mode 100644 invokeai/frontend/.prettierignore create mode 100644 invokeai/frontend/.prettierrc.js diff --git a/invokeai/frontend/.babelrc b/invokeai/frontend/.babelrc new file mode 100644 index 0000000000..809872138a --- /dev/null +++ b/invokeai/frontend/.babelrc @@ -0,0 +1,13 @@ +{ + "plugins": [ + [ + "transform-imports", + { + "lodash": { + "transform": "lodash/${member}", + "preventFullImport": true + } + } + ] + ] +} diff --git a/invokeai/frontend/.eslintignore b/invokeai/frontend/.eslintignore new file mode 100644 index 0000000000..31ae502559 --- /dev/null +++ b/invokeai/frontend/.eslintignore @@ -0,0 +1,5 @@ +dist/ +.husky/ +node_modules/ +patches/ +public/ diff --git a/invokeai/frontend/.eslintrc.js b/invokeai/frontend/.eslintrc.js new file mode 100644 index 0000000000..c0d6f3d3b8 --- /dev/null +++ b/invokeai/frontend/.eslintrc.js @@ -0,0 +1,40 @@ +module.exports = { + env: { + browser: true, + es6: true, + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react/recommended', + 'plugin:react-hooks/recommended', + 'plugin:prettier/recommended', + 'plugin:react/jsx-runtime', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 2018, + sourceType: 'module', + }, + plugins: ['react', '@typescript-eslint', 'eslint-plugin-react-hooks'], + root: true, + rules: { + 'react-hooks/exhaustive-deps': 'error', + 'no-var': 'error', + 'brace-style': 'error', + 'prefer-template': 'error', + radix: 'error', + 'space-before-blocks': 'error', + 'import/prefer-default-export': 'off', + '@typescript-eslint/no-unused-vars': ['warn', { varsIgnorePattern: '_+' }], + }, + settings: { + react: { + version: 'detect', + }, + }, +}; diff --git a/invokeai/frontend/.gitignore b/invokeai/frontend/.gitignore index fb702ebed8..e750940752 100644 --- a/invokeai/frontend/.gitignore +++ b/invokeai/frontend/.gitignore @@ -23,3 +23,6 @@ dist-ssr *.njsproj *.sln *.sw? + +# build stats +stats.html \ No newline at end of file diff --git a/invokeai/frontend/.husky/pre-commit b/invokeai/frontend/.husky/pre-commit new file mode 100755 index 0000000000..7d52ea24a2 --- /dev/null +++ b/invokeai/frontend/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +cd invokeai/frontend/ && yarn run lint diff --git a/invokeai/frontend/.prettierignore b/invokeai/frontend/.prettierignore new file mode 100644 index 0000000000..31ae502559 --- /dev/null +++ b/invokeai/frontend/.prettierignore @@ -0,0 +1,5 @@ +dist/ +.husky/ +node_modules/ +patches/ +public/ diff --git a/invokeai/frontend/.prettierrc.js b/invokeai/frontend/.prettierrc.js new file mode 100644 index 0000000000..f1284c64ef --- /dev/null +++ b/invokeai/frontend/.prettierrc.js @@ -0,0 +1,6 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: true, + singleQuote: true, +}; diff --git a/invokeai/frontend/dist/locales/options/en.json b/invokeai/frontend/dist/locales/options/en.json index 5bca8b0950..17a439cf11 100644 --- a/invokeai/frontend/dist/locales/options/en.json +++ b/invokeai/frontend/dist/locales/options/en.json @@ -48,7 +48,6 @@ "sendTo": "Send to", "sendToImg2Img": "Send to Image to Image", "sendToUnifiedCanvas": "Send To Unified Canvas", - "copyImage": "Copy Image", "copyImageToLink": "Copy Image To Link", "downloadImage": "Download Image", "openInViewer": "Open In Viewer", diff --git a/invokeai/frontend/package.json b/invokeai/frontend/package.json index 1409fcc108..3afc742dc0 100644 --- a/invokeai/frontend/package.json +++ b/invokeai/frontend/package.json @@ -2,15 +2,16 @@ "name": "invoke-ai-ui", "private": true, "version": "0.0.1", - "type": "module", "scripts": { + "prepare": "cd ../../ && husky install invokeai/frontend/.husky", "dev": "vite dev", "build": "tsc && vite build", "build-dev": "tsc && vite build -m development", "preview": "vite preview", "madge": "madge --circular src/main.tsx", - "lint": "eslint src/", - "prettier": "prettier *.{json,cjs,ts,html} src/**/*.{ts,tsx}", + "lint": "eslint --fix .", + "lint-staged": "lint-staged", + "prettier": "prettier *.{json,js,ts,html} src/**/*.{ts,tsx,scss} --write .", "fmt": "npm run prettier -- --write", "postinstall": "patch-package" }, @@ -64,13 +65,20 @@ "@typescript-eslint/parser": "^5.36.2", "@vitejs/plugin-legacy": "^3.0.1", "@vitejs/plugin-react": "^2.0.1", + "babel-plugin-transform-imports": "^2.0.0", "eslint": "^8.23.0", + "eslint-config-prettier": "^8.6.0", "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", + "husky": "^8.0.3", + "lint-staged": "^13.1.0", "madge": "^5.0.1", "patch-package": "^6.5.0", "postinstall-postinstall": "^2.1.0", - "prettier": "^2.8.1", + "prettier": "^2.8.3", + "prettier-plugin-organize-imports": "^3.2.2", + "rollup-plugin-visualizer": "^5.9.0", "sass": "^1.55.0", "terser": "^5.16.1", "tsc-watch": "^5.0.3", @@ -88,5 +96,11 @@ "skipTypeImports": true } } + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,cjs}": [ + "npx prettier --write", + "npx eslint --fix" + ] } } diff --git a/invokeai/frontend/public/locales/parameters/en.json b/invokeai/frontend/public/locales/parameters/en.json index 92e4d35545..17a439cf11 100644 --- a/invokeai/frontend/public/locales/parameters/en.json +++ b/invokeai/frontend/public/locales/parameters/en.json @@ -49,7 +49,6 @@ "sendToImg2Img": "Send to Image to Image", "sendToUnifiedCanvas": "Send To Unified Canvas", "copyImageToLink": "Copy Image To Link", - "copyImage": "Copy Image", "downloadImage": "Download Image", "openInViewer": "Open In Viewer", "closeViewer": "Close Viewer", diff --git a/invokeai/frontend/src/app/App.tsx b/invokeai/frontend/src/app/App.tsx index 82c84f84f4..d0ed2ab016 100644 --- a/invokeai/frontend/src/app/App.tsx +++ b/invokeai/frontend/src/app/App.tsx @@ -1,14 +1,14 @@ +import ImageUploader from 'common/components/ImageUploader'; +import Console from 'features/system/components/Console'; import ProgressBar from 'features/system/components/ProgressBar'; import SiteHeader from 'features/system/components/SiteHeader'; -import Console from 'features/system/components/Console'; -import { keepGUIAlive } from './utils'; import InvokeTabs from 'features/ui/components/InvokeTabs'; -import ImageUploader from 'common/components/ImageUploader'; +import { keepGUIAlive } from './utils'; import useToastWatcher from 'features/system/hooks/useToastWatcher'; -import FloatingParametersPanelButtons from 'features/ui/components/FloatingParametersPanelButtons'; import FloatingGalleryButton from 'features/ui/components/FloatingGalleryButton'; +import FloatingParametersPanelButtons from 'features/ui/components/FloatingParametersPanelButtons'; keepGUIAlive(); diff --git a/invokeai/frontend/src/app/selectors/readinessSelector.ts b/invokeai/frontend/src/app/selectors/readinessSelector.ts index 2df9e1138e..cc85c3ca6c 100644 --- a/invokeai/frontend/src/app/selectors/readinessSelector.ts +++ b/invokeai/frontend/src/app/selectors/readinessSelector.ts @@ -1,10 +1,10 @@ import { createSelector } from '@reduxjs/toolkit'; -import _ from 'lodash'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; -import { systemSelector } from 'features/system/store/systemSelectors'; import { validateSeedWeights } from 'common/util/seedWeightPairs'; import { initialCanvasImageSelector } from 'features/canvas/store/canvasSelectors'; import { generationSelector } from 'features/parameters/store/generationSelectors'; +import { systemSelector } from 'features/system/store/systemSelectors'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { isEqual } from 'lodash'; export const readinessSelector = createSelector( [ @@ -65,8 +65,8 @@ export const readinessSelector = createSelector( }, { memoizeOptions: { - equalityCheck: _.isEqual, - resultEqualityCheck: _.isEqual, + equalityCheck: isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/app/socketio/actions.ts b/invokeai/frontend/src/app/socketio/actions.ts index 9ab8fa4b31..35c9955def 100644 --- a/invokeai/frontend/src/app/socketio/actions.ts +++ b/invokeai/frontend/src/app/socketio/actions.ts @@ -1,7 +1,7 @@ import { createAction } from '@reduxjs/toolkit'; +import * as InvokeAI from 'app/invokeai'; import { GalleryCategory } from 'features/gallery/store/gallerySlice'; import { InvokeTabName } from 'features/ui/store/tabMap'; -import * as InvokeAI from 'app/invokeai'; /** * We can't use redux-toolkit's createSlice() to make these actions, diff --git a/invokeai/frontend/src/app/socketio/emitters.ts b/invokeai/frontend/src/app/socketio/emitters.ts index edd1287432..6978fa9d2b 100644 --- a/invokeai/frontend/src/app/socketio/emitters.ts +++ b/invokeai/frontend/src/app/socketio/emitters.ts @@ -1,10 +1,11 @@ import { AnyAction, Dispatch, MiddlewareAPI } from '@reduxjs/toolkit'; -import dateFormat from 'dateformat'; -import { Socket } from 'socket.io-client'; +import * as InvokeAI from 'app/invokeai'; +import type { RootState } from 'app/store'; import { frontendToBackendParameters, FrontendToBackendParametersConfig, } from 'common/util/parameterTranslation'; +import dateFormat from 'dateformat'; import { GalleryCategory, GalleryState, @@ -17,8 +18,7 @@ import { setIsProcessing, } from 'features/system/store/systemSlice'; import { InvokeTabName } from 'features/ui/store/tabMap'; -import * as InvokeAI from 'app/invokeai'; -import type { RootState } from 'app/store'; +import { Socket } from 'socket.io-client'; /** * Returns an object containing all functions which use `socketio.emit()`. diff --git a/invokeai/frontend/src/app/socketio/listeners.ts b/invokeai/frontend/src/app/socketio/listeners.ts index a8a85eec69..c83b468069 100644 --- a/invokeai/frontend/src/app/socketio/listeners.ts +++ b/invokeai/frontend/src/app/socketio/listeners.ts @@ -1,24 +1,24 @@ -import { AnyAction, MiddlewareAPI, Dispatch } from '@reduxjs/toolkit'; -import { v4 as uuidv4 } from 'uuid'; +import { AnyAction, Dispatch, MiddlewareAPI } from '@reduxjs/toolkit'; import dateFormat from 'dateformat'; import i18n from 'i18n'; +import { v4 as uuidv4 } from 'uuid'; import * as InvokeAI from 'app/invokeai'; import { addLogEntry, + addToast, + errorOccurred, + processingCanceled, + setCurrentStatus, + setFoundModels, + setIsCancelable, setIsConnected, setIsProcessing, - setSystemStatus, - setCurrentStatus, - setSystemConfig, - processingCanceled, - errorOccurred, setModelList, - setIsCancelable, - addToast, - setFoundModels, setSearchFolder, + setSystemConfig, + setSystemStatus, } from 'features/system/store/systemSlice'; import { @@ -30,20 +30,20 @@ import { setIntermediateImage, } from 'features/gallery/store/gallerySlice'; +import type { RootState } from 'app/store'; +import { addImageToStagingArea } from 'features/canvas/store/canvasSlice'; import { clearInitialImage, setInfillMethod, setInitialImage, setMaskPath, } from 'features/parameters/store/generationSlice'; +import { tabMap } from 'features/ui/store/tabMap'; import { requestImages, requestNewImages, requestSystemConfig, } from './actions'; -import { addImageToStagingArea } from 'features/canvas/store/canvasSlice'; -import { tabMap } from 'features/ui/store/tabMap'; -import type { RootState } from 'app/store'; /** * Returns an object containing listener callbacks for socketio events. diff --git a/invokeai/frontend/src/app/socketio/middleware.ts b/invokeai/frontend/src/app/socketio/middleware.ts index f00274e956..c8dd0d4c29 100644 --- a/invokeai/frontend/src/app/socketio/middleware.ts +++ b/invokeai/frontend/src/app/socketio/middleware.ts @@ -1,8 +1,8 @@ import { Middleware } from '@reduxjs/toolkit'; import { io } from 'socket.io-client'; -import makeSocketIOListeners from './listeners'; import makeSocketIOEmitters from './emitters'; +import makeSocketIOListeners from './listeners'; import * as InvokeAI from 'app/invokeai'; @@ -26,7 +26,7 @@ export const socketioMiddleware = () => { const socketio = io(origin, { timeout: 60000, - path: window.location.pathname + 'socket.io', + path: `${window.location.pathname}socket.io`, }); let areListenersSet = false; diff --git a/invokeai/frontend/src/app/store.ts b/invokeai/frontend/src/app/store.ts index 5a6905f9ea..1776335998 100644 --- a/invokeai/frontend/src/app/store.ts +++ b/invokeai/frontend/src/app/store.ts @@ -5,13 +5,13 @@ import storage from 'redux-persist/lib/storage'; // defaults to localStorage for import { getPersistConfig } from 'redux-deep-persist'; +import canvasReducer from 'features/canvas/store/canvasSlice'; +import galleryReducer from 'features/gallery/store/gallerySlice'; +import lightboxReducer from 'features/lightbox/store/lightboxSlice'; import generationReducer from 'features/parameters/store/generationSlice'; import postprocessingReducer from 'features/parameters/store/postprocessingSlice'; -import galleryReducer from 'features/gallery/store/gallerySlice'; import systemReducer from 'features/system/store/systemSlice'; -import canvasReducer from 'features/canvas/store/canvasSlice'; import uiReducer from 'features/ui/store/uiSlice'; -import lightboxReducer from 'features/lightbox/store/lightboxSlice'; import { socketioMiddleware } from './socketio/middleware'; diff --git a/invokeai/frontend/src/common/components/GuideIcon.tsx b/invokeai/frontend/src/common/components/GuideIcon.tsx index c446024452..7b78affd19 100644 --- a/invokeai/frontend/src/common/components/GuideIcon.tsx +++ b/invokeai/frontend/src/common/components/GuideIcon.tsx @@ -1,7 +1,7 @@ import { Box, forwardRef, Icon } from '@chakra-ui/react'; +import { Feature } from 'app/features'; import { IconType } from 'react-icons'; import { MdHelp } from 'react-icons/md'; -import { Feature } from 'app/features'; import GuidePopover from './GuidePopover'; type GuideIconProps = { diff --git a/invokeai/frontend/src/common/components/GuidePopover.tsx b/invokeai/frontend/src/common/components/GuidePopover.tsx index d4f0ee255e..b2f9dfe494 100644 --- a/invokeai/frontend/src/common/components/GuidePopover.tsx +++ b/invokeai/frontend/src/common/components/GuidePopover.tsx @@ -1,16 +1,16 @@ import { + Box, Popover, PopoverArrow, PopoverContent, PopoverTrigger, - Box, } from '@chakra-ui/react'; -import { SystemState } from 'features/system/store/systemSlice'; -import { useAppSelector } from 'app/storeHooks'; import { createSelector } from '@reduxjs/toolkit'; -import { ReactElement } from 'react'; import { Feature, useFeatureHelpInfo } from 'app/features'; +import { useAppSelector } from 'app/storeHooks'; import { systemSelector } from 'features/system/store/systemSelectors'; +import { SystemState } from 'features/system/store/systemSlice'; +import { ReactElement } from 'react'; type GuideProps = { children: ReactElement; diff --git a/invokeai/frontend/src/common/components/IAIIconButton.tsx b/invokeai/frontend/src/common/components/IAIIconButton.tsx index 239e1f5372..3eedae8e14 100644 --- a/invokeai/frontend/src/common/components/IAIIconButton.tsx +++ b/invokeai/frontend/src/common/components/IAIIconButton.tsx @@ -1,9 +1,9 @@ import { - IconButtonProps, + forwardRef, IconButton, + IconButtonProps, Tooltip, TooltipProps, - forwardRef, } from '@chakra-ui/react'; export type IAIIconButtonProps = IconButtonProps & { diff --git a/invokeai/frontend/src/common/components/IAINumberInput.tsx b/invokeai/frontend/src/common/components/IAINumberInput.tsx index 20da3a1314..a88c246c2a 100644 --- a/invokeai/frontend/src/common/components/IAINumberInput.tsx +++ b/invokeai/frontend/src/common/components/IAINumberInput.tsx @@ -1,19 +1,20 @@ import { FormControl, + FormControlProps, + FormLabel, + FormLabelProps, + NumberDecrementStepper, + NumberIncrementStepper, NumberInput, NumberInputField, - NumberIncrementStepper, - NumberDecrementStepper, - NumberInputProps, - FormLabel, NumberInputFieldProps, + NumberInputProps, NumberInputStepperProps, - FormControlProps, - FormLabelProps, - TooltipProps, Tooltip, + TooltipProps, } from '@chakra-ui/react'; -import _ from 'lodash'; +import { clamp } from 'lodash'; + import { FocusEvent, useEffect, useState } from 'react'; const numberStringRegex = /^-?(0\.)?\.?$/; @@ -104,7 +105,7 @@ const IAINumberInput = (props: Props) => { * clamp it on blur and floor it if needed. */ const handleBlur = (e: FocusEvent) => { - const clamped = _.clamp( + const clamped = clamp( isInteger ? Math.floor(Number(e.target.value)) : Number(e.target.value), min, max diff --git a/invokeai/frontend/src/common/components/IAIPopover.tsx b/invokeai/frontend/src/common/components/IAIPopover.tsx index 74bf1644a4..38a2a24303 100644 --- a/invokeai/frontend/src/common/components/IAIPopover.tsx +++ b/invokeai/frontend/src/common/components/IAIPopover.tsx @@ -1,11 +1,11 @@ import { + BoxProps, Popover, PopoverArrow, PopoverContent, + PopoverProps, PopoverTrigger, - BoxProps, } from '@chakra-ui/react'; -import { PopoverProps } from '@chakra-ui/react'; import { ReactNode } from 'react'; type IAIPopoverProps = PopoverProps & { diff --git a/invokeai/frontend/src/common/components/IAISlider.tsx b/invokeai/frontend/src/common/components/IAISlider.tsx index f512f16545..a4db05e6dc 100644 --- a/invokeai/frontend/src/common/components/IAISlider.tsx +++ b/invokeai/frontend/src/common/components/IAISlider.tsx @@ -23,10 +23,11 @@ import { Tooltip, TooltipProps, } from '@chakra-ui/react'; -import React, { FocusEvent, useMemo, useState, useEffect } from 'react'; +import { clamp } from 'lodash'; + +import { FocusEvent, useEffect, useMemo, useState } from 'react'; import { BiReset } from 'react-icons/bi'; import IAIIconButton, { IAIIconButtonProps } from './IAIIconButton'; -import _ from 'lodash'; export type IAIFullSliderProps = { label: string; @@ -122,7 +123,7 @@ export default function IAISlider(props: IAIFullSliderProps) { const handleInputBlur = (e: FocusEvent) => { if (e.target.value === '') e.target.value = String(min); - const clamped = _.clamp( + const clamped = clamp( isInteger ? Math.floor(Number(e.target.value)) : Number(localInputValue), min, numberInputMax diff --git a/invokeai/frontend/src/common/components/ImageUploader.tsx b/invokeai/frontend/src/common/components/ImageUploader.tsx index f214802ff1..75d2b9b332 100644 --- a/invokeai/frontend/src/common/components/ImageUploader.tsx +++ b/invokeai/frontend/src/common/components/ImageUploader.tsx @@ -1,20 +1,20 @@ -import { - useCallback, - ReactNode, - useState, - useEffect, - KeyboardEvent, -} from 'react'; -import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { FileRejection, useDropzone } from 'react-dropzone'; import { useToast } from '@chakra-ui/react'; import { ImageUploaderTriggerContext } from 'app/contexts/ImageUploaderTriggerContext'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; -import { tabDict } from 'features/ui/components/InvokeTabs'; -import ImageUploadOverlay from './ImageUploadOverlay'; -import { uploadImage } from 'features/gallery/store/thunks/uploadImage'; +import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import useImageUploader from 'common/hooks/useImageUploader'; +import { uploadImage } from 'features/gallery/store/thunks/uploadImage'; +import { tabDict } from 'features/ui/components/InvokeTabs'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { + KeyboardEvent, + ReactNode, + useCallback, + useEffect, + useState, +} from 'react'; +import { FileRejection, useDropzone } from 'react-dropzone'; import { useTranslation } from 'react-i18next'; +import ImageUploadOverlay from './ImageUploadOverlay'; type ImageUploaderProps = { children: ReactNode; @@ -33,7 +33,7 @@ const ImageUploader = (props: ImageUploaderProps) => { (rejection: FileRejection) => { setIsHandlingUpload(true); const msg = rejection.errors.reduce( - (acc: string, cur: { message: string }) => acc + '\n' + cur.message, + (acc: string, cur: { message: string }) => `${acc}\n${cur.message}`, '' ); toast({ diff --git a/invokeai/frontend/src/common/components/ImageUploaderButton.tsx b/invokeai/frontend/src/common/components/ImageUploaderButton.tsx index c11428cec7..5cf2375630 100644 --- a/invokeai/frontend/src/common/components/ImageUploaderButton.tsx +++ b/invokeai/frontend/src/common/components/ImageUploaderButton.tsx @@ -1,7 +1,7 @@ import { Heading } from '@chakra-ui/react'; +import { ImageUploaderTriggerContext } from 'app/contexts/ImageUploaderTriggerContext'; import { useContext } from 'react'; import { FaUpload } from 'react-icons/fa'; -import { ImageUploaderTriggerContext } from 'app/contexts/ImageUploaderTriggerContext'; type ImageUploaderButtonProps = { styleClass?: string; diff --git a/invokeai/frontend/src/common/components/ImageUploaderIconButton.tsx b/invokeai/frontend/src/common/components/ImageUploaderIconButton.tsx index b35b32afce..d3c7e4f7b4 100644 --- a/invokeai/frontend/src/common/components/ImageUploaderIconButton.tsx +++ b/invokeai/frontend/src/common/components/ImageUploaderIconButton.tsx @@ -1,6 +1,6 @@ +import { ImageUploaderTriggerContext } from 'app/contexts/ImageUploaderTriggerContext'; import { useContext } from 'react'; import { FaUpload } from 'react-icons/fa'; -import { ImageUploaderTriggerContext } from 'app/contexts/ImageUploaderTriggerContext'; import IAIIconButton from './IAIIconButton'; const ImageUploaderIconButton = () => { diff --git a/invokeai/frontend/src/common/components/WorkInProgress/NodesWIP.tsx b/invokeai/frontend/src/common/components/WorkInProgress/NodesWIP.tsx index 0dfe7e275e..b5fdaf4f47 100644 --- a/invokeai/frontend/src/common/components/WorkInProgress/NodesWIP.tsx +++ b/invokeai/frontend/src/common/components/WorkInProgress/NodesWIP.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useTranslation } from 'react-i18next'; export default function NodesWIP() { diff --git a/invokeai/frontend/src/common/components/WorkInProgress/PostProcessingWIP.tsx b/invokeai/frontend/src/common/components/WorkInProgress/PostProcessingWIP.tsx index 3b99248900..aa2b95e75b 100644 --- a/invokeai/frontend/src/common/components/WorkInProgress/PostProcessingWIP.tsx +++ b/invokeai/frontend/src/common/components/WorkInProgress/PostProcessingWIP.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useTranslation } from 'react-i18next'; export const PostProcessingWIP = () => { diff --git a/invokeai/frontend/src/common/components/WorkInProgress/Training.tsx b/invokeai/frontend/src/common/components/WorkInProgress/Training.tsx index ffdb444f38..8ae53e2b5b 100644 --- a/invokeai/frontend/src/common/components/WorkInProgress/Training.tsx +++ b/invokeai/frontend/src/common/components/WorkInProgress/Training.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { useTranslation } from 'react-i18next'; export default function TrainingWIP() { diff --git a/invokeai/frontend/src/common/components/radix-ui/IAISlider.tsx b/invokeai/frontend/src/common/components/radix-ui/IAISlider.tsx index 01332fe8f9..52faeb18d3 100644 --- a/invokeai/frontend/src/common/components/radix-ui/IAISlider.tsx +++ b/invokeai/frontend/src/common/components/radix-ui/IAISlider.tsx @@ -1,6 +1,5 @@ import { Tooltip } from '@chakra-ui/react'; import * as Slider from '@radix-ui/react-slider'; -import React from 'react'; type IAISliderProps = Slider.SliderProps & { value: number[]; diff --git a/invokeai/frontend/src/common/util/parameterTranslation.ts b/invokeai/frontend/src/common/util/parameterTranslation.ts index e819924a9e..1e429d8958 100644 --- a/invokeai/frontend/src/common/util/parameterTranslation.ts +++ b/invokeai/frontend/src/common/util/parameterTranslation.ts @@ -1,24 +1,24 @@ import { NUMPY_RAND_MAX, NUMPY_RAND_MIN } from 'app/constants'; +import { Dimensions } from 'features/canvas/store/canvasTypes'; import { GenerationState } from 'features/parameters/store/generationSlice'; import { SystemState } from 'features/system/store/systemSlice'; import { Vector2d } from 'konva/lib/types'; -import { Dimensions } from 'features/canvas/store/canvasTypes'; -import { stringToSeedWeightsArray } from './seedWeightPairs'; -import randomInt from './randomInt'; -import { InvokeTabName } from 'features/ui/store/tabMap'; import { CanvasState, isCanvasMaskLine, } from 'features/canvas/store/canvasTypes'; import generateMask from 'features/canvas/util/generateMask'; -import openBase64ImageInTab from './openBase64ImageInTab'; import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; import type { - UpscalingLevel, FacetoolType, + UpscalingLevel, } from 'features/parameters/store/postprocessingSlice'; import { PostprocessingState } from 'features/parameters/store/postprocessingSlice'; +import { InvokeTabName } from 'features/ui/store/tabMap'; +import openBase64ImageInTab from './openBase64ImageInTab'; +import randomInt from './randomInt'; +import { stringToSeedWeightsArray } from './seedWeightPairs'; export type FrontendToBackendParametersConfig = { generationMode: InvokeTabName; diff --git a/invokeai/frontend/src/common/util/seedWeightPairs.ts b/invokeai/frontend/src/common/util/seedWeightPairs.ts index ec64b2742d..e35e69ac9a 100644 --- a/invokeai/frontend/src/common/util/seedWeightPairs.ts +++ b/invokeai/frontend/src/common/util/seedWeightPairs.ts @@ -63,6 +63,6 @@ export const stringToSeedWeightsArray = ( const stringPairs = string.split(','); const arrPairs = stringPairs.map((p) => p.split(':')); return arrPairs.map( - (p: Array): Array => [parseInt(p[0]), parseFloat(p[1])] + (p: Array): Array => [parseInt(p[0], 10), parseFloat(p[1])] ); }; diff --git a/invokeai/frontend/src/features/canvas/components/IAICanvas.tsx b/invokeai/frontend/src/features/canvas/components/IAICanvas.tsx index 32f65bb676..a077884a99 100644 --- a/invokeai/frontend/src/features/canvas/components/IAICanvas.tsx +++ b/invokeai/frontend/src/features/canvas/components/IAICanvas.tsx @@ -1,37 +1,38 @@ -import { useCallback, useRef } from 'react'; -import Konva from 'konva'; -import { Layer, Stage } from 'react-konva'; +import { createSelector } from '@reduxjs/toolkit'; import { useAppSelector } from 'app/storeHooks'; import { canvasSelector, isStagingSelector, } from 'features/canvas/store/canvasSelectors'; -import IAICanvasMaskLines from './IAICanvasMaskLines'; -import IAICanvasToolPreview from './IAICanvasToolPreview'; +import Konva from 'konva'; +import { KonvaEventObject } from 'konva/lib/Node'; import { Vector2d } from 'konva/lib/types'; -import IAICanvasBoundingBox from './IAICanvasToolbar/IAICanvasBoundingBox'; +import { isEqual } from 'lodash'; + +import { useCallback, useRef } from 'react'; +import { Layer, Stage } from 'react-konva'; +import useCanvasDragMove from '../hooks/useCanvasDragMove'; import useCanvasHotkeys from '../hooks/useCanvasHotkeys'; -import _ from 'lodash'; -import { createSelector } from '@reduxjs/toolkit'; -import IAICanvasMaskCompositer from './IAICanvasMaskCompositer'; -import useCanvasWheel from '../hooks/useCanvasZoom'; import useCanvasMouseDown from '../hooks/useCanvasMouseDown'; -import useCanvasMouseUp from '../hooks/useCanvasMouseUp'; import useCanvasMouseMove from '../hooks/useCanvasMouseMove'; import useCanvasMouseOut from '../hooks/useCanvasMouseOut'; -import useCanvasDragMove from '../hooks/useCanvasDragMove'; -import IAICanvasObjectRenderer from './IAICanvasObjectRenderer'; -import IAICanvasGrid from './IAICanvasGrid'; -import IAICanvasIntermediateImage from './IAICanvasIntermediateImage'; -import IAICanvasStatusText from './IAICanvasStatusText'; -import IAICanvasStagingArea from './IAICanvasStagingArea'; -import IAICanvasStagingAreaToolbar from './IAICanvasStagingAreaToolbar'; +import useCanvasMouseUp from '../hooks/useCanvasMouseUp'; +import useCanvasWheel from '../hooks/useCanvasZoom'; import { setCanvasBaseLayer, setCanvasStage, } from '../util/konvaInstanceProvider'; -import { KonvaEventObject } from 'konva/lib/Node'; import IAICanvasBoundingBoxOverlay from './IAICanvasBoundingBoxOverlay'; +import IAICanvasGrid from './IAICanvasGrid'; +import IAICanvasIntermediateImage from './IAICanvasIntermediateImage'; +import IAICanvasMaskCompositer from './IAICanvasMaskCompositer'; +import IAICanvasMaskLines from './IAICanvasMaskLines'; +import IAICanvasObjectRenderer from './IAICanvasObjectRenderer'; +import IAICanvasStagingArea from './IAICanvasStagingArea'; +import IAICanvasStagingAreaToolbar from './IAICanvasStagingAreaToolbar'; +import IAICanvasStatusText from './IAICanvasStatusText'; +import IAICanvasBoundingBox from './IAICanvasToolbar/IAICanvasBoundingBox'; +import IAICanvasToolPreview from './IAICanvasToolPreview'; const selector = createSelector( [canvasSelector, isStagingSelector], @@ -82,7 +83,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/canvas/components/IAICanvasBoundingBoxOverlay.tsx b/invokeai/frontend/src/features/canvas/components/IAICanvasBoundingBoxOverlay.tsx index 72612d92f5..a572c4418d 100644 --- a/invokeai/frontend/src/features/canvas/components/IAICanvasBoundingBoxOverlay.tsx +++ b/invokeai/frontend/src/features/canvas/components/IAICanvasBoundingBoxOverlay.tsx @@ -1,6 +1,7 @@ import { createSelector } from '@reduxjs/toolkit'; import { useAppSelector } from 'app/storeHooks'; -import _ from 'lodash'; +import { isEqual } from 'lodash'; + import { Group, Rect } from 'react-konva'; import { canvasSelector } from '../store/canvasSelectors'; @@ -27,7 +28,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/canvas/components/IAICanvasGrid.tsx b/invokeai/frontend/src/features/canvas/components/IAICanvasGrid.tsx index 0caa13297b..9ffed8d70a 100644 --- a/invokeai/frontend/src/features/canvas/components/IAICanvasGrid.tsx +++ b/invokeai/frontend/src/features/canvas/components/IAICanvasGrid.tsx @@ -3,10 +3,11 @@ import { useColorMode } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; import { useAppSelector } from 'app/storeHooks'; -import _ from 'lodash'; +import { canvasSelector } from 'features/canvas/store/canvasSelectors'; +import { isEqual, range } from 'lodash'; + import { ReactNode, useCallback, useLayoutEffect, useState } from 'react'; import { Group, Line as KonvaLine } from 'react-konva'; -import { canvasSelector } from 'features/canvas/store/canvasSelectors'; const selector = createSelector( [canvasSelector], @@ -16,7 +17,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); @@ -85,7 +86,7 @@ const IAICanvasGrid = () => { xSteps = Math.round(xSize / 64) + 1, ySteps = Math.round(ySize / 64) + 1; - const xLines = _.range(0, xSteps).map((i) => ( + const xLines = range(0, xSteps).map((i) => ( { strokeWidth={1} /> )); - const yLines = _.range(0, ySteps).map((i) => ( + const yLines = range(0, ySteps).map((i) => ( { dispatch( setBrushColor({ ...brushColor, - a: _.clamp(brushColor.a - 0.05, 0.05, 1), + a: clamp(brushColor.a - 0.05, 0.05, 1), }) ); }, @@ -160,7 +161,7 @@ const IAICanvasToolChooserOptions = () => { dispatch( setBrushColor({ ...brushColor, - a: _.clamp(brushColor.a + 0.05, 0.05, 1), + a: clamp(brushColor.a + 0.05, 0.05, 1), }) ); }, diff --git a/invokeai/frontend/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx b/invokeai/frontend/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx index 9b1eb034a4..42b62e3690 100644 --- a/invokeai/frontend/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx +++ b/invokeai/frontend/src/features/canvas/components/IAICanvasToolbar/IAICanvasToolbar.tsx @@ -1,5 +1,14 @@ import { ButtonGroup } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; +import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import IAIIconButton from 'common/components/IAIIconButton'; +import IAISelect from 'common/components/IAISelect'; +import useImageUploader from 'common/hooks/useImageUploader'; +import { useSingleAndDoubleClick } from 'common/hooks/useSingleAndDoubleClick'; +import { + canvasSelector, + isStagingSelector, +} from 'features/canvas/store/canvasSelectors'; import { resetCanvas, resetCanvasView, @@ -8,9 +17,18 @@ import { setLayer, setTool, } from 'features/canvas/store/canvasSlice'; -import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import _ from 'lodash'; -import IAIIconButton from 'common/components/IAIIconButton'; +import { + CanvasLayer, + LAYER_NAMES_DICT, +} from 'features/canvas/store/canvasTypes'; +import { mergeAndUploadCanvas } from 'features/canvas/store/thunks/mergeAndUploadCanvas'; +import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; +import { systemSelector } from 'features/system/store/systemSelectors'; +import { isEqual } from 'lodash'; + +import { ChangeEvent } from 'react'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { useTranslation } from 'react-i18next'; import { FaArrowsAlt, FaCopy, @@ -21,28 +39,11 @@ import { FaTrash, FaUpload, } from 'react-icons/fa'; -import IAICanvasUndoButton from './IAICanvasUndoButton'; +import IAICanvasMaskOptions from './IAICanvasMaskOptions'; import IAICanvasRedoButton from './IAICanvasRedoButton'; import IAICanvasSettingsButtonPopover from './IAICanvasSettingsButtonPopover'; -import IAICanvasMaskOptions from './IAICanvasMaskOptions'; -import { mergeAndUploadCanvas } from 'features/canvas/store/thunks/mergeAndUploadCanvas'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; -import { systemSelector } from 'features/system/store/systemSelectors'; import IAICanvasToolChooserOptions from './IAICanvasToolChooserOptions'; -import useImageUploader from 'common/hooks/useImageUploader'; -import { - canvasSelector, - isStagingSelector, -} from 'features/canvas/store/canvasSelectors'; -import IAISelect from 'common/components/IAISelect'; -import { - CanvasLayer, - LAYER_NAMES_DICT, -} from 'features/canvas/store/canvasTypes'; -import { ChangeEvent } from 'react'; -import { useTranslation } from 'react-i18next'; -import { useSingleAndDoubleClick } from 'common/hooks/useSingleAndDoubleClick'; +import IAICanvasUndoButton from './IAICanvasUndoButton'; export const selector = createSelector( [systemSelector, canvasSelector, isStagingSelector], @@ -62,7 +63,7 @@ export const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/canvas/components/IAICanvasToolbar/IAICanvasUndoButton.tsx b/invokeai/frontend/src/features/canvas/components/IAICanvasToolbar/IAICanvasUndoButton.tsx index fd8ee6af16..845de0e78d 100644 --- a/invokeai/frontend/src/features/canvas/components/IAICanvasToolbar/IAICanvasUndoButton.tsx +++ b/invokeai/frontend/src/features/canvas/components/IAICanvasToolbar/IAICanvasUndoButton.tsx @@ -1,14 +1,15 @@ import { createSelector } from '@reduxjs/toolkit'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { FaUndo } from 'react-icons/fa'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAIIconButton from 'common/components/IAIIconButton'; import { canvasSelector } from 'features/canvas/store/canvasSelectors'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { FaUndo } from 'react-icons/fa'; -import _ from 'lodash'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; import { undo } from 'features/canvas/store/canvasSlice'; import { systemSelector } from 'features/system/store/systemSelectors'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; + +import { isEqual } from 'lodash'; import { useTranslation } from 'react-i18next'; const canvasUndoSelector = createSelector( @@ -23,7 +24,7 @@ const canvasUndoSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/canvas/hooks/useCanvasDragMove.ts b/invokeai/frontend/src/features/canvas/hooks/useCanvasDragMove.ts index 43ebdd8b61..6a14e4ebc9 100644 --- a/invokeai/frontend/src/features/canvas/hooks/useCanvasDragMove.ts +++ b/invokeai/frontend/src/features/canvas/hooks/useCanvasDragMove.ts @@ -1,8 +1,5 @@ import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { KonvaEventObject } from 'konva/lib/Node'; -import _ from 'lodash'; -import { useCallback } from 'react'; import { canvasSelector, isStagingSelector, @@ -11,6 +8,10 @@ import { setIsMovingStage, setStageCoordinates, } from 'features/canvas/store/canvasSlice'; +import { KonvaEventObject } from 'konva/lib/Node'; +import { isEqual } from 'lodash'; + +import { useCallback } from 'react'; const selector = createSelector( [canvasSelector, isStagingSelector], @@ -22,7 +23,7 @@ const selector = createSelector( isMovingBoundingBox, }; }, - { memoizeOptions: { resultEqualityCheck: _.isEqual } } + { memoizeOptions: { resultEqualityCheck: isEqual } } ); const useCanvasDrag = () => { diff --git a/invokeai/frontend/src/features/canvas/hooks/useCanvasHotkeys.ts b/invokeai/frontend/src/features/canvas/hooks/useCanvasHotkeys.ts index 82da1ba0c2..d082da3ae9 100644 --- a/invokeai/frontend/src/features/canvas/hooks/useCanvasHotkeys.ts +++ b/invokeai/frontend/src/features/canvas/hooks/useCanvasHotkeys.ts @@ -1,7 +1,9 @@ import { createSelector } from '@reduxjs/toolkit'; -import _ from 'lodash'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import { + canvasSelector, + isStagingSelector, +} from 'features/canvas/store/canvasSelectors'; import { clearMask, resetCanvasInteractionState, @@ -10,12 +12,11 @@ import { setShouldSnapToGrid, setTool, } from 'features/canvas/store/canvasSlice'; -import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { isEqual } from 'lodash'; + import { useRef } from 'react'; -import { - canvasSelector, - isStagingSelector, -} from 'features/canvas/store/canvasSelectors'; +import { useHotkeys } from 'react-hotkeys-hook'; import { CanvasTool } from '../store/canvasTypes'; import { getCanvasStage } from '../util/konvaInstanceProvider'; @@ -44,7 +45,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseDown.ts b/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseDown.ts index 26dbb459e2..a64faefafc 100644 --- a/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseDown.ts +++ b/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseDown.ts @@ -1,10 +1,5 @@ import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; -import Konva from 'konva'; -import { KonvaEventObject } from 'konva/lib/Node'; -import _ from 'lodash'; -import { MutableRefObject, useCallback } from 'react'; import { canvasSelector, isStagingSelector, @@ -14,6 +9,12 @@ import { setIsDrawing, setIsMovingStage, } from 'features/canvas/store/canvasSlice'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import Konva from 'konva'; +import { KonvaEventObject } from 'konva/lib/Node'; +import { isEqual } from 'lodash'; + +import { MutableRefObject, useCallback } from 'react'; import getScaledCursorPosition from '../util/getScaledCursorPosition'; import useColorPicker from './useColorUnderCursor'; @@ -27,7 +28,7 @@ const selector = createSelector( isStaging, }; }, - { memoizeOptions: { resultEqualityCheck: _.isEqual } } + { memoizeOptions: { resultEqualityCheck: isEqual } } ); const useCanvasMouseDown = (stageRef: MutableRefObject) => { diff --git a/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseMove.ts b/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseMove.ts index aa66fb0147..2adb02fd6d 100644 --- a/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseMove.ts +++ b/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseMove.ts @@ -1,10 +1,5 @@ import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; -import Konva from 'konva'; -import { Vector2d } from 'konva/lib/types'; -import _ from 'lodash'; -import { MutableRefObject, useCallback } from 'react'; import { canvasSelector, isStagingSelector, @@ -13,6 +8,12 @@ import { addPointToCurrentLine, setCursorPosition, } from 'features/canvas/store/canvasSlice'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import Konva from 'konva'; +import { Vector2d } from 'konva/lib/types'; +import { isEqual } from 'lodash'; + +import { MutableRefObject, useCallback } from 'react'; import getScaledCursorPosition from '../util/getScaledCursorPosition'; import useColorPicker from './useColorUnderCursor'; @@ -27,7 +28,7 @@ const selector = createSelector( isStaging, }; }, - { memoizeOptions: { resultEqualityCheck: _.isEqual } } + { memoizeOptions: { resultEqualityCheck: isEqual } } ); const useCanvasMouseMove = ( diff --git a/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseOut.ts b/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseOut.ts index 57f36faf0a..edea9cfff1 100644 --- a/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseOut.ts +++ b/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseOut.ts @@ -1,6 +1,6 @@ import { useAppDispatch } from 'app/storeHooks'; -import { useCallback } from 'react'; import { mouseLeftCanvas } from 'features/canvas/store/canvasSlice'; +import { useCallback } from 'react'; const useCanvasMouseOut = () => { const dispatch = useAppDispatch(); diff --git a/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseUp.ts b/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseUp.ts index 7e607ed0f8..0284f42a79 100644 --- a/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseUp.ts +++ b/invokeai/frontend/src/features/canvas/hooks/useCanvasMouseUp.ts @@ -1,9 +1,5 @@ import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; -import Konva from 'konva'; -import _ from 'lodash'; -import { MutableRefObject, useCallback } from 'react'; import { canvasSelector, isStagingSelector, @@ -14,6 +10,11 @@ import { setIsDrawing, setIsMovingStage, } from 'features/canvas/store/canvasSlice'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import Konva from 'konva'; +import { isEqual } from 'lodash'; + +import { MutableRefObject, useCallback } from 'react'; import getScaledCursorPosition from '../util/getScaledCursorPosition'; const selector = createSelector( @@ -27,7 +28,7 @@ const selector = createSelector( isStaging, }; }, - { memoizeOptions: { resultEqualityCheck: _.isEqual } } + { memoizeOptions: { resultEqualityCheck: isEqual } } ); const useCanvasMouseUp = ( diff --git a/invokeai/frontend/src/features/canvas/hooks/useCanvasZoom.ts b/invokeai/frontend/src/features/canvas/hooks/useCanvasZoom.ts index 2d3cf3703d..14f9d37d7d 100644 --- a/invokeai/frontend/src/features/canvas/hooks/useCanvasZoom.ts +++ b/invokeai/frontend/src/features/canvas/hooks/useCanvasZoom.ts @@ -1,14 +1,15 @@ import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import Konva from 'konva'; -import { KonvaEventObject } from 'konva/lib/Node'; -import _ from 'lodash'; -import { MutableRefObject, useCallback } from 'react'; import { canvasSelector } from 'features/canvas/store/canvasSelectors'; import { setStageCoordinates, setStageScale, } from 'features/canvas/store/canvasSlice'; +import Konva from 'konva'; +import { KonvaEventObject } from 'konva/lib/Node'; +import { clamp, isEqual } from 'lodash'; + +import { MutableRefObject, useCallback } from 'react'; import { CANVAS_SCALE_BY, MAX_CANVAS_SCALE, @@ -24,7 +25,7 @@ const selector = createSelector( stageScale, }; }, - { memoizeOptions: { resultEqualityCheck: _.isEqual } } + { memoizeOptions: { resultEqualityCheck: isEqual } } ); const useCanvasWheel = (stageRef: MutableRefObject) => { @@ -55,7 +56,7 @@ const useCanvasWheel = (stageRef: MutableRefObject) => { delta = -delta; } - const newScale = _.clamp( + const newScale = clamp( stageScale * CANVAS_SCALE_BY ** delta, MIN_CANVAS_SCALE, MAX_CANVAS_SCALE diff --git a/invokeai/frontend/src/features/canvas/hooks/useColorUnderCursor.ts b/invokeai/frontend/src/features/canvas/hooks/useColorUnderCursor.ts index 29a6bbcbbb..00f7a2b46a 100644 --- a/invokeai/frontend/src/features/canvas/hooks/useColorUnderCursor.ts +++ b/invokeai/frontend/src/features/canvas/hooks/useColorUnderCursor.ts @@ -1,6 +1,5 @@ import { useAppDispatch } from 'app/storeHooks'; import Konva from 'konva'; -import _ from 'lodash'; import { commitColorPickerColor, setColorPickerColor, diff --git a/invokeai/frontend/src/features/canvas/store/canvasSelectors.ts b/invokeai/frontend/src/features/canvas/store/canvasSelectors.ts index 5243426795..3f81f71fad 100644 --- a/invokeai/frontend/src/features/canvas/store/canvasSelectors.ts +++ b/invokeai/frontend/src/features/canvas/store/canvasSelectors.ts @@ -1,7 +1,7 @@ import { createSelector } from '@reduxjs/toolkit'; import { RootState } from 'app/store'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; import { systemSelector } from 'features/system/store/systemSelectors'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; import { CanvasImage, CanvasState, isCanvasBaseImage } from './canvasTypes'; export const canvasSelector = (state: RootState): CanvasState => state.canvas; diff --git a/invokeai/frontend/src/features/canvas/store/canvasSlice.ts b/invokeai/frontend/src/features/canvas/store/canvasSlice.ts index ef0d0cef48..3e564af907 100644 --- a/invokeai/frontend/src/features/canvas/store/canvasSlice.ts +++ b/invokeai/frontend/src/features/canvas/store/canvasSlice.ts @@ -6,7 +6,8 @@ import { roundToMultiple, } from 'common/util/roundDownToMultiple'; import { IRect, Vector2d } from 'konva/lib/types'; -import _ from 'lodash'; +import { clamp, cloneDeep } from 'lodash'; +// import { RgbaColor } from 'react-colorful'; import calculateCoordinates from '../util/calculateCoordinates'; import calculateScale from '../util/calculateScale'; @@ -16,10 +17,10 @@ import getScaledBoundingBoxDimensions from '../util/getScaledBoundingBoxDimensio import roundDimensionsTo64 from '../util/roundDimensionsTo64'; import { BoundingBoxScale, + CanvasBaseLine, CanvasImage, CanvasLayer, CanvasLayerState, - CanvasBaseLine, CanvasMaskLine, CanvasState, CanvasTool, @@ -120,7 +121,7 @@ export const canvasSlice = createSlice({ state.brushSize = action.payload; }, clearMask: (state) => { - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); state.layerState.objects = state.layerState.objects.filter( (obj) => !isCanvasMaskLine(obj) ); @@ -160,8 +161,8 @@ export const canvasSlice = createSlice({ const { stageDimensions } = state; const newBoundingBoxDimensions = { - width: roundDownToMultiple(_.clamp(image.width, 64, 512), 64), - height: roundDownToMultiple(_.clamp(image.height, 64, 512), 64), + width: roundDownToMultiple(clamp(image.width, 64, 512), 64), + height: roundDownToMultiple(clamp(image.height, 64, 512), 64), }; const newBoundingBoxCoordinates = { @@ -185,7 +186,7 @@ export const canvasSlice = createSlice({ state.boundingBoxDimensions = newBoundingBoxDimensions; state.boundingBoxCoordinates = newBoundingBoxCoordinates; - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); state.layerState = { ...initialLayerState, @@ -297,7 +298,7 @@ export const canvasSlice = createSlice({ if (!boundingBox || !image) return; - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); if (state.pastLayerStates.length > state.maxHistory) { state.pastLayerStates.shift(); @@ -316,7 +317,7 @@ export const canvasSlice = createSlice({ state.futureLayerStates = []; }, discardStagedImages: (state) => { - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); if (state.pastLayerStates.length > state.maxHistory) { state.pastLayerStates.shift(); @@ -334,7 +335,7 @@ export const canvasSlice = createSlice({ const { boundingBoxCoordinates, boundingBoxDimensions, brushColor } = state; - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); if (state.pastLayerStates.length > state.maxHistory) { state.pastLayerStates.shift(); @@ -353,7 +354,7 @@ export const canvasSlice = createSlice({ addEraseRect: (state) => { const { boundingBoxCoordinates, boundingBoxDimensions } = state; - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); if (state.pastLayerStates.length > state.maxHistory) { state.pastLayerStates.shift(); @@ -380,7 +381,7 @@ export const canvasSlice = createSlice({ const newColor = layer === 'base' && tool === 'brush' ? { color: brushColor } : {}; - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); if (state.pastLayerStates.length > state.maxHistory) { state.pastLayerStates.shift(); @@ -418,7 +419,7 @@ export const canvasSlice = createSlice({ if (!targetState) return; - state.futureLayerStates.unshift(_.cloneDeep(state.layerState)); + state.futureLayerStates.unshift(cloneDeep(state.layerState)); if (state.futureLayerStates.length > state.maxHistory) { state.futureLayerStates.pop(); @@ -431,7 +432,7 @@ export const canvasSlice = createSlice({ if (!targetState) return; - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); if (state.pastLayerStates.length > state.maxHistory) { state.pastLayerStates.shift(); @@ -455,7 +456,7 @@ export const canvasSlice = createSlice({ state.shouldShowIntermediates = action.payload; }, resetCanvas: (state) => { - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); state.layerState = initialLayerState; state.futureLayerStates = []; @@ -681,7 +682,7 @@ export const canvasSlice = createSlice({ commitStagingAreaImage: (state) => { const { images, selectedImageIndex } = state.layerState.stagingArea; - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); if (state.pastLayerStates.length > state.maxHistory) { state.pastLayerStates.shift(); @@ -718,8 +719,8 @@ export const canvasSlice = createSlice({ scaledStageHeight ) { const newBoundingBoxDimensions = { - width: roundDownToMultiple(_.clamp(scaledStageWidth, 64, 512), 64), - height: roundDownToMultiple(_.clamp(scaledStageHeight, 64, 512), 64), + width: roundDownToMultiple(clamp(scaledStageWidth, 64, 512), 64), + height: roundDownToMultiple(clamp(scaledStageHeight, 64, 512), 64), }; const newBoundingBoxCoordinates = { @@ -792,7 +793,7 @@ export const canvasSlice = createSlice({ state.tool = 'brush'; }, setMergedCanvas: (state, action: PayloadAction) => { - state.pastLayerStates.push(_.cloneDeep(state.layerState)); + state.pastLayerStates.push(cloneDeep(state.layerState)); state.futureLayerStates = []; diff --git a/invokeai/frontend/src/features/canvas/store/canvasTypes.ts b/invokeai/frontend/src/features/canvas/store/canvasTypes.ts index f70d33fe5c..984f0d4f6b 100644 --- a/invokeai/frontend/src/features/canvas/store/canvasTypes.ts +++ b/invokeai/frontend/src/features/canvas/store/canvasTypes.ts @@ -9,7 +9,7 @@ export const LAYER_NAMES_DICT = [ export const LAYER_NAMES = ['base', 'mask'] as const; -export type CanvasLayer = typeof LAYER_NAMES[number]; +export type CanvasLayer = (typeof LAYER_NAMES)[number]; export const BOUNDING_BOX_SCALES_DICT = [ { key: 'Auto', value: 'auto' }, @@ -19,7 +19,7 @@ export const BOUNDING_BOX_SCALES_DICT = [ export const BOUNDING_BOX_SCALES = ['none', 'auto', 'manual'] as const; -export type BoundingBoxScale = typeof BOUNDING_BOX_SCALES[number]; +export type BoundingBoxScale = (typeof BOUNDING_BOX_SCALES)[number]; export type CanvasDrawingTool = 'brush' | 'eraser'; diff --git a/invokeai/frontend/src/features/canvas/store/thunks/mergeAndUploadCanvas.ts b/invokeai/frontend/src/features/canvas/store/thunks/mergeAndUploadCanvas.ts index a229c91908..9eaff2e0b2 100644 --- a/invokeai/frontend/src/features/canvas/store/thunks/mergeAndUploadCanvas.ts +++ b/invokeai/frontend/src/features/canvas/store/thunks/mergeAndUploadCanvas.ts @@ -1,11 +1,7 @@ import { AnyAction, ThunkAction } from '@reduxjs/toolkit'; -import { RootState } from 'app/store'; import * as InvokeAI from 'app/invokeai'; -import { v4 as uuidv4 } from 'uuid'; -import layerToDataURL from '../../util/layerToDataURL'; -import downloadFile from '../../util/downloadFile'; -import copyImage from '../../util/copyImage'; -import { getCanvasBaseLayer } from '../../util/konvaInstanceProvider'; +import { RootState } from 'app/store'; +import { addImage } from 'features/gallery/store/gallerySlice'; import { addToast, setCurrentStatus, @@ -13,10 +9,14 @@ import { setIsProcessing, setProcessingIndeterminateTask, } from 'features/system/store/systemSlice'; -import { addImage } from 'features/gallery/store/gallerySlice'; +import i18n from 'i18n'; +import { v4 as uuidv4 } from 'uuid'; +import copyImage from '../../util/copyImage'; +import downloadFile from '../../util/downloadFile'; +import { getCanvasBaseLayer } from '../../util/konvaInstanceProvider'; +import layerToDataURL from '../../util/layerToDataURL'; import { setMergedCanvas } from '../canvasSlice'; import { CanvasState } from '../canvasTypes'; -import i18n from 'i18n'; type MergeAndUploadCanvasConfig = { cropVisible?: boolean; @@ -96,7 +96,7 @@ export const mergeAndUploadCanvas = }) ); - const response = await fetch(window.location.origin + '/upload', { + const response = await fetch(`${window.location.origin}/upload`, { method: 'POST', body: formData, }); diff --git a/invokeai/frontend/src/features/canvas/util/generateMask.ts b/invokeai/frontend/src/features/canvas/util/generateMask.ts index 7c0c7c08fa..9187ac2ac7 100644 --- a/invokeai/frontend/src/features/canvas/util/generateMask.ts +++ b/invokeai/frontend/src/features/canvas/util/generateMask.ts @@ -1,6 +1,6 @@ +import { CanvasMaskLine } from 'features/canvas/store/canvasTypes'; import Konva from 'konva'; import { IRect } from 'konva/lib/types'; -import { CanvasMaskLine } from 'features/canvas/store/canvasTypes'; /** * Generating a mask image from InpaintingCanvas.tsx is not as simple diff --git a/invokeai/frontend/src/features/gallery/components/CurrentImageDisplay.tsx b/invokeai/frontend/src/features/gallery/components/CurrentImageDisplay.tsx index b15748f2eb..a5e9683afd 100644 --- a/invokeai/frontend/src/features/gallery/components/CurrentImageDisplay.tsx +++ b/invokeai/frontend/src/features/gallery/components/CurrentImageDisplay.tsx @@ -1,15 +1,16 @@ -import { useAppSelector } from 'app/storeHooks'; -import CurrentImageButtons from './CurrentImageButtons'; -import { MdPhoto } from 'react-icons/md'; -import CurrentImagePreview from './CurrentImagePreview'; -import { GalleryState } from 'features/gallery/store/gallerySlice'; -import _ from 'lodash'; import { createSelector } from '@reduxjs/toolkit'; +import { useAppSelector } from 'app/storeHooks'; +import { GalleryState } from 'features/gallery/store/gallerySlice'; import { activeTabNameSelector, uiSelector, } from 'features/ui/store/uiSelectors'; +import { isEqual } from 'lodash'; + +import { MdPhoto } from 'react-icons/md'; import { gallerySelector } from '../store/gallerySelectors'; +import CurrentImageButtons from './CurrentImageButtons'; +import CurrentImagePreview from './CurrentImagePreview'; export const currentImageDisplaySelector = createSelector( [gallerySelector, uiSelector, activeTabNameSelector], @@ -25,7 +26,7 @@ export const currentImageDisplaySelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/gallery/components/CurrentImagePreview.tsx b/invokeai/frontend/src/features/gallery/components/CurrentImagePreview.tsx index 87d478a0a4..dc32db215b 100644 --- a/invokeai/frontend/src/features/gallery/components/CurrentImagePreview.tsx +++ b/invokeai/frontend/src/features/gallery/components/CurrentImagePreview.tsx @@ -1,6 +1,5 @@ import { IconButton, Image } from '@chakra-ui/react'; -import { useState } from 'react'; -import { FaAngleLeft, FaAngleRight } from 'react-icons/fa'; +import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { GalleryCategory, @@ -8,11 +7,13 @@ import { selectNextImage, selectPrevImage, } from 'features/gallery/store/gallerySlice'; -import { createSelector } from '@reduxjs/toolkit'; -import _ from 'lodash'; -import ImageMetadataViewer from './ImageMetaDataViewer/ImageMetadataViewer'; import { uiSelector } from 'features/ui/store/uiSelectors'; +import { isEqual } from 'lodash'; + +import { useState } from 'react'; +import { FaAngleLeft, FaAngleRight } from 'react-icons/fa'; import { gallerySelector } from '../store/gallerySelectors'; +import ImageMetadataViewer from './ImageMetaDataViewer/ImageMetadataViewer'; export const imagesSelector = createSelector( [gallerySelector, uiSelector], @@ -45,7 +46,7 @@ export const imagesSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/gallery/components/DeleteImageModal.tsx b/invokeai/frontend/src/features/gallery/components/DeleteImageModal.tsx index bd00b742c0..67d9b89b04 100644 --- a/invokeai/frontend/src/features/gallery/components/DeleteImageModal.tsx +++ b/invokeai/frontend/src/features/gallery/components/DeleteImageModal.tsx @@ -1,31 +1,38 @@ import { - Text, AlertDialog, AlertDialogBody, + AlertDialogContent, AlertDialogFooter, AlertDialogHeader, - AlertDialogContent, AlertDialogOverlay, - useDisclosure, Button, - Switch, + Flex, FormControl, FormLabel, - Flex, + Switch, + Text, + useDisclosure, } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; -import { ChangeEvent, ReactElement, SyntheticEvent } from 'react'; -import { cloneElement, forwardRef, useRef } from 'react'; -import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import * as InvokeAI from 'app/invokeai'; import { deleteImage } from 'app/socketio/actions'; +import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import { systemSelector } from 'features/system/store/systemSelectors'; import { setShouldConfirmOnDelete, SystemState, } from 'features/system/store/systemSlice'; -import * as InvokeAI from 'app/invokeai'; +import { isEqual } from 'lodash'; + +import { + ChangeEvent, + cloneElement, + forwardRef, + ReactElement, + SyntheticEvent, + useRef, +} from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; -import _ from 'lodash'; -import { systemSelector } from 'features/system/store/systemSelectors'; const deleteImageModalSelector = createSelector( systemSelector, @@ -35,7 +42,7 @@ const deleteImageModalSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); @@ -116,7 +123,7 @@ const DeleteImageModal = forwardRef( - Don't ask me again + Don't ask me again { ); }, memoEqualityCheck); +HoverableImage.displayName = 'HoverableImage'; + export default HoverableImage; diff --git a/invokeai/frontend/src/features/gallery/components/ImageGallery.tsx b/invokeai/frontend/src/features/gallery/components/ImageGallery.tsx index 5e1b6a49f7..41929d0126 100644 --- a/invokeai/frontend/src/features/gallery/components/ImageGallery.tsx +++ b/invokeai/frontend/src/features/gallery/components/ImageGallery.tsx @@ -1,19 +1,16 @@ import { Button } from '@chakra-ui/button'; import { NumberSize, Resizable } from 're-resizable'; -import React, { - ChangeEvent, - useCallback, - useEffect, - useRef, - useState, -} from 'react'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { MdPhotoLibrary } from 'react-icons/md'; -import { BsPinAngle, BsPinAngleFill } from 'react-icons/bs'; +import { ButtonGroup } from '@chakra-ui/react'; import { requestImages } from 'app/socketio/actions'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import IAIButton from 'common/components/IAIButton'; +import IAICheckbox from 'common/components/IAICheckbox'; import IAIIconButton from 'common/components/IAIIconButton'; +import IAIPopover from 'common/components/IAIPopover'; +import IAISlider from 'common/components/IAISlider'; +import { setDoesCanvasNeedScaling } from 'features/canvas/store/canvasSlice'; +import { imageGallerySelector } from 'features/gallery/store/gallerySelectors'; import { selectNextImage, selectPrevImage, @@ -25,24 +22,28 @@ import { setShouldAutoSwitchToNewImages, setShouldHoldGalleryOpen, setShouldPinGallery, + setShouldShowGallery, setShouldUseSingleGalleryColumn, } from 'features/gallery/store/gallerySlice'; -import HoverableImage from './HoverableImage'; -import { setShouldShowGallery } from 'features/gallery/store/gallerySlice'; -import { ButtonGroup } from '@chakra-ui/react'; -import { CSSTransition } from 'react-transition-group'; -import { Direction } from 're-resizable/lib/resizer'; -import { imageGallerySelector } from 'features/gallery/store/gallerySelectors'; -import { FaImage, FaUser, FaWrench } from 'react-icons/fa'; -import IAIPopover from 'common/components/IAIPopover'; -import IAISlider from 'common/components/IAISlider'; -import { BiReset } from 'react-icons/bi'; -import IAICheckbox from 'common/components/IAICheckbox'; -import { setDoesCanvasNeedScaling } from 'features/canvas/store/canvasSlice'; -import _ from 'lodash'; -import IAIButton from 'common/components/IAIButton'; import { InvokeTabName } from 'features/ui/store/tabMap'; + +import { clamp } from 'lodash'; +import { Direction } from 're-resizable/lib/resizer'; +import React, { + ChangeEvent, + useCallback, + useEffect, + useRef, + useState, +} from 'react'; +import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; +import { BiReset } from 'react-icons/bi'; +import { BsPinAngle, BsPinAngleFill } from 'react-icons/bs'; +import { FaImage, FaUser, FaWrench } from 'react-icons/fa'; +import { MdPhotoLibrary } from 'react-icons/md'; +import { CSSTransition } from 'react-transition-group'; +import HoverableImage from './HoverableImage'; const GALLERY_SHOW_BUTTONS_MIN_WIDTH = 320; const GALLERY_IMAGE_WIDTH_OFFSET = 40; @@ -212,7 +213,7 @@ export default function ImageGallery() { 'shift+up', () => { if (galleryImageMinimumWidth < 256) { - const newMinWidth = _.clamp( + const newMinWidth = clamp( galleryImageMinimumWidth + IMAGE_SIZE_STEP, 32, 256 @@ -227,7 +228,7 @@ export default function ImageGallery() { 'shift+down', () => { if (galleryImageMinimumWidth > 32) { - const newMinWidth = _.clamp( + const newMinWidth = clamp( galleryImageMinimumWidth - IMAGE_SIZE_STEP, 32, 256 @@ -315,7 +316,7 @@ export default function ImageGallery() { delta: NumberSize ) => { const newWidth = shouldPinGallery - ? _.clamp( + ? clamp( Number(galleryWidth) + delta.width, galleryMinWidth, Number(galleryMaxWidth) @@ -342,7 +343,7 @@ export default function ImageGallery() { elementRef: HTMLElement, delta: NumberSize ) => { - const newWidth = _.clamp( + const newWidth = clamp( Number(galleryWidth) + delta.width, galleryMinWidth, Number( @@ -553,7 +554,7 @@ export default function ImageGallery() { {isResizing && (
diff --git a/invokeai/frontend/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx b/invokeai/frontend/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx index 8a6275402b..a43664bb27 100644 --- a/invokeai/frontend/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx +++ b/invokeai/frontend/src/features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer.tsx @@ -1,3 +1,4 @@ +import { ExternalLinkIcon } from '@chakra-ui/icons'; import { Center, Flex, @@ -7,16 +8,17 @@ import { Text, Tooltip, } from '@chakra-ui/react'; -import { ExternalLinkIcon } from '@chakra-ui/icons'; -import { memo } from 'react'; -import { IoArrowUndoCircleOutline } from 'react-icons/io5'; -import { useAppDispatch } from 'app/storeHooks'; import * as InvokeAI from 'app/invokeai'; +import { useAppDispatch } from 'app/storeHooks'; +import promptToString from 'common/util/promptToString'; +import { seedWeightsToString } from 'common/util/seedWeightPairs'; import { setCfgScale, setHeight, setImg2imgStrength, + setInitialImage, setMaskPath, + setPerlin, setPrompt, setSampler, setSeamless, @@ -24,24 +26,22 @@ import { setSeedWeights, setShouldFitToWidthHeight, setSteps, - setWidth, - setInitialImage, setThreshold, - setPerlin, + setWidth, } from 'features/parameters/store/generationSlice'; import { - setFacetoolStrength, setCodeformerFidelity, + setFacetoolStrength, setFacetoolType, setHiresFix, setUpscalingLevel, setUpscalingStrength, } from 'features/parameters/store/postprocessingSlice'; import { setShouldShowImageDetails } from 'features/ui/store/uiSlice'; -import promptToString from 'common/util/promptToString'; -import { seedWeightsToString } from 'common/util/seedWeightPairs'; -import { FaCopy } from 'react-icons/fa'; +import { memo } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; +import { FaCopy } from 'react-icons/fa'; +import { IoArrowUndoCircleOutline } from 'react-icons/io5'; type MetadataItemProps = { isLink?: boolean; @@ -459,4 +459,6 @@ const ImageMetadataViewer = memo( memoEqualityCheck ); +ImageMetadataViewer.displayName = 'ImageMetadataViewer'; + export default ImageMetadataViewer; diff --git a/invokeai/frontend/src/features/gallery/store/gallerySelectors.ts b/invokeai/frontend/src/features/gallery/store/gallerySelectors.ts index 79711e46c8..fc1cb5d996 100644 --- a/invokeai/frontend/src/features/gallery/store/gallerySelectors.ts +++ b/invokeai/frontend/src/features/gallery/store/gallerySelectors.ts @@ -1,11 +1,12 @@ import { createSelector } from '@reduxjs/toolkit'; import { RootState } from 'app/store'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; -import { GalleryState } from './gallerySlice'; -import _ from 'lodash'; import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; import { lightboxSelector } from 'features/lightbox/store/lightboxSelectors'; import { systemSelector } from 'features/system/store/systemSelectors'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { isEqual } from 'lodash'; + +import { GalleryState } from './gallerySlice'; export const gallerySelector = (state: RootState) => state.gallery; @@ -59,7 +60,7 @@ export const imageGallerySelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); @@ -78,7 +79,7 @@ export const hoverableImageSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/gallery/store/gallerySlice.ts b/invokeai/frontend/src/features/gallery/store/gallerySlice.ts index 1a2231898c..52f8c54dc8 100644 --- a/invokeai/frontend/src/features/gallery/store/gallerySlice.ts +++ b/invokeai/frontend/src/features/gallery/store/gallerySlice.ts @@ -1,9 +1,9 @@ -import { createSlice } from '@reduxjs/toolkit'; import type { PayloadAction } from '@reduxjs/toolkit'; -import _, { clamp } from 'lodash'; +import { createSlice } from '@reduxjs/toolkit'; import * as InvokeAI from 'app/invokeai'; -import { IRect } from 'konva/lib/types'; import { InvokeTabName } from 'features/ui/store/tabMap'; +import { IRect } from 'konva/lib/types'; +import { clamp } from 'lodash'; export type GalleryCategory = 'user' | 'result'; diff --git a/invokeai/frontend/src/features/gallery/store/thunks/uploadImage.ts b/invokeai/frontend/src/features/gallery/store/thunks/uploadImage.ts index a7288785e3..7f28928987 100644 --- a/invokeai/frontend/src/features/gallery/store/thunks/uploadImage.ts +++ b/invokeai/frontend/src/features/gallery/store/thunks/uploadImage.ts @@ -1,10 +1,10 @@ import { AnyAction, ThunkAction } from '@reduxjs/toolkit'; -import { RootState } from 'app/store'; import * as InvokeAI from 'app/invokeai'; -import { v4 as uuidv4 } from 'uuid'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { RootState } from 'app/store'; import { setInitialCanvasImage } from 'features/canvas/store/canvasSlice'; import { setInitialImage } from 'features/parameters/store/generationSlice'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { v4 as uuidv4 } from 'uuid'; import { addImage } from '../gallerySlice'; type UploadImageConfig = { @@ -32,7 +32,7 @@ export const uploadImage = }) ); - const response = await fetch(window.location.origin + '/upload', { + const response = await fetch(`${window.location.origin}/upload`, { method: 'POST', body: formData, }); diff --git a/invokeai/frontend/src/features/lightbox/components/Lightbox.tsx b/invokeai/frontend/src/features/lightbox/components/Lightbox.tsx index 59b11249f5..d712b8d97e 100644 --- a/invokeai/frontend/src/features/lightbox/components/Lightbox.tsx +++ b/invokeai/frontend/src/features/lightbox/components/Lightbox.tsx @@ -4,14 +4,14 @@ import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAIIconButton from 'common/components/IAIIconButton'; import CurrentImageButtons from 'features/gallery/components/CurrentImageButtons'; import { imagesSelector } from 'features/gallery/components/CurrentImagePreview'; +import ImageGallery from 'features/gallery/components/ImageGallery'; +import ImageMetadataViewer from 'features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer'; import { selectNextImage, selectPrevImage, } from 'features/gallery/store/gallerySlice'; -import ImageGallery from 'features/gallery/components/ImageGallery'; -import ImageMetadataViewer from 'features/gallery/components/ImageMetaDataViewer/ImageMetadataViewer'; import { setIsLightboxOpen } from 'features/lightbox/store/lightboxSlice'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { BiExit } from 'react-icons/bi'; import { FaAngleLeft, FaAngleRight } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/lightbox/components/ReactPanZoom.tsx b/invokeai/frontend/src/features/lightbox/components/ReactPanZoom.tsx index 543fb7dd9c..9401a97874 100644 --- a/invokeai/frontend/src/features/lightbox/components/ReactPanZoom.tsx +++ b/invokeai/frontend/src/features/lightbox/components/ReactPanZoom.tsx @@ -8,7 +8,7 @@ import { BiZoomOut, } from 'react-icons/bi'; import { MdFlip } from 'react-icons/md'; -import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch'; +import { TransformComponent, TransformWrapper } from 'react-zoom-pan-pinch'; type ReactPanZoomProps = { image: string; diff --git a/invokeai/frontend/src/features/lightbox/store/lightboxSelectors.ts b/invokeai/frontend/src/features/lightbox/store/lightboxSelectors.ts index cfb182d2c1..10ee245866 100644 --- a/invokeai/frontend/src/features/lightbox/store/lightboxSelectors.ts +++ b/invokeai/frontend/src/features/lightbox/store/lightboxSelectors.ts @@ -1,13 +1,13 @@ import { createSelector } from '@reduxjs/toolkit'; import { RootState } from 'app/store'; -import _ from 'lodash'; +import { isEqual } from 'lodash'; export const lightboxSelector = createSelector( (state: RootState) => state.lightbox, (lightbox) => lightbox, { memoizeOptions: { - equalityCheck: _.isEqual, + equalityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/lightbox/store/lightboxSlice.ts b/invokeai/frontend/src/features/lightbox/store/lightboxSlice.ts index 4cbab512bc..f7f6507d93 100644 --- a/invokeai/frontend/src/features/lightbox/store/lightboxSlice.ts +++ b/invokeai/frontend/src/features/lightbox/store/lightboxSlice.ts @@ -1,5 +1,5 @@ -import { createSlice } from '@reduxjs/toolkit'; import type { PayloadAction } from '@reduxjs/toolkit'; +import { createSlice } from '@reduxjs/toolkit'; export interface LightboxState { isLightboxOpen: boolean; diff --git a/invokeai/frontend/src/features/parameters/components/AccordionItems/InvokeAccordionItem.tsx b/invokeai/frontend/src/features/parameters/components/AccordionItems/InvokeAccordionItem.tsx index 142fe0ba8f..196fa1bfe1 100644 --- a/invokeai/frontend/src/features/parameters/components/AccordionItems/InvokeAccordionItem.tsx +++ b/invokeai/frontend/src/features/parameters/components/AccordionItems/InvokeAccordionItem.tsx @@ -6,9 +6,9 @@ import { Box, Flex, } from '@chakra-ui/react'; -import { ReactNode } from 'react'; import { Feature } from 'app/features'; import GuideIcon from 'common/components/GuideIcon'; +import { ReactNode } from 'react'; export interface InvokeAccordionItemProps { header: string; diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/BoundingBox/BoundingBoxSettings.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/BoundingBox/BoundingBoxSettings.tsx index 20183d3657..e3babe0078 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/BoundingBox/BoundingBoxSettings.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/BoundingBox/BoundingBoxSettings.tsx @@ -4,7 +4,8 @@ import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAISlider from 'common/components/IAISlider'; import { canvasSelector } from 'features/canvas/store/canvasSelectors'; import { setBoundingBoxDimensions } from 'features/canvas/store/canvasSlice'; -import _ from 'lodash'; +import { isEqual } from 'lodash'; + import { useTranslation } from 'react-i18next'; const selector = createSelector( @@ -19,7 +20,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/InfillAndScalingSettings.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/InfillAndScalingSettings.tsx index d2ae4ec089..dd97a0d644 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/InfillAndScalingSettings.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/InfillAndScalingSettings.tsx @@ -18,7 +18,8 @@ import { setTileSize, } from 'features/parameters/store/generationSlice'; import { systemSelector } from 'features/system/store/systemSelectors'; -import _ from 'lodash'; +import { isEqual } from 'lodash'; + import { ChangeEvent } from 'react'; import { useTranslation } from 'react-i18next'; @@ -45,7 +46,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/SeamCorrection/SeamSize.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/SeamCorrection/SeamSize.tsx index 43d585f0a8..d280e06827 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/SeamCorrection/SeamSize.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Canvas/SeamCorrection/SeamSize.tsx @@ -2,14 +2,15 @@ import type { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAISlider from 'common/components/IAISlider'; import { setSeamSize } from 'features/parameters/store/generationSlice'; -import React from 'react'; import { useTranslation } from 'react-i18next'; export default function SeamSize() { const dispatch = useAppDispatch(); const { t } = useTranslation(); - const seamSize = useAppSelector((state: RootState) => state.generation.seamSize); + const seamSize = useAppSelector( + (state: RootState) => state.generation.seamSize + ); return ( { const dispatch = useAppDispatch(); - const seamless = useAppSelector((state: RootState) => state.generation.seamless); + const seamless = useAppSelector( + (state: RootState) => state.generation.seamless + ); const handleChangeSeamless = (e: ChangeEvent) => dispatch(setSeamless(e.target.checked)); diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Perlin.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Perlin.tsx index 22fc357de9..6b23266ca3 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Perlin.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Perlin.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAINumberInput from 'common/components/IAINumberInput'; diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/RandomizeSeed.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/RandomizeSeed.tsx index ce4f63156e..6b84373ed4 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/RandomizeSeed.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/RandomizeSeed.tsx @@ -1,5 +1,4 @@ import { ChangeEvent } from 'react'; -import React from 'react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Seed.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Seed.tsx index b777040c25..1740616f04 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Seed.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Seed.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { NUMPY_RAND_MAX, NUMPY_RAND_MIN } from 'app/constants'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/SeedSettings.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/SeedSettings.tsx index a671627057..33798de4a4 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/SeedSettings.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/SeedSettings.tsx @@ -1,9 +1,9 @@ import { Flex } from '@chakra-ui/react'; +import Perlin from './Perlin'; import RandomizeSeed from './RandomizeSeed'; import Seed from './Seed'; import ShuffleSeed from './ShuffleSeed'; import Threshold from './Threshold'; -import Perlin from './Perlin'; /** * Seed & variation options. Includes iteration, seed, seed randomization, variation options. diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/ShuffleSeed.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/ShuffleSeed.tsx index 3db60ec825..32841dfe2d 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/ShuffleSeed.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/ShuffleSeed.tsx @@ -1,5 +1,4 @@ import { Button } from '@chakra-ui/react'; -import React from 'react'; import { NUMPY_RAND_MAX, NUMPY_RAND_MIN } from 'app/constants'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Threshold.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Threshold.tsx index 1cc8d7ce2a..e73493ec44 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Threshold.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Seed/Threshold.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAINumberInput from 'common/components/IAINumberInput'; diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Upscale/UpscaleSettings.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Upscale/UpscaleSettings.tsx index 96e217464b..180941597c 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Upscale/UpscaleSettings.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Upscale/UpscaleSettings.tsx @@ -1,20 +1,20 @@ import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { UpscalingLevel } from 'features/parameters/store/postprocessingSlice'; import { setUpscalingLevel, setUpscalingStrength, + UpscalingLevel, } from 'features/parameters/store/postprocessingSlice'; -import { UPSCALING_LEVELS } from 'app/constants'; import { createSelector } from '@reduxjs/toolkit'; -import { isEqual } from 'lodash'; -import { ChangeEvent } from 'react'; +import { UPSCALING_LEVELS } from 'app/constants'; import IAINumberInput from 'common/components/IAINumberInput'; import IAISelect from 'common/components/IAISelect'; -import { useTranslation } from 'react-i18next'; import { postprocessingSelector } from 'features/parameters/store/postprocessingSelectors'; import { systemSelector } from 'features/system/store/systemSelectors'; +import { isEqual } from 'lodash'; +import { ChangeEvent } from 'react'; +import { useTranslation } from 'react-i18next'; const parametersSelector = createSelector( [postprocessingSelector, systemSelector], diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Upscale/UpscaleToggle.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Upscale/UpscaleToggle.tsx index 20680089b0..bcd4c0d8b2 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Upscale/UpscaleToggle.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Upscale/UpscaleToggle.tsx @@ -1,8 +1,8 @@ -import { ChangeEvent } from 'react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAISwitch from 'common/components/IAISwitch'; import { setShouldRunESRGAN } from 'features/parameters/store/postprocessingSlice'; +import { ChangeEvent } from 'react'; export default function UpscaleToggle() { const isESRGANAvailable = useAppSelector( diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/GenerateVariations.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/GenerateVariations.tsx index f417ab2ca7..f47d544a39 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/GenerateVariations.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/GenerateVariations.tsx @@ -1,8 +1,8 @@ -import React, { ChangeEvent } from 'react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAISwitch from 'common/components/IAISwitch'; import { setShouldGenerateVariations } from 'features/parameters/store/generationSlice'; +import { ChangeEvent } from 'react'; export default function GenerateVariationsToggle() { const shouldGenerateVariations = useAppSelector( diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/SeedWeights.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/SeedWeights.tsx index 5287c4b60d..62a61baa3e 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/SeedWeights.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/SeedWeights.tsx @@ -1,9 +1,9 @@ -import React, { ChangeEvent } from 'react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAIInput from 'common/components/IAIInput'; import { validateSeedWeights } from 'common/util/seedWeightPairs'; import { setSeedWeights } from 'features/parameters/store/generationSlice'; +import { ChangeEvent } from 'react'; import { useTranslation } from 'react-i18next'; export default function SeedWeights() { diff --git a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/VariationAmount.tsx b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/VariationAmount.tsx index 59812aff22..b42b409639 100644 --- a/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/VariationAmount.tsx +++ b/invokeai/frontend/src/features/parameters/components/AdvancedParameters/Variations/VariationAmount.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAINumberInput from 'common/components/IAINumberInput'; diff --git a/invokeai/frontend/src/features/parameters/components/MainParameters/MainCFGScale.tsx b/invokeai/frontend/src/features/parameters/components/MainParameters/MainCFGScale.tsx index 6d265de96e..45750458aa 100644 --- a/invokeai/frontend/src/features/parameters/components/MainParameters/MainCFGScale.tsx +++ b/invokeai/frontend/src/features/parameters/components/MainParameters/MainCFGScale.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAINumberInput from 'common/components/IAINumberInput'; @@ -7,7 +6,9 @@ import { useTranslation } from 'react-i18next'; export default function MainCFGScale() { const dispatch = useAppDispatch(); - const cfgScale = useAppSelector((state: RootState) => state.generation.cfgScale); + const cfgScale = useAppSelector( + (state: RootState) => state.generation.cfgScale + ); const { t } = useTranslation(); const handleChangeCfgScale = (v: number) => dispatch(setCfgScale(v)); diff --git a/invokeai/frontend/src/features/parameters/components/MainParameters/MainHeight.tsx b/invokeai/frontend/src/features/parameters/components/MainParameters/MainHeight.tsx index fca214bf63..45854b4d68 100644 --- a/invokeai/frontend/src/features/parameters/components/MainParameters/MainHeight.tsx +++ b/invokeai/frontend/src/features/parameters/components/MainParameters/MainHeight.tsx @@ -1,11 +1,10 @@ -import { ChangeEvent } from 'react'; -import React from 'react'; import { HEIGHTS } from 'app/constants'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAISelect from 'common/components/IAISelect'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; import { setHeight } from 'features/parameters/store/generationSlice'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { ChangeEvent } from 'react'; import { useTranslation } from 'react-i18next'; export default function MainHeight() { diff --git a/invokeai/frontend/src/features/parameters/components/MainParameters/MainIterations.tsx b/invokeai/frontend/src/features/parameters/components/MainParameters/MainIterations.tsx index 4681e30b9a..d5dfc756fc 100644 --- a/invokeai/frontend/src/features/parameters/components/MainParameters/MainIterations.tsx +++ b/invokeai/frontend/src/features/parameters/components/MainParameters/MainIterations.tsx @@ -1,6 +1,4 @@ import { createSelector } from '@reduxjs/toolkit'; -import _ from 'lodash'; -import React from 'react'; import type { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAINumberInput from 'common/components/IAINumberInput'; @@ -8,6 +6,8 @@ import { GenerationState, setIterations, } from 'features/parameters/store/generationSlice'; +import { isEqual } from 'lodash'; + import { useTranslation } from 'react-i18next'; const mainIterationsSelector = createSelector( @@ -21,7 +21,7 @@ const mainIterationsSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/parameters/components/MainParameters/MainSteps.tsx b/invokeai/frontend/src/features/parameters/components/MainParameters/MainSteps.tsx index 4fd24c2115..4296118f77 100644 --- a/invokeai/frontend/src/features/parameters/components/MainParameters/MainSteps.tsx +++ b/invokeai/frontend/src/features/parameters/components/MainParameters/MainSteps.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAINumberInput from 'common/components/IAINumberInput'; diff --git a/invokeai/frontend/src/features/parameters/components/MainParameters/MainWidth.tsx b/invokeai/frontend/src/features/parameters/components/MainParameters/MainWidth.tsx index b106973de0..f0f42b1791 100644 --- a/invokeai/frontend/src/features/parameters/components/MainParameters/MainWidth.tsx +++ b/invokeai/frontend/src/features/parameters/components/MainParameters/MainWidth.tsx @@ -1,10 +1,10 @@ -import React, { ChangeEvent } from 'react'; import { WIDTHS } from 'app/constants'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAISelect from 'common/components/IAISelect'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; import { setWidth } from 'features/parameters/store/generationSlice'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { ChangeEvent } from 'react'; import { useTranslation } from 'react-i18next'; export default function MainWidth() { diff --git a/invokeai/frontend/src/features/parameters/components/ParametersAccordion.tsx b/invokeai/frontend/src/features/parameters/components/ParametersAccordion.tsx index 9faaf8b09c..9738b0d30a 100644 --- a/invokeai/frontend/src/features/parameters/components/ParametersAccordion.tsx +++ b/invokeai/frontend/src/features/parameters/components/ParametersAccordion.tsx @@ -2,10 +2,10 @@ import { Accordion, ExpandedIndex } from '@chakra-ui/react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { setOpenAccordions } from 'features/system/store/systemSlice'; +import { ReactElement } from 'react'; import InvokeAccordionItem, { InvokeAccordionItemProps, } from './AccordionItems/InvokeAccordionItem'; -import { ReactElement } from 'react'; type ParametersAccordionType = { [parametersAccordionKey: string]: InvokeAccordionItemProps; diff --git a/invokeai/frontend/src/features/parameters/components/ProcessButtons/CancelButton.tsx b/invokeai/frontend/src/features/parameters/components/ProcessButtons/CancelButton.tsx index 3777a64848..53f0bd6eb9 100644 --- a/invokeai/frontend/src/features/parameters/components/ProcessButtons/CancelButton.tsx +++ b/invokeai/frontend/src/features/parameters/components/ProcessButtons/CancelButton.tsx @@ -1,15 +1,16 @@ -import { MdCancel } from 'react-icons/md'; +import { createSelector } from '@reduxjs/toolkit'; import { cancelProcessing } from 'app/socketio/actions'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAIIconButton, { IAIIconButtonProps, } from 'common/components/IAIIconButton'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { createSelector } from '@reduxjs/toolkit'; -import { SystemState } from 'features/system/store/systemSlice'; -import _ from 'lodash'; -import { useTranslation } from 'react-i18next'; import { systemSelector } from 'features/system/store/systemSelectors'; +import { SystemState } from 'features/system/store/systemSlice'; +import { isEqual } from 'lodash'; + +import { useHotkeys } from 'react-hotkeys-hook'; +import { useTranslation } from 'react-i18next'; +import { MdCancel } from 'react-icons/md'; const cancelButtonSelector = createSelector( systemSelector, @@ -22,7 +23,7 @@ const cancelButtonSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/parameters/components/ProcessButtons/InvokeButton.tsx b/invokeai/frontend/src/features/parameters/components/ProcessButtons/InvokeButton.tsx index 8a0887a580..84888ddd9a 100644 --- a/invokeai/frontend/src/features/parameters/components/ProcessButtons/InvokeButton.tsx +++ b/invokeai/frontend/src/features/parameters/components/ProcessButtons/InvokeButton.tsx @@ -1,5 +1,3 @@ -import { useHotkeys } from 'react-hotkeys-hook'; -import { FaPlay } from 'react-icons/fa'; import { readinessSelector } from 'app/selectors/readinessSelector'; import { generateImage } from 'app/socketio/actions'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; @@ -8,7 +6,9 @@ import IAIIconButton, { IAIIconButtonProps, } from 'common/components/IAIIconButton'; import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; +import { FaPlay } from 'react-icons/fa'; interface InvokeButton extends Omit { diff --git a/invokeai/frontend/src/features/parameters/components/ProcessButtons/Loopback.tsx b/invokeai/frontend/src/features/parameters/components/ProcessButtons/Loopback.tsx index fec9070cc7..dc15e7ac3b 100644 --- a/invokeai/frontend/src/features/parameters/components/ProcessButtons/Loopback.tsx +++ b/invokeai/frontend/src/features/parameters/components/ProcessButtons/Loopback.tsx @@ -1,10 +1,10 @@ import { createSelector } from '@reduxjs/toolkit'; -import { FaRecycle } from 'react-icons/fa'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAIIconButton from 'common/components/IAIIconButton'; +import { postprocessingSelector } from 'features/parameters/store/postprocessingSelectors'; import { setShouldLoopback } from 'features/parameters/store/postprocessingSlice'; import { useTranslation } from 'react-i18next'; -import { postprocessingSelector } from 'features/parameters/store/postprocessingSelectors'; +import { FaRecycle } from 'react-icons/fa'; const loopbackSelector = createSelector( postprocessingSelector, diff --git a/invokeai/frontend/src/features/parameters/components/ProcessButtons/ProcessButtons.tsx b/invokeai/frontend/src/features/parameters/components/ProcessButtons/ProcessButtons.tsx index f7cd0f9144..0f48fbce8a 100644 --- a/invokeai/frontend/src/features/parameters/components/ProcessButtons/ProcessButtons.tsx +++ b/invokeai/frontend/src/features/parameters/components/ProcessButtons/ProcessButtons.tsx @@ -1,8 +1,8 @@ -import InvokeButton from './InvokeButton'; -import CancelButton from './CancelButton'; -import LoopbackButton from './Loopback'; import { useAppSelector } from 'app/storeHooks'; import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import CancelButton from './CancelButton'; +import InvokeButton from './InvokeButton'; +import LoopbackButton from './Loopback'; /** * Buttons to start and cancel image generation. diff --git a/invokeai/frontend/src/features/parameters/components/PromptInput/PromptInput.tsx b/invokeai/frontend/src/features/parameters/components/PromptInput/PromptInput.tsx index 37a89b2121..17f5294841 100644 --- a/invokeai/frontend/src/features/parameters/components/PromptInput/PromptInput.tsx +++ b/invokeai/frontend/src/features/parameters/components/PromptInput/PromptInput.tsx @@ -1,15 +1,19 @@ import { FormControl, Textarea } from '@chakra-ui/react'; -import { ChangeEvent, KeyboardEvent, useRef } from 'react'; +import { generateImage } from 'app/socketio/actions'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { generateImage } from 'app/socketio/actions'; +import { ChangeEvent, KeyboardEvent, useRef } from 'react'; -import { GenerationState, setPrompt } from 'features/parameters/store/generationSlice'; import { createSelector } from '@reduxjs/toolkit'; -import _ from 'lodash'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; import { readinessSelector } from 'app/selectors/readinessSelector'; +import { + GenerationState, + setPrompt, +} from 'features/parameters/store/generationSlice'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; + +import { isEqual } from 'lodash'; +import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; const promptInputSelector = createSelector( @@ -22,7 +26,7 @@ const promptInputSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/parameters/store/generationSelectors.ts b/invokeai/frontend/src/features/parameters/store/generationSelectors.ts index 979070d71c..5cc8e1a592 100644 --- a/invokeai/frontend/src/features/parameters/store/generationSelectors.ts +++ b/invokeai/frontend/src/features/parameters/store/generationSelectors.ts @@ -1,6 +1,6 @@ import { createSelector } from '@reduxjs/toolkit'; -import _ from 'lodash'; import { RootState } from 'app/store'; +import { isEqual } from 'lodash'; export const generationSelector = (state: RootState) => state.generation; @@ -11,7 +11,7 @@ export const mayGenerateMultipleImagesSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/parameters/store/generationSlice.ts b/invokeai/frontend/src/features/parameters/store/generationSlice.ts index 2a0bf65225..f886309c41 100644 --- a/invokeai/frontend/src/features/parameters/store/generationSlice.ts +++ b/invokeai/frontend/src/features/parameters/store/generationSlice.ts @@ -1,5 +1,5 @@ -import { createSlice } from '@reduxjs/toolkit'; import type { PayloadAction } from '@reduxjs/toolkit'; +import { createSlice } from '@reduxjs/toolkit'; import * as InvokeAI from 'app/invokeai'; import promptToString from 'common/util/promptToString'; import { seedWeightsToString } from 'common/util/seedWeightPairs'; diff --git a/invokeai/frontend/src/features/parameters/store/postprocessingSelectors.ts b/invokeai/frontend/src/features/parameters/store/postprocessingSelectors.ts index e929532507..7cc346cbee 100644 --- a/invokeai/frontend/src/features/parameters/store/postprocessingSelectors.ts +++ b/invokeai/frontend/src/features/parameters/store/postprocessingSelectors.ts @@ -1,3 +1,4 @@ import { RootState } from 'app/store'; -export const postprocessingSelector = (state: RootState) => state.postprocessing; +export const postprocessingSelector = (state: RootState) => + state.postprocessing; diff --git a/invokeai/frontend/src/features/parameters/store/postprocessingSlice.ts b/invokeai/frontend/src/features/parameters/store/postprocessingSlice.ts index 4b6eadee3b..9c7290ec3f 100644 --- a/invokeai/frontend/src/features/parameters/store/postprocessingSlice.ts +++ b/invokeai/frontend/src/features/parameters/store/postprocessingSlice.ts @@ -1,10 +1,10 @@ -import { createSlice } from '@reduxjs/toolkit'; import type { PayloadAction } from '@reduxjs/toolkit'; +import { createSlice } from '@reduxjs/toolkit'; import { FACETOOL_TYPES } from 'app/constants'; export type UpscalingLevel = 2 | 4; -export type FacetoolType = typeof FACETOOL_TYPES[number]; +export type FacetoolType = (typeof FACETOOL_TYPES)[number]; export interface PostprocessingState { codeformerFidelity: number; diff --git a/invokeai/frontend/src/features/system/components/Console.tsx b/invokeai/frontend/src/features/system/components/Console.tsx index a1d7c73aba..e4ad054ed3 100644 --- a/invokeai/frontend/src/features/system/components/Console.tsx +++ b/invokeai/frontend/src/features/system/components/Console.tsx @@ -1,16 +1,16 @@ import { IconButton, Tooltip } from '@chakra-ui/react'; +import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { errorSeen, setShouldShowLogViewer, SystemState, } from 'features/system/store/systemSlice'; -import { useLayoutEffect, useRef, useState } from 'react'; -import { FaAngleDoubleDown, FaCode, FaMinus } from 'react-icons/fa'; -import { createSelector } from '@reduxjs/toolkit'; import { isEqual } from 'lodash'; import { Resizable } from 're-resizable'; +import { useLayoutEffect, useRef, useState } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; +import { FaAngleDoubleDown, FaCode, FaMinus } from 'react-icons/fa'; import { systemSelector } from '../store/systemSelectors'; const logSelector = createSelector( diff --git a/invokeai/frontend/src/features/system/components/HotkeysModal/HotkeysModal.tsx b/invokeai/frontend/src/features/system/components/HotkeysModal/HotkeysModal.tsx index d6823b43d0..ffc4cc5517 100644 --- a/invokeai/frontend/src/features/system/components/HotkeysModal/HotkeysModal.tsx +++ b/invokeai/frontend/src/features/system/components/HotkeysModal/HotkeysModal.tsx @@ -10,7 +10,7 @@ import { ModalOverlay, useDisclosure, } from '@chakra-ui/react'; -import React, { cloneElement, ReactElement } from 'react'; +import { cloneElement, ReactElement } from 'react'; import { useTranslation } from 'react-i18next'; import HotkeysModalItem from './HotkeysModalItem'; diff --git a/invokeai/frontend/src/features/system/components/HotkeysModal/HotkeysModalItem.tsx b/invokeai/frontend/src/features/system/components/HotkeysModal/HotkeysModalItem.tsx index b031573f61..384192d3fe 100644 --- a/invokeai/frontend/src/features/system/components/HotkeysModal/HotkeysModalItem.tsx +++ b/invokeai/frontend/src/features/system/components/HotkeysModal/HotkeysModalItem.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - interface HotkeysModalProps { hotkey: string; title: string; diff --git a/invokeai/frontend/src/features/system/components/LanguagePicker.tsx b/invokeai/frontend/src/features/system/components/LanguagePicker.tsx index 030429c7d8..74eeb17951 100644 --- a/invokeai/frontend/src/features/system/components/LanguagePicker.tsx +++ b/invokeai/frontend/src/features/system/components/LanguagePicker.tsx @@ -1,11 +1,10 @@ import type { ReactNode } from 'react'; import { VStack } from '@chakra-ui/react'; -import IAIPopover from 'common/components/IAIPopover'; -import React from 'react'; import IAIButton from 'common/components/IAIButton'; -import { useTranslation } from 'react-i18next'; import IAIIconButton from 'common/components/IAIIconButton'; +import IAIPopover from 'common/components/IAIPopover'; +import { useTranslation } from 'react-i18next'; import { FaLanguage } from 'react-icons/fa'; export default function LanguagePicker() { diff --git a/invokeai/frontend/src/features/system/components/ModelManager/AddCheckpointModel.tsx b/invokeai/frontend/src/features/system/components/ModelManager/AddCheckpointModel.tsx index 73416bb31d..7ec45c7c82 100644 --- a/invokeai/frontend/src/features/system/components/ModelManager/AddCheckpointModel.tsx +++ b/invokeai/frontend/src/features/system/components/ModelManager/AddCheckpointModel.tsx @@ -8,11 +8,11 @@ import { VStack, } from '@chakra-ui/react'; -import React from 'react'; +import IAIButton from 'common/components/IAIButton'; +import IAICheckbox from 'common/components/IAICheckbox'; import IAIInput from 'common/components/IAIInput'; import IAINumberInput from 'common/components/IAINumberInput'; -import IAICheckbox from 'common/components/IAICheckbox'; -import IAIButton from 'common/components/IAIButton'; +import React from 'react'; import SearchModels from './SearchModels'; @@ -23,11 +23,11 @@ import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { Field, Formik } from 'formik'; import { useTranslation } from 'react-i18next'; -import type { FieldInputProps, FormikProps } from 'formik'; -import type { RootState } from 'app/store'; import type { InvokeModelConfigProps } from 'app/invokeai'; -import { setAddNewModelUIOption } from 'features/ui/store/uiSlice'; +import type { RootState } from 'app/store'; import IAIIconButton from 'common/components/IAIIconButton'; +import { setAddNewModelUIOption } from 'features/ui/store/uiSlice'; +import type { FieldInputProps, FormikProps } from 'formik'; import { BiArrowBack } from 'react-icons/bi'; const MIN_MODEL_SIZE = 64; diff --git a/invokeai/frontend/src/features/system/components/ModelManager/AddDiffusersModel.tsx b/invokeai/frontend/src/features/system/components/ModelManager/AddDiffusersModel.tsx index f44c018554..09d1d4d3c8 100644 --- a/invokeai/frontend/src/features/system/components/ModelManager/AddDiffusersModel.tsx +++ b/invokeai/frontend/src/features/system/components/ModelManager/AddDiffusersModel.tsx @@ -7,17 +7,16 @@ import { Text, VStack, } from '@chakra-ui/react'; +import { InvokeDiffusersModelConfigProps } from 'app/invokeai'; +import { addNewModel } from 'app/socketio/actions'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAIButton from 'common/components/IAIButton'; import IAIIconButton from 'common/components/IAIIconButton'; import IAIInput from 'common/components/IAIInput'; import { setAddNewModelUIOption } from 'features/ui/store/uiSlice'; import { Field, Formik } from 'formik'; -import React from 'react'; import { useTranslation } from 'react-i18next'; import { BiArrowBack } from 'react-icons/bi'; -import { InvokeDiffusersModelConfigProps } from 'app/invokeai'; -import { addNewModel } from 'app/socketio/actions'; import type { RootState } from 'app/store'; import type { ReactElement } from 'react'; diff --git a/invokeai/frontend/src/features/system/components/ModelManager/AddModel.tsx b/invokeai/frontend/src/features/system/components/ModelManager/AddModel.tsx index 5f411be8d8..c5b227707f 100644 --- a/invokeai/frontend/src/features/system/components/ModelManager/AddModel.tsx +++ b/invokeai/frontend/src/features/system/components/ModelManager/AddModel.tsx @@ -10,13 +10,12 @@ import { useDisclosure, } from '@chakra-ui/react'; -import React from 'react'; import IAIButton from 'common/components/IAIButton'; import { FaPlus } from 'react-icons/fa'; -import { useTranslation } from 'react-i18next'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import { useTranslation } from 'react-i18next'; import type { RootState } from 'app/store'; import { setAddNewModelUIOption } from 'features/ui/store/uiSlice'; diff --git a/invokeai/frontend/src/features/system/components/ModelManager/CheckpointModelEdit.tsx b/invokeai/frontend/src/features/system/components/ModelManager/CheckpointModelEdit.tsx index fe842cd874..f189dbd964 100644 --- a/invokeai/frontend/src/features/system/components/ModelManager/CheckpointModelEdit.tsx +++ b/invokeai/frontend/src/features/system/components/ModelManager/CheckpointModelEdit.tsx @@ -1,9 +1,9 @@ import { createSelector } from '@reduxjs/toolkit'; -import React, { useEffect, useState } from 'react'; +import IAIButton from 'common/components/IAIButton'; import IAIInput from 'common/components/IAIInput'; import IAINumberInput from 'common/components/IAINumberInput'; -import IAIButton from 'common/components/IAIButton'; +import { useEffect, useState } from 'react'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { systemSelector } from 'features/system/store/systemSelectors'; @@ -19,15 +19,14 @@ import { VStack, } from '@chakra-ui/react'; +import { addNewModel } from 'app/socketio/actions'; import { Field, Formik } from 'formik'; import { useTranslation } from 'react-i18next'; -import { addNewModel } from 'app/socketio/actions'; - -import _ from 'lodash'; +import type { InvokeModelConfigProps } from 'app/invokeai'; import type { RootState } from 'app/store'; import type { FieldInputProps, FormikProps } from 'formik'; -import type { InvokeModelConfigProps } from 'app/invokeai'; +import { isEqual, pickBy } from 'lodash'; const selector = createSelector( [systemSelector], @@ -40,7 +39,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); @@ -73,8 +72,8 @@ export default function CheckpointModelEdit() { useEffect(() => { if (openModel) { - const retrievedModel = _.pickBy(model_list, (val, key) => { - return _.isEqual(key, openModel); + const retrievedModel = pickBy(model_list, (_val, key) => { + return isEqual(key, openModel); }); setEditModelFormValues({ name: openModel, diff --git a/invokeai/frontend/src/features/system/components/ModelManager/DiffusersModelEdit.tsx b/invokeai/frontend/src/features/system/components/ModelManager/DiffusersModelEdit.tsx index d8b397810a..f7c99964ed 100644 --- a/invokeai/frontend/src/features/system/components/ModelManager/DiffusersModelEdit.tsx +++ b/invokeai/frontend/src/features/system/components/ModelManager/DiffusersModelEdit.tsx @@ -1,8 +1,8 @@ import { createSelector } from '@reduxjs/toolkit'; -import React, { useEffect, useState } from 'react'; -import IAIInput from 'common/components/IAIInput'; import IAIButton from 'common/components/IAIButton'; +import IAIInput from 'common/components/IAIInput'; +import { useEffect, useState } from 'react'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { systemSelector } from 'features/system/store/systemSelectors'; @@ -17,14 +17,13 @@ import { VStack, } from '@chakra-ui/react'; +import { addNewModel } from 'app/socketio/actions'; import { Field, Formik } from 'formik'; import { useTranslation } from 'react-i18next'; -import { addNewModel } from 'app/socketio/actions'; -import _ from 'lodash'; - -import type { RootState } from 'app/store'; import type { InvokeDiffusersModelConfigProps } from 'app/invokeai'; +import type { RootState } from 'app/store'; +import { isEqual, pickBy } from 'lodash'; const selector = createSelector( [systemSelector], @@ -37,7 +36,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); @@ -65,8 +64,8 @@ export default function DiffusersModelEdit() { useEffect(() => { if (openModel) { - const retrievedModel = _.pickBy(model_list, (val, key) => { - return _.isEqual(key, openModel); + const retrievedModel = pickBy(model_list, (_val, key) => { + return isEqual(key, openModel); }); setEditModelFormValues({ diff --git a/invokeai/frontend/src/features/system/components/ModelManager/ModelList.tsx b/invokeai/frontend/src/features/system/components/ModelManager/ModelList.tsx index b36946e4d3..fc2adae357 100644 --- a/invokeai/frontend/src/features/system/components/ModelManager/ModelList.tsx +++ b/invokeai/frontend/src/features/system/components/ModelManager/ModelList.tsx @@ -1,7 +1,7 @@ -import React, { useState, useTransition, useMemo } from 'react'; import { Box, Flex, Text } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; import IAIInput from 'common/components/IAIInput'; +import { useMemo, useState, useTransition } from 'react'; import AddModel from './AddModel'; import ModelListItem from './ModelListItem'; @@ -9,24 +9,23 @@ import ModelListItem from './ModelListItem'; import { useAppSelector } from 'app/storeHooks'; import { useTranslation } from 'react-i18next'; -import _ from 'lodash'; - -import type { ChangeEvent, ReactNode } from 'react'; -import type { SystemState } from 'features/system/store/systemSlice'; import IAIButton from 'common/components/IAIButton'; import { systemSelector } from 'features/system/store/systemSelectors'; +import type { SystemState } from 'features/system/store/systemSlice'; +import { isEqual, map } from 'lodash'; +import type { ChangeEvent, ReactNode } from 'react'; const modelListSelector = createSelector( systemSelector, (system: SystemState) => { - const models = _.map(system.model_list, (model, key) => { + const models = map(system.model_list, (model, key) => { return { name: key, ...model }; }); return models; }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/system/components/ModelManager/ModelListItem.tsx b/invokeai/frontend/src/features/system/components/ModelManager/ModelListItem.tsx index e0372bc865..398b61c634 100644 --- a/invokeai/frontend/src/features/system/components/ModelManager/ModelListItem.tsx +++ b/invokeai/frontend/src/features/system/components/ModelManager/ModelListItem.tsx @@ -1,4 +1,4 @@ -import { EditIcon, DeleteIcon } from '@chakra-ui/icons'; +import { DeleteIcon, EditIcon } from '@chakra-ui/icons'; import { Box, Button, Flex, Spacer, Text, Tooltip } from '@chakra-ui/react'; import { ModelStatus } from 'app/invokeai'; import { deleteModel, requestModelChange } from 'app/socketio/actions'; @@ -7,7 +7,6 @@ import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAIAlertDialog from 'common/components/IAIAlertDialog'; import IAIIconButton from 'common/components/IAIIconButton'; import { setOpenModel } from 'features/system/store/systemSlice'; -import React from 'react'; import { useTranslation } from 'react-i18next'; type ModelListItemProps = { diff --git a/invokeai/frontend/src/features/system/components/ModelManager/ModelManagerModal.tsx b/invokeai/frontend/src/features/system/components/ModelManager/ModelManagerModal.tsx index eedd72f88f..ed8ff243ed 100644 --- a/invokeai/frontend/src/features/system/components/ModelManager/ModelManagerModal.tsx +++ b/invokeai/frontend/src/features/system/components/ModelManager/ModelManagerModal.tsx @@ -7,17 +7,17 @@ import { ModalOverlay, useDisclosure, } from '@chakra-ui/react'; -import React, { cloneElement } from 'react'; +import { cloneElement } from 'react'; -import { useTranslation } from 'react-i18next'; -import { useAppSelector } from 'app/storeHooks'; import { RootState } from 'app/store'; +import { useAppSelector } from 'app/storeHooks'; +import { useTranslation } from 'react-i18next'; import type { ReactElement } from 'react'; -import ModelList from './ModelList'; -import DiffusersModelEdit from './DiffusersModelEdit'; import CheckpointModelEdit from './CheckpointModelEdit'; +import DiffusersModelEdit from './DiffusersModelEdit'; +import ModelList from './ModelList'; type ModelManagerModalProps = { children: ReactElement; diff --git a/invokeai/frontend/src/features/system/components/ModelManager/SearchModels.tsx b/invokeai/frontend/src/features/system/components/ModelManager/SearchModels.tsx index 407cd8902b..fd7da520bd 100644 --- a/invokeai/frontend/src/features/system/components/ModelManager/SearchModels.tsx +++ b/invokeai/frontend/src/features/system/components/ModelManager/SearchModels.tsx @@ -1,12 +1,12 @@ -import React from 'react'; -import IAICheckbox from 'common/components/IAICheckbox'; import IAIButton from 'common/components/IAIButton'; +import IAICheckbox from 'common/components/IAICheckbox'; import IAIIconButton from 'common/components/IAIIconButton'; +import React from 'react'; -import { createSelector } from '@reduxjs/toolkit'; -import { systemSelector } from 'features/system/store/systemSelectors'; import { Box, Flex, FormControl, HStack, Text, VStack } from '@chakra-ui/react'; +import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import { systemSelector } from 'features/system/store/systemSelectors'; import { useTranslation } from 'react-i18next'; import { FaPlus } from 'react-icons/fa'; @@ -19,13 +19,12 @@ import { } from 'features/system/store/systemSlice'; import { setShouldShowExistingModelsInSearch } from 'features/ui/store/uiSlice'; -import _ from 'lodash'; - -import type { RootState } from 'app/store'; -import type { ReactNode, ChangeEvent } from 'react'; import type { FoundModel } from 'app/invokeai'; +import type { RootState } from 'app/store'; import IAIInput from 'common/components/IAIInput'; import { Field, Formik } from 'formik'; +import { forEach, remove } from 'lodash'; +import type { ChangeEvent, ReactNode } from 'react'; import { BiReset } from 'react-icons/bi'; const existingModelsSelector = createSelector([systemSelector], (system) => { @@ -33,7 +32,7 @@ const existingModelsSelector = createSelector([systemSelector], (system) => { const existingModels: string[] = []; - _.forEach(model_list, (value) => { + forEach(model_list, (value) => { existingModels.push(value.weights); }); @@ -77,7 +76,7 @@ function SearchModelEntry({ if (!modelsToAdd.includes(e.target.value)) { setModelsToAdd([...modelsToAdd, e.target.value]); } else { - setModelsToAdd(_.remove(modelsToAdd, (v) => v !== e.target.value)); + setModelsToAdd(remove(modelsToAdd, (v) => v !== e.target.value)); } }; diff --git a/invokeai/frontend/src/features/system/components/ModelSelect.tsx b/invokeai/frontend/src/features/system/components/ModelSelect.tsx index 2cecac8506..01585687f7 100644 --- a/invokeai/frontend/src/features/system/components/ModelSelect.tsx +++ b/invokeai/frontend/src/features/system/components/ModelSelect.tsx @@ -3,7 +3,8 @@ import { createSelector } from '@reduxjs/toolkit'; import { requestModelChange } from 'app/socketio/actions'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAISelect from 'common/components/IAISelect'; -import _ from 'lodash'; +import { isEqual, map, reduce } from 'lodash'; + import { ChangeEvent } from 'react'; import { activeModelSelector, systemSelector } from '../store/systemSelectors'; @@ -11,12 +12,25 @@ const selector = createSelector( [systemSelector], (system) => { const { isProcessing, model_list } = system; - const models = _.map(model_list, (model, key) => key); - return { models, isProcessing }; + const models = map(model_list, (model, key) => key); + const activeModel = reduce( + model_list, + (acc, model, key) => { + if (model.status === 'active') { + acc = key; + } + + return acc; + }, + '' + ); + const activeDesc = model_list[activeModel].description; + + return { models, activeModel, isProcessing, activeDesc }; }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/system/components/ProgressBar.tsx b/invokeai/frontend/src/features/system/components/ProgressBar.tsx index a0f9258487..0f3d0860b3 100644 --- a/invokeai/frontend/src/features/system/components/ProgressBar.tsx +++ b/invokeai/frontend/src/features/system/components/ProgressBar.tsx @@ -1,8 +1,8 @@ import { Progress } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; -import { isEqual } from 'lodash'; import { useAppSelector } from 'app/storeHooks'; import { SystemState } from 'features/system/store/systemSlice'; +import { isEqual } from 'lodash'; import { systemSelector } from '../store/systemSelectors'; const progressBarSelector = createSelector( diff --git a/invokeai/frontend/src/features/system/components/SettingsModal/SettingsModal.tsx b/invokeai/frontend/src/features/system/components/SettingsModal/SettingsModal.tsx index 96de317e79..f49a720752 100644 --- a/invokeai/frontend/src/features/system/components/SettingsModal/SettingsModal.tsx +++ b/invokeai/frontend/src/features/system/components/SettingsModal/SettingsModal.tsx @@ -13,11 +13,13 @@ import { useDisclosure, } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; -import _, { isEqual } from 'lodash'; -import { ChangeEvent, cloneElement, ReactElement } from 'react'; +import { IN_PROGRESS_IMAGE_TYPES } from 'app/constants'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { persistor } from 'persistor'; +import IAINumberInput from 'common/components/IAINumberInput'; +import IAISelect from 'common/components/IAISelect'; +import IAISwitch from 'common/components/IAISwitch'; +import { systemSelector } from 'features/system/store/systemSelectors'; import { InProgressImageType, setEnableImageDebugging, @@ -26,13 +28,11 @@ import { setShouldDisplayGuides, setShouldDisplayInProgressType, } from 'features/system/store/systemSlice'; -import { IN_PROGRESS_IMAGE_TYPES } from 'app/constants'; -import IAISwitch from 'common/components/IAISwitch'; -import IAISelect from 'common/components/IAISelect'; -import IAINumberInput from 'common/components/IAINumberInput'; -import { systemSelector } from 'features/system/store/systemSelectors'; import { uiSelector } from 'features/ui/store/uiSelectors'; import { setShouldUseCanvasBetaLayout } from 'features/ui/store/uiSlice'; +import { isEqual, map } from 'lodash'; +import { persistor } from 'persistor'; +import { ChangeEvent, cloneElement, ReactElement } from 'react'; import { useTranslation } from 'react-i18next'; const selector = createSelector( @@ -53,7 +53,7 @@ const selector = createSelector( shouldDisplayInProgressType, shouldConfirmOnDelete, shouldDisplayGuides, - models: _.map(model_list, (_model, key) => key), + models: map(model_list, (_model, key) => key), saveIntermediatesInterval, enableImageDebugging, shouldUseCanvasBetaLayout, diff --git a/invokeai/frontend/src/features/system/components/SiteHeader.tsx b/invokeai/frontend/src/features/system/components/SiteHeader.tsx index f74adcabc9..1bc516e926 100644 --- a/invokeai/frontend/src/features/system/components/SiteHeader.tsx +++ b/invokeai/frontend/src/features/system/components/SiteHeader.tsx @@ -1,24 +1,24 @@ import { Flex, Link, Text } from '@chakra-ui/react'; -import { FaGithub, FaDiscord, FaBug, FaKeyboard, FaCube } from 'react-icons/fa'; +import { FaBug, FaCube, FaDiscord, FaGithub, FaKeyboard } from 'react-icons/fa'; import InvokeAILogo from 'assets/images/logo.png'; import IAIIconButton from 'common/components/IAIIconButton'; import HotkeysModal from './HotkeysModal/HotkeysModal'; +import ModelManagerModal from './ModelManager/ModelManagerModal'; +import ModelSelect from './ModelSelect'; import SettingsModal from './SettingsModal/SettingsModal'; import StatusIndicator from './StatusIndicator'; import ThemeChanger from './ThemeChanger'; -import ModelSelect from './ModelSelect'; -import ModelManagerModal from './ModelManager/ModelManagerModal'; import LanguagePicker from './LanguagePicker'; +import type { RootState } from 'app/store'; +import { useAppSelector } from 'app/storeHooks'; import { useTranslation } from 'react-i18next'; import { MdSettings } from 'react-icons/md'; -import { useAppSelector } from 'app/storeHooks'; -import type { RootState } from 'app/store'; /** * Header, includes color mode toggle, settings button, status message. diff --git a/invokeai/frontend/src/features/system/components/StatusIndicator.tsx b/invokeai/frontend/src/features/system/components/StatusIndicator.tsx index 4329b35d98..7a6c05b088 100644 --- a/invokeai/frontend/src/features/system/components/StatusIndicator.tsx +++ b/invokeai/frontend/src/features/system/components/StatusIndicator.tsx @@ -1,8 +1,8 @@ import { Text, Tooltip } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; -import { isEqual } from 'lodash'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { errorSeen, SystemState } from 'features/system/store/systemSlice'; +import { isEqual } from 'lodash'; import { useTranslation } from 'react-i18next'; import { systemSelector } from '../store/systemSelectors'; @@ -61,9 +61,9 @@ const StatusIndicator = () => { if (statusMessage) if (isProcessing) { if (totalIterations > 1) { - statusMessage = - t(statusMessage as keyof typeof t) + - ` (${currentIteration}/${totalIterations})`; + statusMessage = `${t( + statusMessage as keyof typeof t + )} (${currentIteration}/${totalIterations})`; } } diff --git a/invokeai/frontend/src/features/system/components/ThemeChanger.tsx b/invokeai/frontend/src/features/system/components/ThemeChanger.tsx index cd6323e668..8bf016be59 100644 --- a/invokeai/frontend/src/features/system/components/ThemeChanger.tsx +++ b/invokeai/frontend/src/features/system/components/ThemeChanger.tsx @@ -1,14 +1,14 @@ -import { useEffect } from 'react'; import { useColorMode, VStack } from '@chakra-ui/react'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { setCurrentTheme } from 'features/ui/store/uiSlice'; -import IAIPopover from 'common/components/IAIPopover'; -import IAIIconButton from 'common/components/IAIIconButton'; -import { FaCheck, FaPalette } from 'react-icons/fa'; import IAIButton from 'common/components/IAIButton'; -import { useTranslation } from 'react-i18next'; +import IAIIconButton from 'common/components/IAIIconButton'; +import IAIPopover from 'common/components/IAIPopover'; +import { setCurrentTheme } from 'features/ui/store/uiSlice'; import type { ReactNode } from 'react'; +import { useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; +import { FaCheck, FaPalette } from 'react-icons/fa'; export default function ThemeChanger() { const { t } = useTranslation(); diff --git a/invokeai/frontend/src/features/system/hooks/useToastWatcher.ts b/invokeai/frontend/src/features/system/hooks/useToastWatcher.ts index bb5dbeed97..62d9179ec2 100644 --- a/invokeai/frontend/src/features/system/hooks/useToastWatcher.ts +++ b/invokeai/frontend/src/features/system/hooks/useToastWatcher.ts @@ -1,8 +1,8 @@ import { useToast } from '@chakra-ui/react'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { useEffect } from 'react'; import { toastQueueSelector } from 'features/system/store/systemSelectors'; import { clearToastQueue } from 'features/system/store/systemSlice'; +import { useEffect } from 'react'; const useToastWatcher = () => { const dispatch = useAppDispatch(); diff --git a/invokeai/frontend/src/features/system/store/systemSlice.ts b/invokeai/frontend/src/features/system/store/systemSlice.ts index f5f5ade54d..7cb253f6ee 100644 --- a/invokeai/frontend/src/features/system/store/systemSlice.ts +++ b/invokeai/frontend/src/features/system/store/systemSlice.ts @@ -1,6 +1,6 @@ -import { createSlice } from '@reduxjs/toolkit'; -import type { PayloadAction } from '@reduxjs/toolkit'; import { ExpandedIndex, UseToastOptions } from '@chakra-ui/react'; +import type { PayloadAction } from '@reduxjs/toolkit'; +import { createSlice } from '@reduxjs/toolkit'; import * as InvokeAI from 'app/invokeai'; import i18n from 'i18n'; diff --git a/invokeai/frontend/src/features/ui/components/FloatingGalleryButton.tsx b/invokeai/frontend/src/features/ui/components/FloatingGalleryButton.tsx index fd0e366d46..44bd9db587 100644 --- a/invokeai/frontend/src/features/ui/components/FloatingGalleryButton.tsx +++ b/invokeai/frontend/src/features/ui/components/FloatingGalleryButton.tsx @@ -1,11 +1,11 @@ -import { MdPhotoLibrary } from 'react-icons/md'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAIIconButton from 'common/components/IAIIconButton'; -import { setShouldShowGallery } from 'features/gallery/store/gallerySlice'; import { setDoesCanvasNeedScaling } from 'features/canvas/store/canvasSlice'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { floatingSelector } from './FloatingParametersPanelButtons'; +import { setShouldShowGallery } from 'features/gallery/store/gallerySlice'; import { setShouldShowParametersPanel } from 'features/ui/store/uiSlice'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { MdPhotoLibrary } from 'react-icons/md'; +import { floatingSelector } from './FloatingParametersPanelButtons'; const FloatingGalleryButton = () => { const dispatch = useAppDispatch(); diff --git a/invokeai/frontend/src/features/ui/components/FloatingParametersPanelButtons.tsx b/invokeai/frontend/src/features/ui/components/FloatingParametersPanelButtons.tsx index acccc6e3b7..b2b74d6d29 100644 --- a/invokeai/frontend/src/features/ui/components/FloatingParametersPanelButtons.tsx +++ b/invokeai/frontend/src/features/ui/components/FloatingParametersPanelButtons.tsx @@ -1,22 +1,23 @@ import { createSelector } from '@reduxjs/toolkit'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAIIconButton from 'common/components/IAIIconButton'; -import { setShouldShowParametersPanel } from 'features/ui/store/uiSlice'; -import CancelButton from 'features/parameters/components/ProcessButtons/CancelButton'; -import InvokeButton from 'features/parameters/components/ProcessButtons/InvokeButton'; -import _ from 'lodash'; import { setDoesCanvasNeedScaling } from 'features/canvas/store/canvasSlice'; -import { FaSlidersH } from 'react-icons/fa'; -import { - activeTabNameSelector, - uiSelector, -} from 'features/ui/store/uiSelectors'; -import { useHotkeys } from 'react-hotkeys-hook'; +import { gallerySelector } from 'features/gallery/store/gallerySelectors'; import { GalleryState, setShouldShowGallery, } from 'features/gallery/store/gallerySlice'; -import { gallerySelector } from 'features/gallery/store/gallerySelectors'; +import CancelButton from 'features/parameters/components/ProcessButtons/CancelButton'; +import InvokeButton from 'features/parameters/components/ProcessButtons/InvokeButton'; +import { + activeTabNameSelector, + uiSelector, +} from 'features/ui/store/uiSelectors'; +import { setShouldShowParametersPanel } from 'features/ui/store/uiSlice'; +import { isEqual } from 'lodash'; + +import { useHotkeys } from 'react-hotkeys-hook'; +import { FaSlidersH } from 'react-icons/fa'; export const floatingSelector = createSelector( [gallerySelector, uiSelector, activeTabNameSelector], @@ -60,7 +61,7 @@ export const floatingSelector = createSelector( shouldShowGalleryButton, }; }, - { memoizeOptions: { resultEqualityCheck: _.isEqual } } + { memoizeOptions: { resultEqualityCheck: isEqual } } ); const FloatingParametersPanelButtons = () => { diff --git a/invokeai/frontend/src/features/ui/components/ImageToImage/InitialImageOverlay.tsx b/invokeai/frontend/src/features/ui/components/ImageToImage/InitialImageOverlay.tsx index 8530401a92..dafcac0fa9 100644 --- a/invokeai/frontend/src/features/ui/components/ImageToImage/InitialImageOverlay.tsx +++ b/invokeai/frontend/src/features/ui/components/ImageToImage/InitialImageOverlay.tsx @@ -1,5 +1,4 @@ import { Image } from '@chakra-ui/react'; -import React from 'react'; import { RootState } from 'app/store'; import { useAppSelector } from 'app/storeHooks'; diff --git a/invokeai/frontend/src/features/ui/components/ImageToImage/index.tsx b/invokeai/frontend/src/features/ui/components/ImageToImage/index.tsx index 1544edb966..e1c38ad75f 100644 --- a/invokeai/frontend/src/features/ui/components/ImageToImage/index.tsx +++ b/invokeai/frontend/src/features/ui/components/ImageToImage/index.tsx @@ -1,7 +1,6 @@ -import React from 'react'; -import ImageToImagePanel from './ImageToImagePanel'; -import ImageToImageDisplay from './ImageToImageDisplay'; import InvokeWorkarea from 'features/ui/components/InvokeWorkarea'; +import ImageToImageDisplay from './ImageToImageDisplay'; +import ImageToImagePanel from './ImageToImagePanel'; export default function ImageToImageWorkarea() { return ( diff --git a/invokeai/frontend/src/features/ui/components/InvokeParametersPanel.tsx b/invokeai/frontend/src/features/ui/components/InvokeParametersPanel.tsx index c84c1e1472..8dcd4f4a78 100644 --- a/invokeai/frontend/src/features/ui/components/InvokeParametersPanel.tsx +++ b/invokeai/frontend/src/features/ui/components/InvokeParametersPanel.tsx @@ -1,10 +1,5 @@ import { Tooltip } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; -import _ from 'lodash'; -import React, { ReactNode, useCallback, useEffect, useRef } from 'react'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { BsPinAngle, BsPinAngleFill } from 'react-icons/bs'; -import { CSSTransition } from 'react-transition-group'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import { setShouldHoldParametersPanelOpen, @@ -12,10 +7,16 @@ import { setShouldShowParametersPanel, } from 'features/ui/store/uiSlice'; -import { setParametersPanelScrollPosition } from 'features/ui/store/uiSlice'; +import React, { ReactNode, useCallback, useEffect, useRef } from 'react'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { BsPinAngle, BsPinAngleFill } from 'react-icons/bs'; +import { CSSTransition } from 'react-transition-group'; + import { setDoesCanvasNeedScaling } from 'features/canvas/store/canvasSlice'; +import { setParametersPanelScrollPosition } from 'features/ui/store/uiSlice'; import InvokeAILogo from 'assets/images/logo.png'; +import { isEqual } from 'lodash'; import { uiSelector } from '../store/uiSelectors'; type Props = { children: ReactNode }; @@ -39,7 +40,7 @@ const optionsPanelSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/ui/components/InvokeTabs.tsx b/invokeai/frontend/src/features/ui/components/InvokeTabs.tsx index 0e77b00e81..c3a8c3d907 100644 --- a/invokeai/frontend/src/features/ui/components/InvokeTabs.tsx +++ b/invokeai/frontend/src/features/ui/components/InvokeTabs.tsx @@ -1,28 +1,27 @@ import { Tab, TabPanel, TabPanels, Tabs, Tooltip } from '@chakra-ui/react'; -import _ from 'lodash'; -import React, { ReactElement } from 'react'; -import { useHotkeys } from 'react-hotkeys-hook'; import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import NodesWIP from 'common/components/WorkInProgress/NodesWIP'; import { PostProcessingWIP } from 'common/components/WorkInProgress/PostProcessingWIP'; +import TrainingWIP from 'common/components/WorkInProgress/Training'; +import useUpdateTranslations from 'common/hooks/useUpdateTranslations'; import ImageToImageIcon from 'common/icons/ImageToImageIcon'; import NodesIcon from 'common/icons/NodesIcon'; import PostprocessingIcon from 'common/icons/PostprocessingIcon'; import TextToImageIcon from 'common/icons/TextToImageIcon'; +import TrainingIcon from 'common/icons/TrainingIcon'; +import UnifiedCanvasIcon from 'common/icons/UnifiedCanvasIcon'; +import Lightbox from 'features/lightbox/components/Lightbox'; import { setIsLightboxOpen } from 'features/lightbox/store/lightboxSlice'; +import { InvokeTabName } from 'features/ui/store/tabMap'; import { setActiveTab } from 'features/ui/store/uiSlice'; +import i18n from 'i18n'; +import { ReactElement } from 'react'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { activeTabIndexSelector } from '../store/uiSelectors'; import ImageToImageWorkarea from './ImageToImage'; import TextToImageWorkarea from './TextToImage'; -import Lightbox from 'features/lightbox/components/Lightbox'; import UnifiedCanvasWorkarea from './UnifiedCanvas/UnifiedCanvasWorkarea'; -import UnifiedCanvasIcon from 'common/icons/UnifiedCanvasIcon'; -import TrainingWIP from 'common/components/WorkInProgress/Training'; -import TrainingIcon from 'common/icons/TrainingIcon'; -import { InvokeTabName } from 'features/ui/store/tabMap'; -import i18n from 'i18n'; -import useUpdateTranslations from 'common/hooks/useUpdateTranslations'; -import { activeTabIndexSelector } from '../store/uiSelectors'; export interface InvokeTabInfo { title: ReactElement; diff --git a/invokeai/frontend/src/features/ui/components/InvokeWorkarea.tsx b/invokeai/frontend/src/features/ui/components/InvokeWorkarea.tsx index 8a83bee986..d3aca2dae9 100644 --- a/invokeai/frontend/src/features/ui/components/InvokeWorkarea.tsx +++ b/invokeai/frontend/src/features/ui/components/InvokeWorkarea.tsx @@ -1,23 +1,23 @@ import { Tooltip } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; -import { DragEvent, ReactNode } from 'react'; -import { VscSplitHorizontal } from 'react-icons/vsc'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import ImageGallery from 'features/gallery/components/ImageGallery'; +import { setInitialImage } from 'features/parameters/store/generationSlice'; import { activeTabNameSelector, uiSelector, } from 'features/ui/store/uiSelectors'; -import { setInitialImage } from 'features/parameters/store/generationSlice'; +import { DragEvent, ReactNode } from 'react'; +import { VscSplitHorizontal } from 'react-icons/vsc'; -import { setShouldShowDualDisplay } from 'features/ui/store/uiSlice'; import { setDoesCanvasNeedScaling, setInitialCanvasImage, } from 'features/canvas/store/canvasSlice'; -import _ from 'lodash'; import useGetImageByUuid from 'features/gallery/hooks/useGetImageByUuid'; import { lightboxSelector } from 'features/lightbox/store/lightboxSelectors'; +import { setShouldShowDualDisplay } from 'features/ui/store/uiSlice'; +import { isEqual } from 'lodash'; const workareaSelector = createSelector( [uiSelector, lightboxSelector, activeTabNameSelector], @@ -34,7 +34,7 @@ const workareaSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/ui/components/TextToImage/index.tsx b/invokeai/frontend/src/features/ui/components/TextToImage/index.tsx index 0ac9761a4c..fccd862160 100644 --- a/invokeai/frontend/src/features/ui/components/TextToImage/index.tsx +++ b/invokeai/frontend/src/features/ui/components/TextToImage/index.tsx @@ -1,6 +1,6 @@ -import TextToImagePanel from './TextToImagePanel'; import InvokeWorkarea from 'features/ui/components/InvokeWorkarea'; import TextToImageDisplay from './TextToImageDisplay'; +import TextToImagePanel from './TextToImagePanel'; export default function TextToImageWorkarea() { return ( diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasDisplayBeta.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasDisplayBeta.tsx index b0c640b762..561f746590 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasDisplayBeta.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasDisplayBeta.tsx @@ -1,13 +1,14 @@ import { createSelector } from '@reduxjs/toolkit'; // import IAICanvas from 'features/canvas/components/IAICanvas'; -import IAICanvasResizer from 'features/canvas/components/IAICanvasResizer'; -import _ from 'lodash'; -import { useLayoutEffect } from 'react'; -import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { setDoesCanvasNeedScaling } from 'features/canvas/store/canvasSlice'; -import IAICanvas from 'features/canvas/components/IAICanvas'; -import { canvasSelector } from 'features/canvas/store/canvasSelectors'; import { Flex } from '@chakra-ui/react'; +import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import IAICanvas from 'features/canvas/components/IAICanvas'; +import IAICanvasResizer from 'features/canvas/components/IAICanvasResizer'; +import { canvasSelector } from 'features/canvas/store/canvasSelectors'; +import { setDoesCanvasNeedScaling } from 'features/canvas/store/canvasSlice'; + +import { debounce, isEqual } from 'lodash'; +import { useLayoutEffect } from 'react'; import UnifiedCanvasToolbarBeta from './UnifiedCanvasToolbarBeta'; import UnifiedCanvasToolSettingsBeta from './UnifiedCanvasToolSettingsBeta'; @@ -21,7 +22,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); @@ -34,7 +35,7 @@ const UnifiedCanvasDisplayBeta = () => { useLayoutEffect(() => { dispatch(setDoesCanvasNeedScaling(true)); - const resizeCallback = _.debounce(() => { + const resizeCallback = debounce(() => { dispatch(setDoesCanvasNeedScaling(true)); }, 250); diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBaseBrushSettings.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBaseBrushSettings.tsx index b9b9371697..cb185e36bb 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBaseBrushSettings.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBaseBrushSettings.tsx @@ -1,5 +1,4 @@ import { Flex } from '@chakra-ui/react'; -import React from 'react'; import UnifiedCanvasBrushSettings from './UnifiedCanvasBrushSettings'; import UnifiedCanvasLimitStrokesToBox from './UnifiedCanvasLimitStrokesToBox'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBrushSettings.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBrushSettings.tsx index a26c8c3fdc..40f6df1dbf 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBrushSettings.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBrushSettings.tsx @@ -1,5 +1,4 @@ import { Flex } from '@chakra-ui/react'; -import React from 'react'; import UnifiedCanvasBrushSize from './UnifiedCanvasBrushSize'; import UnifiedCanvasColorPicker from './UnifiedCanvasColorPicker'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBrushSize.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBrushSize.tsx index 13bfb4a9ed..e36e59892c 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBrushSize.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasBrushSize.tsx @@ -3,7 +3,6 @@ import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAISlider from 'common/components/IAISlider'; import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; import { setBrushSize } from 'features/canvas/store/canvasSlice'; -import React from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasClearMask.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasClearMask.tsx index 3e806aae2d..98493bd522 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasClearMask.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasClearMask.tsx @@ -2,7 +2,6 @@ import { useAppDispatch } from 'app/storeHooks'; import IAIButton from 'common/components/IAIButton'; import { clearMask } from 'features/canvas/store/canvasSlice'; -import React from 'react'; import { useTranslation } from 'react-i18next'; import { FaTrash } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasColorPicker.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasColorPicker.tsx index 1fd9b2121d..94dfb7b8ac 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasColorPicker.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasColorPicker.tsx @@ -8,8 +8,8 @@ import { isStagingSelector, } from 'features/canvas/store/canvasSelectors'; import { setBrushColor, setMaskColor } from 'features/canvas/store/canvasSlice'; -import React from 'react'; -import _ from 'lodash'; +import { clamp, isEqual } from 'lodash'; + import { useHotkeys } from 'react-hotkeys-hook'; const selector = createSelector( @@ -25,7 +25,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); @@ -47,7 +47,7 @@ export default function UnifiedCanvasColorPicker() { dispatch( setBrushColor({ ...brushColor, - a: _.clamp(brushColor.a - 0.05, 0.05, 1), + a: clamp(brushColor.a - 0.05, 0.05, 1), }) ); }, @@ -64,7 +64,7 @@ export default function UnifiedCanvasColorPicker() { dispatch( setBrushColor({ ...brushColor, - a: _.clamp(brushColor.a + 0.05, 0.05, 1), + a: clamp(brushColor.a + 0.05, 0.05, 1), }) ); }, diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasDarkenOutsideSelection.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasDarkenOutsideSelection.tsx index cb3dfc1c66..9552d4a859 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasDarkenOutsideSelection.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasDarkenOutsideSelection.tsx @@ -2,7 +2,6 @@ import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAICheckbox from 'common/components/IAICheckbox'; import { setShouldDarkenOutsideBoundingBox } from 'features/canvas/store/canvasSlice'; -import React from 'react'; import { useTranslation } from 'react-i18next'; export default function UnifiedCanvasDarkenOutsideSelection() { diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasEnableMask.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasEnableMask.tsx index 890eaf2881..3c358b47b3 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasEnableMask.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasEnableMask.tsx @@ -2,7 +2,6 @@ import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAICheckbox from 'common/components/IAICheckbox'; import { setIsMaskEnabled } from 'features/canvas/store/canvasSlice'; -import React from 'react'; import { useTranslation } from 'react-i18next'; export default function UnifiedCanvasEnableMask() { diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasLimitStrokesToBox.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasLimitStrokesToBox.tsx index b65f713243..583f16bd26 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasLimitStrokesToBox.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasLimitStrokesToBox.tsx @@ -2,7 +2,6 @@ import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAICheckbox from 'common/components/IAICheckbox'; import { setShouldRestrictStrokesToBox } from 'features/canvas/store/canvasSlice'; -import React from 'react'; import { useTranslation } from 'react-i18next'; export default function UnifiedCanvasLimitStrokesToBox() { diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasMaskBrushSettings.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasMaskBrushSettings.tsx index 897ba2ec7a..fd1461fea0 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasMaskBrushSettings.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasMaskBrushSettings.tsx @@ -1,5 +1,4 @@ import { Flex } from '@chakra-ui/react'; -import React from 'react'; import UnifiedCanvasBrushSettings from './UnifiedCanvasBrushSettings'; import UnifiedCanvasClearMask from './UnifiedCanvasClearMask'; import UnifiedCanvasEnableMask from './UnifiedCanvasEnableMask'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasMoveSettings.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasMoveSettings.tsx index e9fa40d304..9f3052b116 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasMoveSettings.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasMoveSettings.tsx @@ -1,5 +1,4 @@ import { Flex } from '@chakra-ui/layout'; -import React from 'react'; import UnifiedCanvasDarkenOutsideSelection from './UnifiedCanvasDarkenOutsideSelection'; import UnifiedCanvasShowGrid from './UnifiedCanvasShowGrid'; import UnifiedCanvasSnapToGrid from './UnifiedCanvasSnapToGrid'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasPreserveMask.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasPreserveMask.tsx index b1f7327075..e2c83dc643 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasPreserveMask.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasPreserveMask.tsx @@ -2,7 +2,6 @@ import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAICheckbox from 'common/components/IAICheckbox'; import { setShouldPreserveMaskedArea } from 'features/canvas/store/canvasSlice'; -import React from 'react'; import { useTranslation } from 'react-i18next'; export default function UnifiedCanvasPreserveMask() { diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasSettings.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasSettings.tsx index 32b7dcbe3f..1f8c45fef2 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasSettings.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasSettings.tsx @@ -1,21 +1,22 @@ import { Flex } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; +import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import IAICheckbox from 'common/components/IAICheckbox'; +import IAIIconButton from 'common/components/IAIIconButton'; +import IAIPopover from 'common/components/IAIPopover'; +import { canvasSelector } from 'features/canvas/store/canvasSelectors'; import { setShouldAutoSave, setShouldCropToBoundingBoxOnSave, setShouldShowCanvasDebugInfo, setShouldShowIntermediates, } from 'features/canvas/store/canvasSlice'; -import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import _ from 'lodash'; -import IAIIconButton from 'common/components/IAIIconButton'; -import { FaWrench } from 'react-icons/fa'; -import IAIPopover from 'common/components/IAIPopover'; -import IAICheckbox from 'common/components/IAICheckbox'; -import { canvasSelector } from 'features/canvas/store/canvasSelectors'; import EmptyTempFolderButtonModal from 'features/system/components/ClearTempFolderButtonModal'; +import { FaWrench } from 'react-icons/fa'; + import ClearCanvasHistoryButtonModal from 'features/canvas/components/ClearCanvasHistoryButtonModal'; +import { isEqual } from 'lodash'; import { useTranslation } from 'react-i18next'; export const canvasControlsSelector = createSelector( @@ -37,7 +38,7 @@ export const canvasControlsSelector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasShowGrid.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasShowGrid.tsx index bd2da2a122..fd34b243ca 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasShowGrid.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasShowGrid.tsx @@ -2,7 +2,6 @@ import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAICheckbox from 'common/components/IAICheckbox'; import { setShouldShowGrid } from 'features/canvas/store/canvasSlice'; -import React from 'react'; import { useTranslation } from 'react-i18next'; export default function UnifiedCanvasShowGrid() { diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasSnapToGrid.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasSnapToGrid.tsx index 71af0ad01b..93eaca19d6 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasSnapToGrid.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettings/UnifiedCanvasSnapToGrid.tsx @@ -2,7 +2,7 @@ import { RootState } from 'app/store'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAICheckbox from 'common/components/IAICheckbox'; import { setShouldSnapToGrid } from 'features/canvas/store/canvasSlice'; -import React, { ChangeEvent } from 'react'; +import { ChangeEvent } from 'react'; import { useTranslation } from 'react-i18next'; export default function UnifiedCanvasSnapToGrid() { diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettingsBeta.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettingsBeta.tsx index f979c418c9..61033e247f 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettingsBeta.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolSettingsBeta.tsx @@ -1,12 +1,11 @@ import { createSelector } from '@reduxjs/toolkit'; import { useAppSelector } from 'app/storeHooks'; import { canvasSelector } from 'features/canvas/store/canvasSelectors'; -import React from 'react'; -import _ from 'lodash'; +import { Flex } from '@chakra-ui/react'; +import { isEqual } from 'lodash'; import UnifiedCanvasBaseBrushSettings from './UnifiedCanvasToolSettings/UnifiedCanvasBaseBrushSettings'; import UnifiedCanvasMaskBrushSettings from './UnifiedCanvasToolSettings/UnifiedCanvasMaskBrushSettings'; -import { Flex } from '@chakra-ui/react'; import UnifiedCanvasMoveSettings from './UnifiedCanvasToolSettings/UnifiedCanvasMoveSettings'; const selector = createSelector( @@ -20,7 +19,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasCopyToClipboard.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasCopyToClipboard.tsx index 60102b8c43..9c58d6c9fb 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasCopyToClipboard.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasCopyToClipboard.tsx @@ -4,7 +4,6 @@ import IAIIconButton from 'common/components/IAIIconButton'; import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; import { mergeAndUploadCanvas } from 'features/canvas/store/thunks/mergeAndUploadCanvas'; import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; -import React from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; import { FaCopy } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasDownloadImage.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasDownloadImage.tsx index e05991d4cd..6e2e0ee498 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasDownloadImage.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasDownloadImage.tsx @@ -4,7 +4,6 @@ import IAIIconButton from 'common/components/IAIIconButton'; import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; import { mergeAndUploadCanvas } from 'features/canvas/store/thunks/mergeAndUploadCanvas'; import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; -import React from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; import { FaDownload } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasFileUploader.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasFileUploader.tsx index d8256e50da..4dfa736727 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasFileUploader.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasFileUploader.tsx @@ -2,7 +2,6 @@ import { useAppSelector } from 'app/storeHooks'; import IAIIconButton from 'common/components/IAIIconButton'; import useImageUploader from 'common/hooks/useImageUploader'; import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; -import React from 'react'; import { useTranslation } from 'react-i18next'; import { FaUpload } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasLayerSelect.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasLayerSelect.tsx index 0eb36918f7..767a1bf38f 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasLayerSelect.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasLayerSelect.tsx @@ -6,12 +6,13 @@ import { isStagingSelector, } from 'features/canvas/store/canvasSelectors'; import { setIsMaskEnabled, setLayer } from 'features/canvas/store/canvasSlice'; -import React, { ChangeEvent } from 'react'; -import _ from 'lodash'; import { CanvasLayer, LAYER_NAMES_DICT, } from 'features/canvas/store/canvasTypes'; +import { isEqual } from 'lodash'; + +import { ChangeEvent } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; @@ -23,7 +24,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasMergeVisible.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasMergeVisible.tsx index 4ed91a0e4c..9135cc3320 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasMergeVisible.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasMergeVisible.tsx @@ -4,7 +4,6 @@ import IAIIconButton from 'common/components/IAIIconButton'; import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; import { mergeAndUploadCanvas } from 'features/canvas/store/thunks/mergeAndUploadCanvas'; import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; -import React from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; import { FaLayerGroup } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasMoveTool.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasMoveTool.tsx index 619d24031d..e032df3c28 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasMoveTool.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasMoveTool.tsx @@ -3,7 +3,6 @@ import { useAppDispatch, useAppSelector } from 'app/storeHooks'; import IAIIconButton from 'common/components/IAIIconButton'; import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; import { setTool } from 'features/canvas/store/canvasSlice'; -import React from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; import { FaArrowsAlt } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasProcessingButtons.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasProcessingButtons.tsx index 7cac89510c..3f81451352 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasProcessingButtons.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasProcessingButtons.tsx @@ -6,7 +6,6 @@ import { setDoesCanvasNeedScaling } from 'features/canvas/store/canvasSlice'; import CancelButton from 'features/parameters/components/ProcessButtons/CancelButton'; import InvokeButton from 'features/parameters/components/ProcessButtons/InvokeButton'; import { setShouldShowParametersPanel } from 'features/ui/store/uiSlice'; -import React from 'react'; import { useTranslation } from 'react-i18next'; import { FaSlidersH } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasResetCanvas.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasResetCanvas.tsx index 3776d89e34..91052a9d06 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasResetCanvas.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasResetCanvas.tsx @@ -5,7 +5,6 @@ import { resetCanvas, resizeAndScaleCanvas, } from 'features/canvas/store/canvasSlice'; -import React from 'react'; import { useTranslation } from 'react-i18next'; import { FaTrash } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasResetView.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasResetView.tsx index 54a6c320a2..3e3655034b 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasResetView.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasResetView.tsx @@ -3,7 +3,6 @@ import IAIIconButton from 'common/components/IAIIconButton'; import { useSingleAndDoubleClick } from 'common/hooks/useSingleAndDoubleClick'; import { resetCanvasView } from 'features/canvas/store/canvasSlice'; import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; -import React from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; import { FaCrosshairs } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasSaveToGallery.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasSaveToGallery.tsx index 4657681f3d..07557102cf 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasSaveToGallery.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasSaveToGallery.tsx @@ -4,7 +4,6 @@ import IAIIconButton from 'common/components/IAIIconButton'; import { isStagingSelector } from 'features/canvas/store/canvasSelectors'; import { mergeAndUploadCanvas } from 'features/canvas/store/thunks/mergeAndUploadCanvas'; import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; -import React from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { useTranslation } from 'react-i18next'; import { FaSave } from 'react-icons/fa'; diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasToolSelect.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasToolSelect.tsx index 61b3cdbfd6..9602150d43 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasToolSelect.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbar/UnifiedCanvasToolSelect.tsx @@ -1,13 +1,21 @@ import { ButtonGroup, Flex } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; +import { useAppDispatch, useAppSelector } from 'app/storeHooks'; +import IAIIconButton from 'common/components/IAIIconButton'; +import { + canvasSelector, + isStagingSelector, +} from 'features/canvas/store/canvasSelectors'; import { addEraseRect, addFillRect, setTool, } from 'features/canvas/store/canvasSlice'; -import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import _ from 'lodash'; -import IAIIconButton from 'common/components/IAIIconButton'; +import { systemSelector } from 'features/system/store/systemSelectors'; +import { isEqual } from 'lodash'; + +import { useHotkeys } from 'react-hotkeys-hook'; +import { useTranslation } from 'react-i18next'; import { FaEraser, FaEyeDropper, @@ -15,13 +23,6 @@ import { FaPaintBrush, FaPlus, } from 'react-icons/fa'; -import { - canvasSelector, - isStagingSelector, -} from 'features/canvas/store/canvasSelectors'; -import { systemSelector } from 'features/system/store/systemSelectors'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { useTranslation } from 'react-i18next'; export const selector = createSelector( [canvasSelector, isStagingSelector, systemSelector], @@ -37,7 +38,7 @@ export const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbarBeta.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbarBeta.tsx index f50d52243a..b3328529fb 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbarBeta.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasBeta/UnifiedCanvasToolbarBeta.tsx @@ -1,21 +1,21 @@ import { Flex } from '@chakra-ui/react'; -import IAICanvasUndoButton from 'features/canvas/components/IAICanvasToolbar/IAICanvasUndoButton'; +import { RootState } from 'app/store'; +import { useAppSelector } from 'app/storeHooks'; import IAICanvasRedoButton from 'features/canvas/components/IAICanvasToolbar/IAICanvasRedoButton'; -import UnifiedCanvasLayerSelect from './UnifiedCanvasToolbar/UnifiedCanvasLayerSelect'; -import UnifiedCanvasToolSelect from './UnifiedCanvasToolbar/UnifiedCanvasToolSelect'; -import UnifiedCanvasSettings from './UnifiedCanvasToolSettings/UnifiedCanvasSettings'; -import UnifiedCanvasMoveTool from './UnifiedCanvasToolbar/UnifiedCanvasMoveTool'; -import UnifiedCanvasResetView from './UnifiedCanvasToolbar/UnifiedCanvasResetView'; -import UnifiedCanvasMergeVisible from './UnifiedCanvasToolbar/UnifiedCanvasMergeVisible'; -import UnifiedCanvasSaveToGallery from './UnifiedCanvasToolbar/UnifiedCanvasSaveToGallery'; +import IAICanvasUndoButton from 'features/canvas/components/IAICanvasToolbar/IAICanvasUndoButton'; import UnifiedCanvasCopyToClipboard from './UnifiedCanvasToolbar/UnifiedCanvasCopyToClipboard'; import UnifiedCanvasDownloadImage from './UnifiedCanvasToolbar/UnifiedCanvasDownloadImage'; import UnifiedCanvasFileUploader from './UnifiedCanvasToolbar/UnifiedCanvasFileUploader'; -import UnifiedCanvasResetCanvas from './UnifiedCanvasToolbar/UnifiedCanvasResetCanvas'; +import UnifiedCanvasLayerSelect from './UnifiedCanvasToolbar/UnifiedCanvasLayerSelect'; +import UnifiedCanvasMergeVisible from './UnifiedCanvasToolbar/UnifiedCanvasMergeVisible'; +import UnifiedCanvasMoveTool from './UnifiedCanvasToolbar/UnifiedCanvasMoveTool'; import UnifiedCanvasProcessingButtons from './UnifiedCanvasToolbar/UnifiedCanvasProcessingButtons'; -import { RootState } from 'app/store'; -import { useAppSelector } from 'app/storeHooks'; +import UnifiedCanvasResetCanvas from './UnifiedCanvasToolbar/UnifiedCanvasResetCanvas'; +import UnifiedCanvasResetView from './UnifiedCanvasToolbar/UnifiedCanvasResetView'; +import UnifiedCanvasSaveToGallery from './UnifiedCanvasToolbar/UnifiedCanvasSaveToGallery'; +import UnifiedCanvasToolSelect from './UnifiedCanvasToolbar/UnifiedCanvasToolSelect'; +import UnifiedCanvasSettings from './UnifiedCanvasToolSettings/UnifiedCanvasSettings'; const UnifiedCanvasToolbarBeta = () => { const shouldShowParametersPanel = useAppSelector( diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasDisplay.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasDisplay.tsx index 01ae2bfbb9..12fc1d786f 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasDisplay.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasDisplay.tsx @@ -1,13 +1,14 @@ import { createSelector } from '@reduxjs/toolkit'; // import IAICanvas from 'features/canvas/components/IAICanvas'; -import IAICanvasResizer from 'features/canvas/components/IAICanvasResizer'; -import _ from 'lodash'; -import { useLayoutEffect } from 'react'; import { useAppDispatch, useAppSelector } from 'app/storeHooks'; -import { setDoesCanvasNeedScaling } from 'features/canvas/store/canvasSlice'; import IAICanvas from 'features/canvas/components/IAICanvas'; +import IAICanvasResizer from 'features/canvas/components/IAICanvasResizer'; import IAICanvasOutpaintingControls from 'features/canvas/components/IAICanvasToolbar/IAICanvasToolbar'; import { canvasSelector } from 'features/canvas/store/canvasSelectors'; +import { setDoesCanvasNeedScaling } from 'features/canvas/store/canvasSlice'; +import { debounce, isEqual } from 'lodash'; + +import { useLayoutEffect } from 'react'; const selector = createSelector( [canvasSelector], @@ -19,7 +20,7 @@ const selector = createSelector( }, { memoizeOptions: { - resultEqualityCheck: _.isEqual, + resultEqualityCheck: isEqual, }, } ); @@ -32,7 +33,7 @@ const UnifiedCanvasDisplay = () => { useLayoutEffect(() => { dispatch(setDoesCanvasNeedScaling(true)); - const resizeCallback = _.debounce(() => { + const resizeCallback = debounce(() => { dispatch(setDoesCanvasNeedScaling(true)); }, 250); diff --git a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasWorkarea.tsx b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasWorkarea.tsx index cd20a716cf..49db741541 100644 --- a/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasWorkarea.tsx +++ b/invokeai/frontend/src/features/ui/components/UnifiedCanvas/UnifiedCanvasWorkarea.tsx @@ -1,9 +1,9 @@ -import UnifiedCanvasPanel from './UnifiedCanvasPanel'; -import UnifiedCanvasDisplay from './UnifiedCanvasDisplay'; -import InvokeWorkarea from 'features/ui/components/InvokeWorkarea'; import { RootState } from 'app/store'; import { useAppSelector } from 'app/storeHooks'; +import InvokeWorkarea from 'features/ui/components/InvokeWorkarea'; import UnifiedCanvasDisplayBeta from './UnifiedCanvasBeta/UnifiedCanvasDisplayBeta'; +import UnifiedCanvasDisplay from './UnifiedCanvasDisplay'; +import UnifiedCanvasPanel from './UnifiedCanvasPanel'; export default function UnifiedCanvasWorkarea() { const shouldUseCanvasBetaLayout = useAppSelector( diff --git a/invokeai/frontend/src/features/ui/store/tabMap.ts b/invokeai/frontend/src/features/ui/store/tabMap.ts index 74d63d2df0..13a93f7f70 100644 --- a/invokeai/frontend/src/features/ui/store/tabMap.ts +++ b/invokeai/frontend/src/features/ui/store/tabMap.ts @@ -7,4 +7,4 @@ export const tabMap = [ 'training', ] as const; -export type InvokeTabName = typeof tabMap[number]; +export type InvokeTabName = (typeof tabMap)[number]; diff --git a/invokeai/frontend/src/features/ui/store/uiSelectors.ts b/invokeai/frontend/src/features/ui/store/uiSelectors.ts index 77b7902a4a..d474bf6f27 100644 --- a/invokeai/frontend/src/features/ui/store/uiSelectors.ts +++ b/invokeai/frontend/src/features/ui/store/uiSelectors.ts @@ -1,6 +1,7 @@ import { createSelector } from '@reduxjs/toolkit'; import { RootState } from 'app/store'; -import _ from 'lodash'; +import { isEqual } from 'lodash'; + import { tabMap } from './tabMap'; import { UIState } from './uiTypes'; @@ -9,7 +10,7 @@ export const activeTabNameSelector = createSelector( (ui: UIState) => tabMap[ui.activeTab], { memoizeOptions: { - equalityCheck: _.isEqual, + equalityCheck: isEqual, }, } ); @@ -19,7 +20,7 @@ export const activeTabIndexSelector = createSelector( (ui: UIState) => ui.activeTab, { memoizeOptions: { - equalityCheck: _.isEqual, + equalityCheck: isEqual, }, } ); @@ -29,7 +30,7 @@ export const uiSelector = createSelector( (ui) => ui, { memoizeOptions: { - equalityCheck: _.isEqual, + equalityCheck: isEqual, }, } ); diff --git a/invokeai/frontend/src/features/ui/store/uiSlice.ts b/invokeai/frontend/src/features/ui/store/uiSlice.ts index 1c9364ad0e..5f051973bf 100644 --- a/invokeai/frontend/src/features/ui/store/uiSlice.ts +++ b/invokeai/frontend/src/features/ui/store/uiSlice.ts @@ -1,5 +1,5 @@ -import { createSlice } from '@reduxjs/toolkit'; import type { PayloadAction } from '@reduxjs/toolkit'; +import { createSlice } from '@reduxjs/toolkit'; import { InvokeTabName, tabMap } from './tabMap'; import { AddNewModelType, UIState } from './uiTypes'; diff --git a/invokeai/frontend/src/i18.d.ts b/invokeai/frontend/src/i18.d.ts index dc20ce3886..edcf71a015 100644 --- a/invokeai/frontend/src/i18.d.ts +++ b/invokeai/frontend/src/i18.d.ts @@ -2,14 +2,14 @@ import 'i18next'; // Import All Namespaces (for the default language only) import common from '../public/locales/common/en.json'; -import unifiedcanvas from '../public/locales/unifiedcanvas/en.json'; -import parameters from '../public/locales/parameters/en.json'; import gallery from '../public/locales/gallery/en.json'; -import toast from '../public/locales/toast/en.json'; import hotkeys from '../public/locales/hotkeys/en.json'; -import settings from '../public/locales/settings/en.json'; -import tooltip from '../public/locales/tooltip/en.json'; import modelmanager from '../public/locales/modelmanager/en.json'; +import parameters from '../public/locales/parameters/en.json'; +import settings from '../public/locales/settings/en.json'; +import toast from '../public/locales/toast/en.json'; +import tooltip from '../public/locales/tooltip/en.json'; +import unifiedcanvas from '../public/locales/unifiedcanvas/en.json'; declare module 'i18next' { // Extend CustomTypeOptions diff --git a/invokeai/frontend/src/i18n.ts b/invokeai/frontend/src/i18n.ts index 850d229f11..e9fb1b93a2 100644 --- a/invokeai/frontend/src/i18n.ts +++ b/invokeai/frontend/src/i18n.ts @@ -1,8 +1,8 @@ import i18n from 'i18next'; import LanguageDetector from 'i18next-browser-languagedetector'; import Backend from 'i18next-http-backend'; -import { initReactI18next } from 'react-i18next'; +import { initReactI18next } from 'react-i18next'; i18n .use(Backend) .use(LanguageDetector) diff --git a/invokeai/frontend/src/main.tsx b/invokeai/frontend/src/main.tsx index 4f1e7c63f8..09b99d37f6 100644 --- a/invokeai/frontend/src/main.tsx +++ b/invokeai/frontend/src/main.tsx @@ -1,15 +1,15 @@ +import { ChakraProvider } from '@chakra-ui/react'; +import createCache from '@emotion/cache'; +import { CacheProvider } from '@emotion/react'; import React from 'react'; import ReactDOM from 'react-dom/client'; -import { ChakraProvider } from '@chakra-ui/react'; -import { CacheProvider } from '@emotion/react'; -import createCache from '@emotion/cache'; -import { store } from './app/store'; import { Provider } from 'react-redux'; import { PersistGate } from 'redux-persist/integration/react'; +import { store } from './app/store'; import { persistor } from './persistor'; -import Loading from './Loading'; import App from './app/App'; +import Loading from './Loading'; export const emotionCache = createCache({ key: 'invokeai-style-cache', diff --git a/invokeai/frontend/src/persistor.ts b/invokeai/frontend/src/persistor.ts index e90de9ac75..ee860da3f3 100644 --- a/invokeai/frontend/src/persistor.ts +++ b/invokeai/frontend/src/persistor.ts @@ -1,4 +1,4 @@ -import { persistStore } from 'redux-persist'; import { store } from 'app/store'; +import { persistStore } from 'redux-persist'; export const persistor = persistStore(store); diff --git a/invokeai/frontend/src/styles/Mixins/_Responsive.scss b/invokeai/frontend/src/styles/Mixins/_Responsive.scss index 2d47cc7b65..0cf98567be 100644 --- a/invokeai/frontend/src/styles/Mixins/_Responsive.scss +++ b/invokeai/frontend/src/styles/Mixins/_Responsive.scss @@ -1,159 +1,159 @@ @media (max-width: 600px) { - #root{ - .app-content{ - padding: 5px; - .site-header { - position: fixed; - display: flex; - height: 100px; - z-index: 1; - .site-header-left-side{ - position: absolute; - display: flex; - min-width: 145px; - float: left; - padding-left: 0; - } - .site-header-right-side{ - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; - grid-template-rows: 25px 25px 25px; - grid-template-areas: 'logoSpace logoSpace logoSpace sampler sampler sampler' - 'status status status status status status' - 'btn1 btn2 btn3 btn4 btn5 btn6'; - row-gap: 15px; - .chakra-popover__popper{ - grid-area: logoSpace; - } - > :nth-child(1).chakra-text{ - grid-area: status; - width: 100%; - display: flex; - justify-content: center; - } - > :nth-child(2){ - grid-area: sampler; - display: flex; - justify-content: center; - align-items: center; - select{ - width: 185px; - margin-top: 10px; - } - .chakra-select__icon-wrapper{ - right:10px; - svg{ - margin-top: 10px; - } - } - } - > :nth-child(3){ - grid-area: btn1; - } - > :nth-child(4){ - grid-area: btn2; - } - > :nth-child(6){ - grid-area: btn3; - } - > :nth-child(7){ - grid-area: btn4; - } - > :nth-child(8){ - grid-area: btn5; - } - > :nth-child(9){ - grid-area: btn6; - } - - } + #root { + .app-content { + padding: 5px; + .site-header { + position: fixed; + display: flex; + height: 100px; + z-index: 1; + .site-header-left-side { + position: absolute; + display: flex; + min-width: 145px; + float: left; + padding-left: 0; + } + .site-header-right-side { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; + grid-template-rows: 25px 25px 25px; + grid-template-areas: + 'logoSpace logoSpace logoSpace sampler sampler sampler' + 'status status status status status status' + 'btn1 btn2 btn3 btn4 btn5 btn6'; + row-gap: 15px; + .chakra-popover__popper { + grid-area: logoSpace; + } + > :nth-child(1).chakra-text { + grid-area: status; + width: 100%; + display: flex; + justify-content: center; + } + > :nth-child(2) { + grid-area: sampler; + display: flex; + justify-content: center; + align-items: center; + select { + width: 185px; + margin-top: 10px; } - .app-tabs{ - position: fixed; + .chakra-select__icon-wrapper { + right: 10px; + svg { + margin-top: 10px; + } + } + } + > :nth-child(3) { + grid-area: btn1; + } + > :nth-child(4) { + grid-area: btn2; + } + > :nth-child(6) { + grid-area: btn3; + } + > :nth-child(7) { + grid-area: btn4; + } + > :nth-child(8) { + grid-area: btn5; + } + > :nth-child(9) { + grid-area: btn6; + } + } + } + .app-tabs { + position: fixed; + display: flex; + flex-direction: column; + row-gap: 15px; + max-width: 100%; + overflow: hidden; + margin-top: 120px; + .app-tabs-list { + display: flex; + justify-content: space-between; + } + .app-tabs-panels { + overflow: hidden; + overflow-y: scroll; + .workarea-main { + display: grid; + grid-template-areas: + 'workarea' + 'options' + 'gallery'; + row-gap: 15px; + .parameters-panel-wrapper { + grid-area: options; + width: 100%; + max-width: 100%; + height: inherit; + overflow: inherit; + padding: 0 10px; + .main-settings-row { + max-width: 100%; + } + .advanced-parameters-item { + max-width: 100%; + } + } + .workarea-children-wrapper { + grid-area: workarea; + .workarea-split-view { display: flex; flex-direction: column; - row-gap: 15px; - max-width: 100%; - overflow: hidden; - margin-top: 120px; - .app-tabs-list{ - display: flex; - justify-content: space-between; - } - .app-tabs-panels{ - overflow: hidden; - overflow-y: scroll; - .workarea-main{ - display: grid; - grid-template-areas: 'workarea' - 'options' - 'gallery'; - row-gap: 15px; - .parameters-panel-wrapper{ - grid-area: options; - width: 100%; - max-width: 100%; - height: inherit; - overflow: inherit; - padding: 0 10px; - .main-settings-row{ - max-width: 100%; - } - .advanced-parameters-item{ - max-width: 100%; - } - } - .workarea-children-wrapper{ - grid-area: workarea; - .workarea-split-view{ - display: flex; - flex-direction: column; - } - .current-image-options{ - column-gap: 3px; - } - .text-to-image-area{ - padding: 0; - } - .current-image-preview { - height: 430px; - } - - //image 2 image - .image-upload-button { - row-gap: 10px; - padding: 5px; - svg { - width: 2rem; - height: 2rem; - margin-top: 10px; - } - } + } + .current-image-options { + column-gap: 3px; + } + .text-to-image-area { + padding: 0; + } + .current-image-preview { + height: 430px; + } - //Cavas Painting - .inpainting-settings{ - display: flex; - flex-wrap: wrap; - row-gap: 10px; - } - .inpainting-canvas-area{ - .konvajs-content{ - height: 400px !important; - } - } - } - .image-gallery-wrapper{ - grid-area: gallery; - min-height: 400px; - .image-gallery-popup{ - width: 100% !important; - max-width: 100% !important; - } - } - } + //image 2 image + .image-upload-button { + row-gap: 10px; + padding: 5px; + svg { + width: 2rem; + height: 2rem; + margin-top: 10px; } + } + + //Cavas Painting + .inpainting-settings { + display: flex; + flex-wrap: wrap; + row-gap: 10px; + } + .inpainting-canvas-area { + .konvajs-content { + height: 400px !important; + } + } } + .image-gallery-wrapper { + grid-area: gallery; + min-height: 400px; + .image-gallery-popup { + width: 100% !important; + max-width: 100% !important; + } + } + } } + } } + } } - diff --git a/invokeai/frontend/src/styles/Mixins/index.scss b/invokeai/frontend/src/styles/Mixins/index.scss index 8a3639d2bc..bb887b7c56 100644 --- a/invokeai/frontend/src/styles/Mixins/index.scss +++ b/invokeai/frontend/src/styles/Mixins/index.scss @@ -1,4 +1,4 @@ @forward './Shared'; @forward './Buttons'; @forward './Variables'; -@forward './Responsive'; \ No newline at end of file +@forward './Responsive'; diff --git a/invokeai/frontend/vite.config.ts b/invokeai/frontend/vite.config.ts index 2514517a77..eed2684048 100644 --- a/invokeai/frontend/vite.config.ts +++ b/invokeai/frontend/vite.config.ts @@ -1,20 +1,26 @@ -import { defineConfig } from 'vite'; +import legacy from '@vitejs/plugin-legacy'; import react from '@vitejs/plugin-react'; +import { visualizer } from 'rollup-plugin-visualizer'; +import { defineConfig } from 'vite'; import eslint from 'vite-plugin-eslint'; import tsconfigPaths from 'vite-tsconfig-paths'; -import legacy from '@vitejs/plugin-legacy'; // https://vitejs.dev/config/ export default defineConfig(({ mode }) => { const common = { base: '', plugins: [ - react(), + react({ + babel: { + babelrc: true, + }, + }), eslint(), tsconfigPaths(), legacy({ modernPolyfills: ['es.array.find-last'], }), + visualizer(), ], server: { // Proxy HTTP requests to the flask server diff --git a/invokeai/frontend/yarn.lock b/invokeai/frontend/yarn.lock index 37f27e8035..c8489a6bd6 100644 --- a/invokeai/frontend/yarn.lock +++ b/invokeai/frontend/yarn.lock @@ -264,6 +264,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.4": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@chakra-ui/accordion@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@chakra-ui/accordion/-/accordion-2.1.3.tgz#98c5426fe32d06a2f7b600161e0f81d02c4c3bb0" @@ -1956,6 +1965,14 @@ add@^2.0.6: resolved "https://registry.yarnpkg.com/add/-/add-2.0.6.tgz#248f0a9f6e5a528ef2295dbeec30532130ae2235" integrity sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q== +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1966,11 +1983,23 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1978,13 +2007,18 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" +ansi-styles@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -2015,11 +2049,43 @@ aria-hidden@^1.1.1: dependencies: tslib "^2.0.0" +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + ast-module-types@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.7.1.tgz#3f7989ef8dfa1fdb82dfe0ab02bdfc7c77a57dd3" @@ -2030,11 +2096,21 @@ ast-module-types@^3.0.0: resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-3.0.0.tgz#9a6d8a80f438b6b8fe4995699d700297f398bf81" integrity sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + attr-accept@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + babel-plugin-macros@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" @@ -2044,6 +2120,14 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" +babel-plugin-transform-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-imports/-/babel-plugin-transform-imports-2.0.0.tgz#9e5f49f751a9d34ba8f4bb988c7e48ed2419c6b6" + integrity sha512-65ewumYJ85QiXdcB/jmiU0y0jg6eL6CdnDqQAqQ8JMOKh1E52VPG3NJzbVKWcgovUR5GBH8IWpCXQ7I8Q3wjgw== + dependencies: + "@babel/types" "^7.4" + is-valid-path "^0.1.1" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -2111,6 +2195,14 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -2158,6 +2250,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -2170,6 +2267,31 @@ cli-spinners@^2.5.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -2199,6 +2321,11 @@ color-name@^1.1.4, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + commander@^2.16.0, commander@^2.20.0, commander@^2.20.3, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -2214,6 +2341,11 @@ commander@^7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^9.4.1: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2343,6 +2475,19 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + dependency-tree@^8.1.1: version "8.1.2" resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-8.1.2.tgz#c9e652984f53bd0239bc8a3e50cbd52f05b2e770" @@ -2450,6 +2595,13 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -2470,11 +2622,26 @@ duplexer@~0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + electron-to-chromium@^1.4.251: version "1.4.284" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + engine.io-client@~6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.2.3.tgz#a8cbdab003162529db85e9de31575097f6d29458" @@ -2522,6 +2689,70 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" + integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.4" + is-array-buffer "^3.0.1" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + esbuild-android-64@0.15.15: version "0.15.15" resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz#fd959b034dd761d14e13dda6214b6948841ff4ff" @@ -2677,6 +2908,11 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" +eslint-config-prettier@^8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" + integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== + eslint-plugin-prettier@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" @@ -2689,6 +2925,27 @@ eslint-plugin-react-hooks@^4.6.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== +eslint-plugin-react@^7.32.2: + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -2800,7 +3057,7 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -2828,6 +3085,21 @@ event-stream@=3.3.4: stream-combiner "~0.0.4" through "~2.3.1" +execa@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" + integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^3.0.1" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2951,6 +3223,13 @@ focus-lock@^0.11.2: dependencies: tslib "^2.0.3" +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + formik@^2.2.9: version "2.2.9" resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.9.tgz#8594ba9c5e2e5cf1f42c5704128e119fc46232d0" @@ -3021,6 +3300,21 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -3034,6 +3328,20 @@ get-amd-module-type@^3.0.0: ast-module-types "^3.0.0" node-source-walk "^4.2.2" +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -3044,6 +3352,19 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3099,6 +3420,13 @@ globals@^13.15.0: dependencies: type-fest "^0.20.2" +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@^11.0.3, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -3123,6 +3451,13 @@ gonzales-pe@^4.2.3, gonzales-pe@^4.3.0: dependencies: minimist "^1.2.5" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.4: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -3140,6 +3475,11 @@ graphviz@0.0.9: dependencies: temp "~0.4.0" +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3150,6 +3490,30 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -3176,6 +3540,16 @@ html-parse-stringify@^3.0.1: dependencies: void-elements "3.1.0" +human-signals@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" + integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== + +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== + i18next-browser-languagedetector@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz#ead34592edc96c6c3a618a51cb57ad027c5b5d87" @@ -3230,6 +3604,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -3253,6 +3632,15 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +internal-slot@^1.0.3, internal-slot@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" + integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + side-channel "^1.0.4" + invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -3260,11 +3648,27 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +is-array-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -3272,6 +3676,19 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -3286,16 +3703,45 @@ is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-docker@^2.0.0: +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-glob@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== + dependencies: + is-extglob "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -3308,6 +3754,25 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-invalid-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-invalid-path/-/is-invalid-path-0.1.0.tgz#307a855b3cf1a938b44ea70d2c61106053714f34" + integrity sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ== + dependencies: + is-glob "^2.0.0" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -3323,6 +3788,14 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" @@ -3333,6 +3806,43 @@ is-relative-path@^1.0.2: resolved "https://registry.yarnpkg.com/is-relative-path/-/is-relative-path-1.0.2.tgz#091b46a0d67c1ed0fe85f1f8cfdde006bb251d46" integrity sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -3348,7 +3858,21 @@ is-url@^1.2.4: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== -is-wsl@^2.1.1: +is-valid-path@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-valid-path/-/is-valid-path-0.1.1.tgz#110f9ff74c37f663e1ec7915eb451f2db93ac9df" + integrity sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A== + dependencies: + is-invalid-path "^0.1.0" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -3423,6 +3947,14 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + klaw-sync@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" @@ -3451,11 +3983,49 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lilconfig@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" + integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lint-staged@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.1.0.tgz#d4c61aec939e789e489fa51987ec5207b50fd37e" + integrity sha512-pn/sR8IrcF/T0vpWLilih8jmVouMlxqXxKuAojmbiGX5n/gDnz+abdPptlj0vYnbfE0SQNl3CY/HwtM0+yfOVQ== + dependencies: + cli-truncate "^3.1.0" + colorette "^2.0.19" + commander "^9.4.1" + debug "^4.3.4" + execa "^6.1.0" + lilconfig "2.0.6" + listr2 "^5.0.5" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-inspect "^1.12.2" + pidtree "^0.6.0" + string-argv "^0.3.1" + yaml "^2.1.3" + +listr2@^5.0.5: + version "5.0.7" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.7.tgz#de69ccc4caf6bea7da03c74f7a2ffecf3904bd53" + integrity sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.19" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.8.0" + through "^2.3.8" + wrap-ansi "^7.0.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -3491,6 +4061,16 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -3552,12 +4132,17 @@ map-stream@~0.1.0: resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -3582,6 +4167,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3681,11 +4271,73 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -3700,6 +4352,13 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" @@ -3708,6 +4367,15 @@ open@^7.4.2: is-docker "^2.0.0" is-wsl "^2.1.1" +open@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -3766,6 +4434,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -3828,6 +4503,11 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -3855,6 +4535,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + pirates@^4.0.1: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" @@ -3952,10 +4637,15 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" - integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== +prettier-plugin-organize-imports@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.2.tgz#91993365e017daa5d0d28d8183179834224d8dd1" + integrity sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA== + +prettier@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632" + integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== pretty-ms@^7.0.1: version "7.0.1" @@ -4237,11 +4927,25 @@ regenerator-runtime@^0.13.10, regenerator-runtime@^0.13.11: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + requirejs-config-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz#4244da5dd1f59874038cc1091d078d620abb6ebc" @@ -4279,6 +4983,15 @@ resolve@^1.19.0, resolve@^1.21.0, resolve@^1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -4292,6 +5005,11 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -4306,6 +5024,16 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rollup-plugin-visualizer@^5.9.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz#013ac54fb6a9d7c9019e7eb77eced673399e5a0b" + integrity sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg== + dependencies: + open "^8.4.0" + picomatch "^2.3.1" + source-map "^0.7.4" + yargs "^17.5.1" + rollup@^2.77.2, rollup@^2.79.1: version "2.79.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" @@ -4320,11 +5048,27 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rxjs@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + sass-lookup@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-3.0.0.tgz#3b395fa40569738ce857bc258e04df2617c48cac" @@ -4389,7 +5133,16 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.2: +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -4404,6 +5157,32 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + socket.io-adapter@~2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" @@ -4462,6 +5241,11 @@ source-map@^0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" @@ -4486,6 +5270,61 @@ string-argv@^0.1.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.1.2.tgz#c5b7bc03fb2b11983ba3a72333dd0559e77e4738" integrity sha512-mBqPGEOMNJKXRo7z0keX0wlAhbBAjilUdPW13nN0PecVryZxdHIeM7TqbsSUA7VYuS00HGC6mojP7DlQzfa9ZA== +string-argv@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -4509,11 +5348,23 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -4620,7 +5471,7 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -through@2, through@~2.3, through@~2.3.1: +through@2, through@^2.3.8, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -4740,6 +5591,20 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typescript@^3.9.10, typescript@^3.9.5, typescript@^3.9.7: version "3.9.10" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" @@ -4750,6 +5615,16 @@ typescript@^4.6.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" @@ -4881,6 +5756,29 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -4900,6 +5798,24 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -4915,6 +5831,11 @@ xmlhttprequest-ssl@~2.0.0: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -4925,6 +5846,29 @@ yaml@^1.10.0, yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.1.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.5.1: + version "17.6.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yarn@^1.22.19: version "1.22.19" resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.19.tgz#4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"