├── .prettierignore
├── src
├── app.d.ts
├── common
│ └── lib
│ │ ├── index.ts
│ │ └── helpers
│ │ ├── delay
│ │ ├── index.ts
│ │ └── delay.ts
│ │ ├── memoizeTtl
│ │ └── index.ts
│ │ ├── typeGuards
│ │ ├── index.ts
│ │ └── typeGuards.ts
│ │ ├── fileExtension
│ │ ├── index.ts
│ │ └── fileExtension.ts
│ │ └── index.ts
├── renderer
│ ├── src
│ │ ├── index.scss
│ │ ├── app
│ │ │ ├── index.ts
│ │ │ ├── styles
│ │ │ │ ├── index.scss
│ │ │ │ ├── tokens
│ │ │ │ │ ├── line-height.tokens.css
│ │ │ │ │ ├── line-height.tokens.scss
│ │ │ │ │ ├── shadows.tokens.css.map
│ │ │ │ │ ├── font-size.tokens.css.map
│ │ │ │ │ ├── font-weight.tokens.css
│ │ │ │ │ ├── line-height.tokens.css.map
│ │ │ │ │ ├── font-weight.tokens.css.map
│ │ │ │ │ ├── border-radius.tokens.css.map
│ │ │ │ │ ├── letter-spacing.tokens.css.map
│ │ │ │ │ ├── shadows.tokens.css
│ │ │ │ │ ├── font-weight.tokens.scss
│ │ │ │ │ ├── opacity.tokens.css.map
│ │ │ │ │ ├── font-size.tokens.css
│ │ │ │ │ ├── shadows.tokens.scss
│ │ │ │ │ ├── font-size.tokens.scss
│ │ │ │ │ ├── border.tokens.css.map
│ │ │ │ │ ├── border-radius.tokens.css
│ │ │ │ │ ├── letter-spacing.tokens.css
│ │ │ │ │ ├── border-radius.tokens.scss
│ │ │ │ │ ├── letter-spacing.tokens.scss
│ │ │ │ │ ├── spacings.tokens.css.map
│ │ │ │ │ ├── easings.tokens.css.map
│ │ │ │ │ ├── opacity.tokens.css
│ │ │ │ │ ├── opacity.tokens.scss
│ │ │ │ │ ├── spacings.tokens.scss
│ │ │ │ │ ├── color.tokens.css.map
│ │ │ │ │ └── spacings.tokens.css
│ │ │ │ └── _fonts.scss
│ │ │ ├── ui
│ │ │ │ └── index.ts
│ │ │ └── providers
│ │ │ │ ├── index.ts
│ │ │ │ └── providers.ts
│ │ ├── pages
│ │ │ ├── Backup
│ │ │ │ ├── Backup.module.scss
│ │ │ │ ├── Story.module.scss
│ │ │ │ ├── __mocks__
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── Backup.mock.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── Backup.type.ts
│ │ │ │ ├── __snapshots__
│ │ │ │ │ └── Backup.test.tsx.snap
│ │ │ │ └── Backup.tsx
│ │ │ ├── Settings
│ │ │ │ ├── Story.module.scss
│ │ │ │ ├── Settings.module.scss
│ │ │ │ ├── __mocks__
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── Settings.mock.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── Settings.type.ts
│ │ │ ├── BaldursGate3
│ │ │ │ ├── Story.module.scss
│ │ │ │ ├── __mocks__
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── BaldursGate3.mock.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── BaldursGate3.type.ts
│ │ │ │ ├── BaldursGate3.module.scss
│ │ │ │ ├── __snapshots__
│ │ │ │ │ └── BaldursGate3.test.tsx.snap
│ │ │ │ └── BaldursGate3.tsx
│ │ │ └── index.ts
│ │ ├── shared
│ │ │ ├── types
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── ui
│ │ │ │ ├── Card
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Card.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── Card.module.scss
│ │ │ │ │ ├── Card.type.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── Card.test.tsx.snap
│ │ │ │ │ └── Card.tsx
│ │ │ │ ├── Link
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Link.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── Link.test.tsx.snap
│ │ │ │ ├── Menu
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Menu.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── Menu.test.tsx.snap
│ │ │ │ │ └── Menu.type.ts
│ │ │ │ ├── Text
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Text.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── Text.test.tsx.snap
│ │ │ │ │ ├── Text.module.scss
│ │ │ │ │ ├── Text.type.ts
│ │ │ │ │ └── Text.tsx
│ │ │ │ ├── Checkbox
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Checkbox.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── Checkbox.test.tsx
│ │ │ │ │ ├── Checkbox.type.ts
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── Checkbox.test.tsx.snap
│ │ │ │ ├── Container
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Container.mock.tsx
│ │ │ │ │ ├── Container.module.scss
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── Container.type.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── Container.test.tsx.snap
│ │ │ │ │ └── Container.tsx
│ │ │ │ ├── Loading
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── Loading.type.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── Loading.test.tsx.snap
│ │ │ │ │ ├── Loading.test.tsx
│ │ │ │ │ └── Loading.module.scss
│ │ │ │ ├── MenuItem
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── MenuItem.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── MenuItem.test.tsx.snap
│ │ │ │ │ └── MenuItem.type.ts
│ │ │ │ ├── Select
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Select.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── Select.module.scss
│ │ │ │ ├── StickyBlock
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── StickyBlock.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── StickyBlock.module.scss
│ │ │ │ │ ├── StickyBlock.type.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── StickyBlock.test.tsx.snap
│ │ │ │ │ └── StickyBlock.tsx
│ │ │ │ ├── Table
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Table.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── Table.type.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── Table.test.tsx.snap
│ │ │ │ │ ├── Table.tsx
│ │ │ │ │ └── Table.module.scss
│ │ │ │ ├── TextArea
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── TextArea.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── TextArea.module.scss
│ │ │ │ ├── TextField
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── TextField.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── TextField.module.scss
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── TextField.test.tsx.snap
│ │ │ │ ├── FakeButton
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── FakeButton.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── FakeButton.module.scss
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── FakeButton.test.tsx.snap
│ │ │ │ │ └── FakeButton.type.ts
│ │ │ │ ├── Button
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Button.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── Button.test.tsx.snap
│ │ │ │ ├── Search
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Search.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ └── Search.module.scss
│ │ │ │ ├── LazyImage
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── LazyImage.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── LazyImage.type.ts
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── LazyImage.test.tsx.snap
│ │ │ │ ├── NoImage
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── NoImage.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── NoImage.type.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── NoImage.test.tsx.snap
│ │ │ │ │ ├── NoImage.module.scss
│ │ │ │ │ ├── NoImage.tsx
│ │ │ │ │ └── Story.module.scss
│ │ │ │ ├── Spinner
│ │ │ │ │ ├── Spinner.module.scss
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── Spinner.type.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── Spinner.test.tsx.snap
│ │ │ │ │ └── Story.module.scss
│ │ │ │ ├── IconButton
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── IconButton.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── IconButton.type.ts
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── IconButton.test.tsx.snap
│ │ │ │ ├── LinkButton
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── LinkButton.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── LinkButton.test.tsx.snap
│ │ │ │ │ ├── LinkButton.module.scss
│ │ │ │ │ └── LinkButton.type.ts
│ │ │ │ ├── ToggleButton
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── ToggleButton.mock.tsx
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── ToggleButton.type.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── ToggleButton.test.tsx.snap
│ │ │ │ │ └── ToggleButton.module.scss
│ │ │ │ └── Heading
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── Heading.type.ts
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ └── Heading.test.tsx.snap
│ │ │ ├── components
│ │ │ │ ├── Error
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── Error.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── Error.type.ts
│ │ │ │ │ ├── Error.module.scss
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── Error.test.tsx.snap
│ │ │ │ │ └── Error.tsx
│ │ │ │ ├── DataTable
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── DataTable.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── DataTable.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── DataTable.type.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── DataTable.test.tsx.snap
│ │ │ │ │ └── DataTable.test.tsx
│ │ │ │ ├── SuspenseError
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── SuspenseError.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── SuspenseError.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── SuspenseError.type.ts
│ │ │ │ │ └── SuspenseError.tsx
│ │ │ │ ├── ErrorBoundary
│ │ │ │ │ ├── ErrorBoundary.module.scss
│ │ │ │ │ └── index.ts
│ │ │ │ └── index.ts
│ │ │ ├── lib
│ │ │ │ ├── schemas
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── rules
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── rules.ts
│ │ │ │ ├── helpers
│ │ │ │ │ ├── delay
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── delay.ts
│ │ │ │ │ ├── compose
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── getNodeText
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── getNodeText.ts
│ │ │ │ │ ├── typeGuards
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── typeGuards.ts
│ │ │ │ │ ├── trpc
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── classNames
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── classNames.ts
│ │ │ │ │ ├── lazyImport
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── lazyImport.type.ts
│ │ │ │ │ │ └── __mocks__
│ │ │ │ │ │ │ └── TestComponent.tsx
│ │ │ │ │ ├── mergeRefs
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── mergeRefs.ts
│ │ │ │ │ ├── storybookDecorators
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── storybookDecorators.tsx
│ │ │ │ │ ├── testUtils
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── testUtils.type.ts
│ │ │ │ │ └── index.ts
│ │ │ │ └── hooks
│ │ │ │ │ ├── useTheme
│ │ │ │ │ ├── useTheme.type.ts
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── useTheme.mock.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── useWorkerManager
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── workerManager
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── workerManager.type.ts
│ │ │ │ │ └── useWorkerManager.ts
│ │ │ │ │ ├── useMutationObserver
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── useMutationObserver.test.tsx
│ │ │ │ │ ├── useOutsideClick
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── useOutsideClick.type.ts
│ │ │ │ │ └── index.ts
│ │ │ ├── config
│ │ │ │ ├── config.ts
│ │ │ │ └── index.ts
│ │ │ ├── assets
│ │ │ │ ├── images
│ │ │ │ │ ├── BG3-logo.png
│ │ │ │ │ ├── mountain.webp
│ │ │ │ │ ├── mountain-@360.webp
│ │ │ │ │ ├── man-bear-pig-avif-1x.avif
│ │ │ │ │ ├── man-bear-pig-avif-2x.avif
│ │ │ │ │ ├── man-bear-pig-avif-3x.avif
│ │ │ │ │ ├── man-bear-pig-jpg-1x.jpg
│ │ │ │ │ ├── man-bear-pig-jpg-2x.jpg
│ │ │ │ │ ├── man-bear-pig-jpg-3x.jpg
│ │ │ │ │ ├── man-bear-pig-webp-1x.webp
│ │ │ │ │ ├── man-bear-pig-webp-2x.webp
│ │ │ │ │ ├── man-bear-pig-webp-3x.webp
│ │ │ │ │ ├── mountain-moonlight.webp
│ │ │ │ │ └── mountain-moonlight-@360.webp
│ │ │ │ ├── icons
│ │ │ │ │ ├── check.svg
│ │ │ │ │ ├── done.svg
│ │ │ │ │ ├── delete.svg
│ │ │ │ │ ├── error.svg
│ │ │ │ │ ├── copy.svg
│ │ │ │ │ ├── grid.svg
│ │ │ │ │ ├── brands
│ │ │ │ │ │ └── facebook.svg
│ │ │ │ │ ├── delete-forever.svg
│ │ │ │ │ ├── search.svg
│ │ │ │ │ ├── restore.svg
│ │ │ │ │ ├── visibility.svg
│ │ │ │ │ ├── arrow-down.svg
│ │ │ │ │ └── tick.svg
│ │ │ │ └── spinners
│ │ │ │ │ ├── eclipse-1s-200px.svg
│ │ │ │ │ ├── rolling-1s-200px.svg
│ │ │ │ │ └── oval.svg
│ │ │ └── styles
│ │ │ │ ├── _card-base.scss
│ │ │ │ └── _vars.scss
│ │ ├── routes
│ │ │ ├── AppRoutes
│ │ │ │ ├── Story.module.scss
│ │ │ │ ├── AppRoutes.module.scss
│ │ │ │ ├── __mocks__
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── AppRoutes.mock.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── __snapshots__
│ │ │ │ │ └── AppRoutes.test.tsx.snap
│ │ │ │ ├── AppRoutes.type.ts
│ │ │ │ └── AppRoutes.test.tsx
│ │ │ └── index.ts
│ │ ├── widgets
│ │ │ ├── ui
│ │ │ │ ├── AppNavBar
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── AppNavBar.mock.tsx
│ │ │ │ │ ├── AppNavBar.type.ts
│ │ │ │ │ ├── AppNavBar.module.scss
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── AppNavBar.test.tsx.snap
│ │ │ │ ├── BackupSection
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── BackupSection.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── BackupSection.module.scss
│ │ │ │ │ ├── BackupSection.type.ts
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── BackupSection.test.tsx.snap
│ │ │ │ ├── GameNavBar
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── ui
│ │ │ │ │ │ ├── GameNavLink
│ │ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ │ ├── GameNavLink.module.scss
│ │ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ └── GameNavLink.mock.tsx
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ ├── GameNavLink.type.ts
│ │ │ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ │ │ └── GameNavLink.test.tsx.snap
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── GameNavBar.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── GameNavBar.module.scss
│ │ │ │ │ ├── GameNavBar.type.ts
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── GameNavBar.test.tsx.snap
│ │ │ │ ├── ModFileSection
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── ModFileSection.mock.tsx
│ │ │ │ │ ├── ModFileSection.module.scss
│ │ │ │ │ ├── ModFileSection.type.ts
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── ModFileSection.test.tsx.snap
│ │ │ │ ├── InstalledModsSection
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── InstalledModsSection.module.scss
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── InstalledModsSection.mock.tsx
│ │ │ │ │ ├── InstalledModsSection.type.ts
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── InstalledModsSection.test.tsx.snap
│ │ │ │ └── index.ts
│ │ │ └── index.ts
│ │ ├── features
│ │ │ ├── backup
│ │ │ │ ├── ui
│ │ │ │ │ ├── Backup
│ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── Backup.mock.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── Backup.module.scss
│ │ │ │ │ │ └── Backup.type.ts
│ │ │ │ │ ├── BackupList
│ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── BackupList.mock.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── BackupList.module.scss
│ │ │ │ │ │ ├── BackupList.type.ts
│ │ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ │ └── BackupList.test.tsx.snap
│ │ │ │ │ ├── SaveSettingsButton
│ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ ├── SaveSettingsButton.module.scss
│ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── SaveSettingsButton.mock.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── SaveSettingsButton.type.ts
│ │ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ │ └── SaveSettingsButton.test.tsx.snap
│ │ │ │ │ └── RestoreDefaultSettings
│ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ ├── RestoreDefaultSettings.module.scss
│ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── RestoreDefaultSettings.mock.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── RestoreDefaultSettings.type.ts
│ │ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ └── RestoreDefaultSettings.test.tsx.snap
│ │ │ │ └── index.ts
│ │ │ ├── modFile
│ │ │ │ ├── ui
│ │ │ │ │ ├── EmptyList
│ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── EmptyList.mock.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── EmptyList.type.ts
│ │ │ │ │ │ └── EmptyList.module.scss
│ │ │ │ │ ├── ModFileButton
│ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ ├── ModFileButton.module.scss
│ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── ModFileButton.mock.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── ModFileButton.type.ts
│ │ │ │ │ │ └── __snapshots__
│ │ │ │ │ │ │ └── ModFileButton.test.tsx.snap
│ │ │ │ │ ├── ModFileForm
│ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── ModFileForm.mock.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── ModFileForm.type.ts
│ │ │ │ │ │ └── ModFileForm.module.scss
│ │ │ │ │ ├── ModFileList
│ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ ├── ModFileList.module.scss
│ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── ModFileList.mock.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── ModFileList.type.ts
│ │ │ │ │ └── ModFileRow
│ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── ModFileRow.mock.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── ModFileRow.test.tsx
│ │ │ │ │ │ ├── ModFileRow.module.scss
│ │ │ │ │ │ └── ModFileRow.type.ts
│ │ │ │ └── index.ts
│ │ │ ├── settings
│ │ │ │ ├── ui
│ │ │ │ │ └── SettingsForm
│ │ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── SettingsForm.mock.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── SettingsForm.module.scss
│ │ │ │ │ │ └── SettingsForm.type.ts
│ │ │ │ └── index.ts
│ │ │ └── modSettingsFile
│ │ │ │ ├── ui
│ │ │ │ ├── EmptyList
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── EmptyList.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── EmptyList.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── EmptyList.type.ts
│ │ │ │ │ ├── __snapshots__
│ │ │ │ │ │ └── EmptyList.test.tsx.snap
│ │ │ │ │ ├── EmptyList.tsx
│ │ │ │ │ └── EmptyList.test.tsx
│ │ │ │ ├── ModsOrder
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── ModsOrder.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── ModsOrder.type.ts
│ │ │ │ ├── InstalledMod
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── InstalledMod.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── InstalledMod.type.ts
│ │ │ │ │ └── InstalledMod.module.scss
│ │ │ │ ├── InstalledModsList
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── InstalledModsList.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── InstalledModsList.module.scss
│ │ │ │ │ └── InstalledModsList.type.ts
│ │ │ │ └── ToggleActiveModButton
│ │ │ │ │ ├── Story.module.scss
│ │ │ │ │ ├── ToggleActiveModButton.module.scss
│ │ │ │ │ ├── __mocks__
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── ToggleActiveModButton.mock.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── ToggleActiveModButton.type.ts
│ │ │ │ │ └── __snapshots__
│ │ │ │ │ └── ToggleActiveModButton.test.tsx.snap
│ │ │ │ └── index.ts
│ │ └── main.tsx
│ └── index.html
├── main
│ ├── features
│ │ ├── types
│ │ │ ├── index.ts
│ │ │ └── types.ts
│ │ ├── backup
│ │ │ ├── getBackupsHandler
│ │ │ │ └── index.ts
│ │ │ ├── createBackupHandler
│ │ │ │ └── index.ts
│ │ │ ├── deleteBackupHandler
│ │ │ │ ├── index.ts
│ │ │ │ └── deleteBackupHandler.ts
│ │ │ ├── restoreFromFileHandler
│ │ │ │ ├── index.ts
│ │ │ │ ├── restoreFromFileHandler.type.ts
│ │ │ │ └── restoreFromFileHandler.ts
│ │ │ ├── copyBackupContentHandler
│ │ │ │ ├── index.ts
│ │ │ │ └── copyBackupContentHandler.ts
│ │ │ ├── restoreDefaultSettingsHandler
│ │ │ │ ├── index.ts
│ │ │ │ └── restoreDefaultSettingsHandler.ts
│ │ │ └── index.ts
│ │ ├── mod
│ │ │ ├── reorderActiveModsHandler
│ │ │ │ └── index.ts
│ │ │ ├── toggleActiveModHandler
│ │ │ │ ├── lib
│ │ │ │ │ └── helpers
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── isActiveMod
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── isActiveMod.ts
│ │ │ │ └── index.ts
│ │ │ ├── installModsHandler
│ │ │ │ ├── lib
│ │ │ │ │ └── helpers
│ │ │ │ │ │ ├── copyPakFile
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── extractContents
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── installModsHandler.ts
│ │ │ ├── deleteModsHandler
│ │ │ │ ├── index.ts
│ │ │ │ └── lib
│ │ │ │ │ └── helpers
│ │ │ │ │ ├── removePakFiles
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── removeModFromSettings
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── removeModFromSettings.ts
│ │ │ │ │ └── index.ts
│ │ │ ├── getInstalledModsHandler
│ │ │ │ ├── index.ts
│ │ │ │ └── getInstalledModsHandler.type.ts
│ │ │ ├── readModsHandler
│ │ │ │ ├── index.ts
│ │ │ │ ├── readModsHandler.type.ts
│ │ │ │ └── worker.ts
│ │ │ └── index.ts
│ │ └── settings
│ │ │ ├── getGameSettingsHandler
│ │ │ ├── index.ts
│ │ │ └── getGameSettingsHandler.ts
│ │ │ ├── updateGameSettingsHandler
│ │ │ ├── index.ts
│ │ │ └── updateGameSettingsHandler.type.ts
│ │ │ └── index.ts
│ ├── shared
│ │ ├── lib
│ │ │ └── helpers
│ │ │ │ ├── trpc
│ │ │ │ ├── index.ts
│ │ │ │ └── trpc.ts
│ │ │ │ ├── appPaths
│ │ │ │ ├── index.ts
│ │ │ │ └── appPaths.ts
│ │ │ │ ├── memoizeTtl
│ │ │ │ └── index.ts
│ │ │ │ ├── validation
│ │ │ │ ├── index.ts
│ │ │ │ └── validation.ts
│ │ │ │ ├── fileExtension
│ │ │ │ ├── index.ts
│ │ │ │ └── fileExtension.ts
│ │ │ │ ├── netConnection
│ │ │ │ ├── index.ts
│ │ │ │ └── netConnection.ts
│ │ │ │ ├── getGameSettings
│ │ │ │ ├── index.ts
│ │ │ │ └── getGameSettings.ts
│ │ │ │ ├── resolveHtmlPath
│ │ │ │ ├── index.ts
│ │ │ │ └── resolveHtmlPath.ts
│ │ │ │ ├── ipcRequestHandler
│ │ │ │ └── index.ts
│ │ │ │ ├── workerManager
│ │ │ │ ├── index.ts
│ │ │ │ └── workerManager.type.ts
│ │ │ │ └── index.ts
│ │ ├── types
│ │ │ ├── index.ts
│ │ │ ├── api.ts
│ │ │ └── types.ts
│ │ └── config
│ │ │ ├── index.ts
│ │ │ └── config.type.ts
│ ├── controllers
│ │ ├── mod
│ │ │ └── index.ts
│ │ ├── backup
│ │ │ ├── index.ts
│ │ │ └── validation.ts
│ │ ├── settings
│ │ │ ├── index.ts
│ │ │ └── validation.ts
│ │ └── index.ts
│ ├── entities
│ │ ├── mod
│ │ │ ├── lib
│ │ │ │ └── helpers
│ │ │ │ │ ├── activateMod
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── createModNode
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── deactivateMod
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── createModNodeOrder
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── createModNodeOrder.ts
│ │ │ │ │ ├── getConventionalVersion
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── getModData
│ │ │ │ │ ├── lib
│ │ │ │ │ │ ├── getPakFileDataFromArchive
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── getPakFileDataFromArchive.type.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── getModData.ts
│ │ │ │ │ ├── getModInfo
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── getModInfo.type.ts
│ │ │ │ │ └── index.ts
│ │ │ └── index.ts
│ │ └── modSettingsFile
│ │ │ ├── lib
│ │ │ └── helpers
│ │ │ │ ├── removeDuplicates
│ │ │ │ └── index.ts
│ │ │ │ ├── saveModSettings
│ │ │ │ └── index.ts
│ │ │ │ ├── verifyModSettings
│ │ │ │ └── index.ts
│ │ │ │ ├── getCurrentSettings
│ │ │ │ ├── index.ts
│ │ │ │ └── getCurrentSettings.ts
│ │ │ │ └── index.ts
│ │ │ └── index.ts
│ ├── router.ts
│ └── init.ts
├── reset.d.ts
├── electron-env.d.ts
└── setupTests.ts
├── .npmrc
├── .husky
└── pre-commit
├── .prettierrc
├── resources
└── icon.png
├── dev-app-update.yml
├── PakReader
├── CompressionMethod.cs
├── CompressionLevel.cs
├── Resource.cs
├── PackageVersion.cs
└── PackageInfo.cs
├── .github
├── config.yml
└── ISSUE_TEMPLATE
│ ├── 3-Feature_request.md
│ ├── 2-Question.md
│ └── 1-Bug_report.md
├── .eslintignore
├── config
└── build
│ ├── afterSign.js
│ ├── beforeBuild.js
│ └── afterAllArtifactBuild.js
├── .versionrc.js
├── scripts
└── clean.js
├── versionBumper.js
├── .gitignore
└── tsconfig.node.json
/.prettierignore:
--------------------------------------------------------------------------------
1 | out
2 | dist
3 | pnpm-lock.yaml
4 |
--------------------------------------------------------------------------------
/src/app.d.ts:
--------------------------------------------------------------------------------
1 | declare const APP_VERSION: string;
2 |
--------------------------------------------------------------------------------
/src/common/lib/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./helpers";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/index.scss:
--------------------------------------------------------------------------------
1 | @import "./app/styles";
2 |
--------------------------------------------------------------------------------
/src/main/features/types/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./types";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/app/index.ts:
--------------------------------------------------------------------------------
1 | export { App } from "./ui";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/index.scss:
--------------------------------------------------------------------------------
1 | @import "./global";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/app/ui/index.ts:
--------------------------------------------------------------------------------
1 | export { App } from "./App";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Backup/Backup.module.scss:
--------------------------------------------------------------------------------
1 | .Backup {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Backup/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Settings/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/types/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./types";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Card/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Link/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Menu/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Text/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/trpc/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./trpc";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/BaldursGate3/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/routes/AppRoutes/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Checkbox/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Container/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Loading/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/MenuItem/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Select/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/StickyBlock/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {}
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Table/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextArea/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextField/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/common/lib/helpers/delay/index.ts:
--------------------------------------------------------------------------------
1 | export { delay } from "./delay";
2 |
--------------------------------------------------------------------------------
/src/common/lib/helpers/memoizeTtl/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./memoizedTtl";
2 |
--------------------------------------------------------------------------------
/src/common/lib/helpers/typeGuards/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./typeGuards";
2 |
--------------------------------------------------------------------------------
/src/main/controllers/mod/index.ts:
--------------------------------------------------------------------------------
1 | export { modController } from "./mod";
2 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/appPaths/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./appPaths";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Settings/Settings.module.scss:
--------------------------------------------------------------------------------
1 | .Settings {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/routes/AppRoutes/AppRoutes.module.scss:
--------------------------------------------------------------------------------
1 | .AppRoutes {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/Error/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/schemas/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./common";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/FakeButton/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/AppNavBar/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/BackupSection/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/common/lib/helpers/fileExtension/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./fileExtension";
2 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/memoizeTtl/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./memoizedTtl";
2 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/validation/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./validation";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/Backup/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/BackupList/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/EmptyList/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/DataTable/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/schemas/rules/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./rules";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/ModFileSection/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/main/controllers/backup/index.ts:
--------------------------------------------------------------------------------
1 | export { backupController } from "./backup";
2 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/fileExtension/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./fileExtension";
2 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/netConnection/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./netConnection";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/app/providers/index.ts:
--------------------------------------------------------------------------------
1 | export { withProviders } from "./providers";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileButton/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileForm/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileList/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileRow/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/settings/ui/SettingsForm/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/SuspenseError/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/delay/index.ts:
--------------------------------------------------------------------------------
1 | export { delay } from "./delay";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/InstalledModsSection/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
2 | shamefully-hoist=true
3 |
--------------------------------------------------------------------------------
/src/main/controllers/settings/index.ts:
--------------------------------------------------------------------------------
1 | export { settingsController } from "./settings";
2 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/activateMod/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./activateMod";
2 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/createModNode/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./createModNode";
2 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/deactivateMod/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./deactivateMod";
2 |
--------------------------------------------------------------------------------
/src/main/features/backup/getBackupsHandler/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./getBackupsHandler";
2 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/getGameSettings/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./getGameSettings";
2 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/resolveHtmlPath/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./resolveHtmlPath";
2 |
--------------------------------------------------------------------------------
/src/main/shared/types/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./types";
2 |
3 | export * from "./api";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/SaveSettingsButton/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/EmptyList/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ModsOrder/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/routes/index.ts:
--------------------------------------------------------------------------------
1 | export { AppRoutes, APP_ROUTES } from "./AppRoutes";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/DataTable/DataTable.module.scss:
--------------------------------------------------------------------------------
1 | .DataTable {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/compose/index.ts:
--------------------------------------------------------------------------------
1 | export { compose } from "./compose";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/getNodeText/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./getNodeText";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/typeGuards/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./typeGuards";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Card/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Card.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Link/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Link.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Menu/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Menu.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Text/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Text.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/AppNavBar/index.ts:
--------------------------------------------------------------------------------
1 | export { AppNavBar } from "./AppNavBar";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/main/features/backup/createBackupHandler/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./createBackupHandler";
2 |
--------------------------------------------------------------------------------
/src/main/features/backup/deleteBackupHandler/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./deleteBackupHandler";
2 |
--------------------------------------------------------------------------------
/src/main/features/types/types.ts:
--------------------------------------------------------------------------------
1 | export type { ReadModResult } from "../mod/readModsHandler";
2 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/ipcRequestHandler/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./ipcRequestHandler";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/RestoreDefaultSettings/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/index.ts:
--------------------------------------------------------------------------------
1 | export { ModFileForm } from "./ui/ModFileForm";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileList/ModFileList.module.scss:
--------------------------------------------------------------------------------
1 | .ModFileList {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledMod/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/settings/index.ts:
--------------------------------------------------------------------------------
1 | export { SettingsForm } from "./ui/SettingsForm";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/trpc/index.ts:
--------------------------------------------------------------------------------
1 | export { trpc, trpcClient } from "./trpc";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Button/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Button.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Search/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Search.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Select/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Select.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Table/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Table.mock";
2 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 | . "$(dirname -- "$0")/_/husky.sh"
3 |
4 | npx lint-staged
5 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/createModNodeOrder/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./createModNodeOrder";
2 |
--------------------------------------------------------------------------------
/src/main/features/backup/restoreFromFileHandler/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./restoreFromFileHandler";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/reorderActiveModsHandler/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./reorderActiveModsHandler";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/toggleActiveModHandler/lib/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./isActiveMod";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileButton/ModFileButton.module.scss:
--------------------------------------------------------------------------------
1 | .ModFileButton {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/EmptyList/EmptyList.module.scss:
--------------------------------------------------------------------------------
1 | .EmptyList {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledModsList/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/Error/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Error.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/ErrorBoundary/ErrorBoundary.module.scss:
--------------------------------------------------------------------------------
1 | .ErrorBoundary {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/SuspenseError/SuspenseError.module.scss:
--------------------------------------------------------------------------------
1 | .SuspenseError {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/classNames/index.ts:
--------------------------------------------------------------------------------
1 | export { classNames } from "./classNames";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/lazyImport/index.ts:
--------------------------------------------------------------------------------
1 | export { lazyImport } from "./lazyImport";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/mergeRefs/index.ts:
--------------------------------------------------------------------------------
1 | export { mergeRefs } from "./mergeRefs";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useTheme/useTheme.type.ts:
--------------------------------------------------------------------------------
1 | export type Theme = "dark" | "light";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useWorkerManager/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./useWorkerManager";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Checkbox/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Checkbox.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Container/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Container.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LazyImage/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./LazyImage.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/MenuItem/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./MenuItem.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/NoImage/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./NoImage.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Spinner/Spinner.module.scss:
--------------------------------------------------------------------------------
1 | .Spinner {
2 | fill: currentcolor;
3 | }
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextArea/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./TextArea.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextField/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./TextField.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/GameNavLink.module.scss:
--------------------------------------------------------------------------------
1 | .GameNavLink {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/ui/index.ts:
--------------------------------------------------------------------------------
1 | export { GameNavLink } from "./GameNavLink";
2 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "arrowParens": "always",
3 | "endOfLine": "lf",
4 | "trailingComma": "all"
5 | }
6 |
--------------------------------------------------------------------------------
/resources/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/resources/icon.png
--------------------------------------------------------------------------------
/src/main/features/backup/copyBackupContentHandler/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./copyBackupContentHandler";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/installModsHandler/lib/helpers/copyPakFile/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./copyPakFile";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Backup/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { BackupMock as Backup } from "./Backup.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/ErrorBoundary/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./ErrorBoundary";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/FakeButton/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./FakeButton.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/IconButton/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./IconButton.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LinkButton/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./LinkButton.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/StickyBlock/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./StickyBlock.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/AppNavBar/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./AppNavBar.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/ModFileSection/index.ts:
--------------------------------------------------------------------------------
1 | export { ModFileSection } from "./ModFileSection";
2 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/getConventionalVersion/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./getConventionalVersion";
2 |
--------------------------------------------------------------------------------
/src/main/entities/modSettingsFile/lib/helpers/removeDuplicates/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./removeDuplicates";
2 |
--------------------------------------------------------------------------------
/src/main/entities/modSettingsFile/lib/helpers/saveModSettings/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./saveModSettings";
2 |
--------------------------------------------------------------------------------
/src/main/entities/modSettingsFile/lib/helpers/verifyModSettings/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./verifyModSettings";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/deleteModsHandler/index.ts:
--------------------------------------------------------------------------------
1 | export { deleteModsHandler } from "./deleteModsHandler";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/deleteModsHandler/lib/helpers/removePakFiles/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./removePakFiles";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/installModsHandler/index.ts:
--------------------------------------------------------------------------------
1 | export { installModsHandler } from "./installModsHandler";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/toggleActiveModHandler/lib/helpers/isActiveMod/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./isActiveMod";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/EmptyList/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./EmptyList.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/DataTable/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./DataTable.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/ToggleButton/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./ToggleButton.mock";
2 |
--------------------------------------------------------------------------------
/src/reset.d.ts:
--------------------------------------------------------------------------------
1 | // Do not add any other lines of code to this file!
2 | import "@total-typescript/ts-reset";
3 |
--------------------------------------------------------------------------------
/src/main/entities/modSettingsFile/lib/helpers/getCurrentSettings/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./getCurrentSettings";
2 |
--------------------------------------------------------------------------------
/src/main/features/backup/restoreDefaultSettingsHandler/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./restoreDefaultSettingsHandler";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/installModsHandler/lib/helpers/extractContents/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./extractContents";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/installModsHandler/lib/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export { extractContents } from "./extractContents";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/SaveSettingsButton/SaveSettingsButton.module.scss:
--------------------------------------------------------------------------------
1 | .SaveSettingsButton {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileForm/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./ModFileForm.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileRow/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./ModFileRow.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/index.ts:
--------------------------------------------------------------------------------
1 | export { InstalledModsList } from "./ui/InstalledModsList";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Backup/index.ts:
--------------------------------------------------------------------------------
1 | export { Backup } from "./Backup";
2 |
3 | export * from "./Backup.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Settings/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { SettingsMock as Settings } from "./Settings.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Card/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Card";
2 |
3 | export * from "./Card.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Link/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Link";
2 |
3 | export * from "./Link.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Menu/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Menu";
2 |
3 | export * from "./Menu.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Text/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Text";
2 |
3 | export * from "./Text.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/ToggleButton/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | display: grid;
3 | gap: 20px;
4 | }
5 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/InstalledModsSection/InstalledModsSection.module.scss:
--------------------------------------------------------------------------------
1 | .InstalledModsSection {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/Backup/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { BackupMock as Backup } from "./Backup.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileButton/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./ModFileButton.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/EmptyList/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./EmptyList.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ModsOrder/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./ModsOrder.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/routes/AppRoutes/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { AppRoutesMock as AppRoutes } from "./AppRoutes.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/SuspenseError/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./SuspenseError.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/storybookDecorators/index.ts:
--------------------------------------------------------------------------------
1 | export { withRouter } from "./storybookDecorators";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Button/index.ts:
--------------------------------------------------------------------------------
1 | export { Button } from "./Button";
2 |
3 | export * from "./Button.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Heading/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | .variants {
3 | margin: 2rem 0;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Search/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Search";
2 |
3 | export * from "./Search.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Select/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Select";
2 |
3 | export * from "./Select.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Table/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Table";
2 |
3 | export * from "./Table.type";
4 |
--------------------------------------------------------------------------------
/src/main/features/mod/deleteModsHandler/lib/helpers/removeModFromSettings/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./removeModFromSettings";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/getInstalledModsHandler/index.ts:
--------------------------------------------------------------------------------
1 | export { getInstalledModsHandler } from "./getInstalledModsHandler";
2 |
--------------------------------------------------------------------------------
/src/main/features/mod/toggleActiveModHandler/index.ts:
--------------------------------------------------------------------------------
1 | export { toggleActiveModHandler } from "./toggleActiveModHandler";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledMod/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./InstalledMod.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Settings/index.ts:
--------------------------------------------------------------------------------
1 | export { Settings } from "./Settings";
2 |
3 | export * from "./Settings.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/Error/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Error";
2 |
3 | export * from "./Error.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/testUtils/index.ts:
--------------------------------------------------------------------------------
1 | export { renderWithRouter, withQueryProvider } from "./testUtils";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useMutationObserver/index.ts:
--------------------------------------------------------------------------------
1 | export { useMutationObserver } from "./useMutationObserver";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useTheme/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { useThemeMock as useTheme } from "./useTheme.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useTheme/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./useTheme";
2 |
3 | export * from "./useTheme.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Checkbox/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Checkbox";
2 |
3 | export * from "./Checkbox.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Heading/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Heading";
2 |
3 | export * from "./Heading.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Loading/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Loading";
2 |
3 | export * from "./Loading.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/MenuItem/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./MenuItem";
2 |
3 | export * from "./MenuItem.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/NoImage/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./NoImage";
2 |
3 | export * from "./NoImage.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Spinner/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Spinner";
2 |
3 | export * from "./Spinner.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextArea/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./TextArea";
2 |
3 | export * from "./TextArea.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { GameNavBarMock as GameNavBar } from "./GameNavBar.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/InstalledModsSection/index.ts:
--------------------------------------------------------------------------------
1 | export { InstalledModsSection } from "./InstalledModsSection";
2 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/getModData/lib/getPakFileDataFromArchive/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./getPakFileDataFromArchive";
2 |
--------------------------------------------------------------------------------
/src/main/features/settings/getGameSettingsHandler/index.ts:
--------------------------------------------------------------------------------
1 | export { getGameSettingsHandler } from "./getGameSettingsHandler";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/Backup/index.ts:
--------------------------------------------------------------------------------
1 | export { Backup } from "./Backup";
2 |
3 | export * from "./Backup.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/RestoreDefaultSettings/RestoreDefaultSettings.module.scss:
--------------------------------------------------------------------------------
1 | .RestoreDefaultSettings {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/BaldursGate3/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { BaldursGate3Mock as BaldursGate3 } from "./BaldursGate3.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/routes/AppRoutes/index.ts:
--------------------------------------------------------------------------------
1 | export { AppRoutes } from "./AppRoutes";
2 |
3 | export * from "./AppRoutes.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Container/Container.module.scss:
--------------------------------------------------------------------------------
1 | .Container {
2 | margin-inline: auto;
3 | max-width: 106rem;
4 | }
5 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Container/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./Container";
2 |
3 | export * from "./Container.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LazyImage/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./LazyImage";
2 |
3 | export * from "./LazyImage.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextField/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./TextField";
2 |
3 | export * from "./TextField.type";
4 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/getModData/lib/index.ts:
--------------------------------------------------------------------------------
1 | export { getPakFileDataFromArchive } from "./getPakFileDataFromArchive";
2 |
--------------------------------------------------------------------------------
/src/main/features/settings/updateGameSettingsHandler/index.ts:
--------------------------------------------------------------------------------
1 | export { updateGameSettingsHandler } from "./updateGameSettingsHandler";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/BackupList/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { BackupListMock as BackupList } from "./BackupList.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/ToggleActiveModButton.module.scss:
--------------------------------------------------------------------------------
1 | .ToggleActiveModButton {
2 | }
3 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/FakeButton/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./FakeButton";
2 |
3 | export * from "./FakeButton.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/IconButton/index.ts:
--------------------------------------------------------------------------------
1 | export { IconButton } from "./IconButton";
2 |
3 | export * from "./IconButton.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LinkButton/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./LinkButton";
2 |
3 | export * from "./LinkButton.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/StickyBlock/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./StickyBlock";
2 |
3 | export * from "./StickyBlock.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/index.ts:
--------------------------------------------------------------------------------
1 | export { GameNavBar } from "./GameNavBar";
2 |
3 | export * from "./GameNavBar.type";
4 |
--------------------------------------------------------------------------------
/dev-app-update.yml:
--------------------------------------------------------------------------------
1 | provider: generic
2 | url: https://example.com/auto-updates
3 | updaterCacheDirName: baldurs-gate3-mod-manager-updater
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/EmptyList/index.ts:
--------------------------------------------------------------------------------
1 | export { EmptyList } from "./EmptyList";
2 |
3 | export * from "./EmptyList.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileList/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { ModFileListMock as ModFileList } from "./ModFileList.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/BaldursGate3/index.ts:
--------------------------------------------------------------------------------
1 | export { BaldursGate3 } from "./BaldursGate3";
2 |
3 | export * from "./BaldursGate3.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/DataTable/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./DataTable";
2 |
3 | export * from "./DataTable.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Card/Card.module.scss:
--------------------------------------------------------------------------------
1 | @import "../../styles/card-base.scss";
2 |
3 | .Card {
4 | @extend %card-base;
5 | }
6 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/ToggleButton/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./ToggleButton";
2 |
3 | export * from "./ToggleButton.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/BackupSection/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { BackupSectionMock as BackupSection } from "./BackupSection.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/ModFileSection/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { ModFileSectionMock as ModFileSection } from "./ModFileSection.mock";
2 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/getModData/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./getModData";
2 |
3 | export { getPakFileDataFromArchive } from "./lib";
4 |
--------------------------------------------------------------------------------
/src/main/features/mod/deleteModsHandler/lib/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./removeModFromSettings";
2 |
3 | export * from "./removePakFiles";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/BackupList/index.ts:
--------------------------------------------------------------------------------
1 | export { BackupList } from "./BackupList";
2 |
3 | export * from "./BackupList.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileRow/index.ts:
--------------------------------------------------------------------------------
1 | export { ModFileRow } from "./ModFileRow";
2 |
3 | export * from "./ModFileRow.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/settings/ui/SettingsForm/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { SettingsFormMock as SettingsForm } from "./SettingsForm.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useOutsideClick/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./useOutsideClick";
2 |
3 | export * from "./useOutsideClick.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { GameNavLinkMock as GameNavLink } from "./GameNavLink.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/ModFileSection/ModFileSection.module.scss:
--------------------------------------------------------------------------------
1 | .ModFileSection {
2 | display: flex;
3 | flex-direction: column;
4 | }
5 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/workerManager/index.ts:
--------------------------------------------------------------------------------
1 | export { WorkerManager } from "./workerManager";
2 |
3 | export * from "./workerManager.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/BackupList/BackupList.module.scss:
--------------------------------------------------------------------------------
1 | .BackupList {
2 | background-color: orange;
3 | max-width: 60rem;
4 | }
5 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileForm/index.ts:
--------------------------------------------------------------------------------
1 | export { ModFileForm } from "./ModFileForm";
2 |
3 | export * from "./ModFileForm.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileList/index.ts:
--------------------------------------------------------------------------------
1 | export { ModFileList } from "./ModFileList";
2 |
3 | export * from "./ModFileList.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/EmptyList/index.ts:
--------------------------------------------------------------------------------
1 | export { EmptyList } from "./EmptyList";
2 |
3 | export * from "./EmptyList.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ModsOrder/index.ts:
--------------------------------------------------------------------------------
1 | export { ModsOrder } from "./ModsOrder";
2 |
3 | export * from "./ModsOrder.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/SuspenseError/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./SuspenseError";
2 |
3 | export * from "./SuspenseError.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/IconButton/IconButton.type.ts:
--------------------------------------------------------------------------------
1 | import { ButtonProps } from "../Button";
2 |
3 | export type IconButtonProps = ButtonProps;
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextField/TextField.module.scss:
--------------------------------------------------------------------------------
1 | @import "../../styles/input-base";
2 |
3 | .TextField {
4 | @extend %input-base;
5 | }
6 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/BackupSection/index.ts:
--------------------------------------------------------------------------------
1 | export { BackupSection } from "./BackupSection";
2 |
3 | export * from "./BackupSection.type";
4 |
--------------------------------------------------------------------------------
/PakReader/CompressionMethod.cs:
--------------------------------------------------------------------------------
1 | namespace PakReader;
2 |
3 | public enum CompressionMethod
4 | {
5 | None = 0,
6 | Zlib = 1,
7 | LZ4 = 2
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/entities/modSettingsFile/index.ts:
--------------------------------------------------------------------------------
1 | export {
2 | getCurrentSettings,
3 | saveModSettings,
4 | verifyModSettings,
5 | } from "./lib/helpers";
6 |
--------------------------------------------------------------------------------
/src/renderer/src/features/settings/ui/SettingsForm/index.ts:
--------------------------------------------------------------------------------
1 | export { SettingsForm } from "./SettingsForm";
2 |
3 | export * from "./SettingsForm.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/config/config.ts:
--------------------------------------------------------------------------------
1 | const BG3_SETTINGS_DIR = process.env.REACT_APP_BG3_SETTINGS_DIR as string;
2 |
3 | export { BG3_SETTINGS_DIR };
4 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/index.ts:
--------------------------------------------------------------------------------
1 | export { GameNavLink } from "./GameNavLink";
2 |
3 | export * from "./GameNavLink.type";
4 |
--------------------------------------------------------------------------------
/.github/config.yml:
--------------------------------------------------------------------------------
1 | requiredHeaders:
2 | - Prerequisites
3 | - Expected Behavior
4 | - Current Behavior
5 | - Possible Solution
6 | - Your Environment
7 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileButton/index.ts:
--------------------------------------------------------------------------------
1 | export { ModFileButton } from "./ModFileButton";
2 |
3 | export * from "./ModFileButton.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledMod/index.ts:
--------------------------------------------------------------------------------
1 | export { InstalledMod } from "./InstalledMod";
2 |
3 | export * from "./InstalledMod.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/routes/AppRoutes/__mocks__/AppRoutes.mock.tsx:
--------------------------------------------------------------------------------
1 | const AppRoutesMock = () =>
;
2 |
3 | export { AppRoutesMock };
4 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/SaveSettingsButton/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { SaveSettingsButtonMock as SaveSettingsButton } from "./SaveSettingsButton.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useWorkerManager/workerManager/index.ts:
--------------------------------------------------------------------------------
1 | export { default } from "./workerManager";
2 |
3 | export * from "./workerManager.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/InstalledModsSection/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { InstalledModsSectionMock as InstalledModsSection } from "./InstalledModsSection.mock";
2 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/3-Feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: You want something added to the boilerplate. 🎉
4 | labels: "enhancement"
5 | ---
6 |
--------------------------------------------------------------------------------
/src/main/features/mod/readModsHandler/index.ts:
--------------------------------------------------------------------------------
1 | export { readModsHandler } from "./readModsHandler";
2 |
3 | export type { ReadModResult } from "./readModsHandler.type";
4 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/validation/validation.ts:
--------------------------------------------------------------------------------
1 | import z from "zod";
2 |
3 | const gameKeyValidation = z.literal("BG3");
4 |
5 | export { gameKeyValidation };
6 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledModsList/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { InstalledModsListMock as InstalledModsList } from "./InstalledModsList.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/BG3-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/BG3-logo.png
--------------------------------------------------------------------------------
/src/renderer/src/widgets/index.ts:
--------------------------------------------------------------------------------
1 | export {
2 | AppNavBar,
3 | BackupSection,
4 | GameNavBar,
5 | InstalledModsSection,
6 | ModFileSection,
7 | } from "./ui";
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/SaveSettingsButton/index.ts:
--------------------------------------------------------------------------------
1 | export { SaveSettingsButton } from "./SaveSettingsButton";
2 |
3 | export * from "./SaveSettingsButton.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/index.ts:
--------------------------------------------------------------------------------
1 | export { Backup } from "./Backup";
2 |
3 | export { BaldursGate3 } from "./BaldursGate3";
4 |
5 | export { Settings } from "./Settings";
6 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/mountain.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/mountain.webp
--------------------------------------------------------------------------------
/PakReader/CompressionLevel.cs:
--------------------------------------------------------------------------------
1 | namespace PakReader;
2 |
3 | public enum CompressionLevel
4 | {
5 | FastCompression,
6 | DefaultCompression,
7 | MaxCompression
8 | }
9 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/line-height.tokens.css:
--------------------------------------------------------------------------------
1 | :root {
2 | /**
3 | * @tokens Line Heights
4 | * @presenter LineHeight
5 | */
6 | --line-height: 1.5;
7 | }
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/RestoreDefaultSettings/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { RestoreDefaultSettingsMock as RestoreDefaultSettings } from "./RestoreDefaultSettings.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledModsList/index.ts:
--------------------------------------------------------------------------------
1 | export { InstalledModsList } from "./InstalledModsList";
2 |
3 | export * from "./InstalledModsList.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/testUtils/testUtils.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 |
3 | export type WithTrpcProviderArgs = {
4 | children: ReactNode;
5 | };
6 |
--------------------------------------------------------------------------------
/src/main/controllers/index.ts:
--------------------------------------------------------------------------------
1 | export { backupController } from "./backup";
2 |
3 | export { modController } from "./mod";
4 |
5 | export { settingsController } from "./settings";
6 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/getModInfo/index.ts:
--------------------------------------------------------------------------------
1 | export { getModInfoFromBytes, getModInfoFromFile } from "./getModInfo";
2 |
3 | export type { ModInfo } from "./getModInfo.type";
4 |
--------------------------------------------------------------------------------
/src/main/entities/modSettingsFile/lib/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./getCurrentSettings";
2 |
3 | export * from "./saveModSettings";
4 |
5 | export * from "./verifyModSettings";
6 |
--------------------------------------------------------------------------------
/src/main/features/settings/index.ts:
--------------------------------------------------------------------------------
1 | export { getGameSettingsHandler } from "./getGameSettingsHandler";
2 |
3 | export { updateGameSettingsHandler } from "./updateGameSettingsHandler";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/line-height.tokens.scss:
--------------------------------------------------------------------------------
1 | :root {
2 |
3 | /**
4 | * @tokens Line Heights
5 | * @presenter LineHeight
6 | */
7 | --line-height: 1.5;
8 | }
9 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/__mocks__/index.ts:
--------------------------------------------------------------------------------
1 | export { ToggleActiveModButtonMock as ToggleActiveModButton } from "./ToggleActiveModButton.mock";
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/mountain-@360.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/mountain-@360.webp
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | out
4 | electron.vite.config.ts
5 | vitest.config.ts
6 | /scripts
7 |
8 |
9 | ### OSX
10 | .DS_Store
11 |
12 | ### Editors
13 | .idea
14 |
--------------------------------------------------------------------------------
/src/renderer/src/app/providers/providers.ts:
--------------------------------------------------------------------------------
1 | import { compose } from "@renderer/shared/lib/helpers";
2 |
3 | const withProviders = compose(() => null);
4 |
5 | export { withProviders };
6 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/StickyBlock/StickyBlock.module.scss:
--------------------------------------------------------------------------------
1 | .StickyBlock {
2 | background-color: var(--surface-1);
3 | padding: 1rem 0;
4 | position: sticky;
5 | top: 0;
6 | }
7 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/2-Question.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Question
3 | about: Ask a question.❓
4 | labels: "question"
5 | ---
6 |
7 | ## Summary
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/getModData/lib/getPakFileDataFromArchive/getPakFileDataFromArchive.type.ts:
--------------------------------------------------------------------------------
1 | export type PakFileData = {
2 | fileName: string;
3 | data?: Int8Array;
4 | };
5 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/RestoreDefaultSettings/index.ts:
--------------------------------------------------------------------------------
1 | export { RestoreDefaultSettings } from "./RestoreDefaultSettings";
2 |
3 | export * from "./RestoreDefaultSettings.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/check.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/done.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/man-bear-pig-avif-1x.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-avif-1x.avif
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/man-bear-pig-avif-2x.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-avif-2x.avif
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/man-bear-pig-avif-3x.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-avif-3x.avif
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/man-bear-pig-jpg-1x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-jpg-1x.jpg
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/man-bear-pig-jpg-2x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-jpg-2x.jpg
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/man-bear-pig-jpg-3x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-jpg-3x.jpg
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/man-bear-pig-webp-1x.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-webp-1x.webp
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/man-bear-pig-webp-2x.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-webp-2x.webp
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/man-bear-pig-webp-3x.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-webp-3x.webp
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/mountain-moonlight.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/mountain-moonlight.webp
--------------------------------------------------------------------------------
/src/common/lib/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export { delay } from "./delay";
2 |
3 | export * from "./fileExtension";
4 |
5 | export { memoizeTtl } from "./memoizeTtl";
6 |
7 | export * from "./typeGuards";
8 |
--------------------------------------------------------------------------------
/src/main/features/mod/readModsHandler/readModsHandler.type.ts:
--------------------------------------------------------------------------------
1 | import { ModInfo } from "@main/entities/mod";
2 |
3 | export type ReadModResult = {
4 | filePath: string;
5 | info?: ModInfo;
6 | };
7 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/index.ts:
--------------------------------------------------------------------------------
1 | export { ToggleActiveModButton } from "./ToggleActiveModButton";
2 |
3 | export * from "./ToggleActiveModButton.type";
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/typeGuards/typeGuards.ts:
--------------------------------------------------------------------------------
1 | const isHtmlElement = (value: unknown): value is HTMLElement =>
2 | value instanceof HTMLElement;
3 |
4 | export { isHtmlElement };
5 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Menu/__snapshots__/Menu.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = ``;
4 |
--------------------------------------------------------------------------------
/src/main/features/mod/getInstalledModsHandler/getInstalledModsHandler.type.ts:
--------------------------------------------------------------------------------
1 | import { ModInfo } from "@main/entities/mod";
2 |
3 | export type InstalledMod = ModInfo & {
4 | isActive: boolean;
5 | };
6 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/_fonts.scss:
--------------------------------------------------------------------------------
1 | /* stylelint-disable */
2 | @import url("https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap");
3 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/shadows.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["shadows.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA","file":"shadows.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/images/mountain-moonlight-@360.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/mountain-moonlight-@360.webp
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/NoImage/NoImage.type.ts:
--------------------------------------------------------------------------------
1 | export type NoImageProps = {
2 | /**
3 | * a string that will be applied as a css class to parent element
4 | */
5 | className?: string;
6 | };
7 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/GameNavBar.module.scss:
--------------------------------------------------------------------------------
1 | .GameNavBar {
2 | display: flex;
3 | flex-direction: column;
4 | gap: var(--spacing-4);
5 | padding-block: var(--spacing-5);
6 | }
7 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useOutsideClick/useOutsideClick.type.ts:
--------------------------------------------------------------------------------
1 | import { RefObject } from "react";
2 |
3 | export type Callback = () => void;
4 |
5 | export type Refs = RefObject[];
6 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/schemas/rules/rules.ts:
--------------------------------------------------------------------------------
1 | const password = {
2 | upperCase: /[A-Z]/,
3 | lowerCase: /[a-z]/,
4 | number: /\d/,
5 | special: /[#?!@$%^&*-]/,
6 | };
7 |
8 | export { password };
9 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/font-size.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["font-size.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA;EACA","file":"font-size.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/font-weight.tokens.css:
--------------------------------------------------------------------------------
1 | :root {
2 | /**
3 | * @tokens Font Weights
4 | * @presenter FontWeight
5 | */
6 | --font-weight-regular: 400;
7 | --font-weight-bold: 600;
8 | }
9 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/line-height.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["line-height.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA","file":"line-height.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/routes/AppRoutes/__snapshots__/AppRoutes.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = ``;
4 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/AppNavBar/AppNavBar.type.ts:
--------------------------------------------------------------------------------
1 | export type AppNavBarProps = {
2 | /**
3 | * a string that will be applied as a css class to parent element
4 | */
5 | className?: string;
6 | };
7 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/GameNavBar.type.ts:
--------------------------------------------------------------------------------
1 | export type GameNavBarProps = {
2 | /**
3 | * a string that will be applied as a css class to parent element
4 | */
5 | className?: string;
6 | };
7 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/trpc/trpc.ts:
--------------------------------------------------------------------------------
1 | import { initTRPC } from "@trpc/server";
2 | import superjson from "superjson";
3 |
4 | const t = initTRPC.create({
5 | transformer: superjson,
6 | });
7 |
8 | export { t };
9 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/font-weight.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["font-weight.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA","file":"font-weight.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/pages/BaldursGate3/BaldursGate3.type.ts:
--------------------------------------------------------------------------------
1 | export type BaldursGate3Props = {
2 | /**
3 | * a string that will be applied as a css class to parent element
4 | */
5 | className?: string;
6 | };
7 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/SuspenseError/SuspenseError.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 |
3 | export type SuspenseErrorProps = {
4 | children?: ReactNode;
5 | loadingFallback?: ReactNode;
6 | };
7 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/index.ts:
--------------------------------------------------------------------------------
1 | export { default as DataTable } from "./DataTable";
2 |
3 | export { default as Error } from "./Error";
4 |
5 | export { default as SuspenseError } from "./SuspenseError";
6 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/lazyImport/lazyImport.type.ts:
--------------------------------------------------------------------------------
1 | import { ComponentType } from "react";
2 |
3 | export type LazyFunction> = () => Promise<{
4 | default: T;
5 | }>;
6 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Search/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | }
3 |
4 | .option {
5 | align-items: center;
6 | display: flex;
7 | gap: 1rem;
8 |
9 | img {
10 | height: 6rem;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/PakReader/Resource.cs:
--------------------------------------------------------------------------------
1 | namespace PakReader;
2 |
3 | public class InvalidFormatException : Exception
4 | {
5 | public InvalidFormatException(string message)
6 | : base(message)
7 | {
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/features/backup/restoreFromFileHandler/restoreFromFileHandler.type.ts:
--------------------------------------------------------------------------------
1 | import { GameKey } from "@main/shared/config";
2 |
3 | export type RestoreFromFileDto = {
4 | file: string;
5 | gameKey: GameKey;
6 | };
7 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/border-radius.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["border-radius.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAKA;EACA;EACA","file":"border-radius.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/letter-spacing.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["letter-spacing.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA;EACA","file":"letter-spacing.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/shadows.tokens.css:
--------------------------------------------------------------------------------
1 | :root {
2 | /**
3 | * @tokens Shadows
4 | * @presenter Shadow
5 | */
6 | --shadow-m: 0 1px 3px rgb(0 0 0 / 20%);
7 | --shadow-l: 0 1px 5px rgb(0 0 0 / 30%);
8 | }
9 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/BaldursGate3/BaldursGate3.module.scss:
--------------------------------------------------------------------------------
1 | .BaldursGate3 {
2 | display: grid;
3 | gap: var(--spacing-10);
4 | grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
5 | min-height: 100dvh;
6 | }
7 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/Error/Error.type.ts:
--------------------------------------------------------------------------------
1 | export type ErrorProps = {
2 | /**
3 | * a string that will be applied as a css class to parent element
4 | */
5 | className?: string;
6 | error?: string;
7 | };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useWorkerManager/workerManager/workerManager.type.ts:
--------------------------------------------------------------------------------
1 | import { Remote } from "comlink";
2 |
3 | export type AppWorker = Remote>;
4 |
5 | export type WorkerFactory = () => Worker;
6 |
--------------------------------------------------------------------------------
/src/main/shared/config/index.ts:
--------------------------------------------------------------------------------
1 | export {
2 | APP_SETTINGS,
3 | PAK_READER_PATH,
4 | createBackupDir,
5 | saveSettings,
6 | } from "./config";
7 |
8 | export type { AppSettings, GameSettings, GameKey } from "./config.type";
9 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/getGameSettings/getGameSettings.ts:
--------------------------------------------------------------------------------
1 | import { APP_SETTINGS, GameKey } from "@main/shared/config";
2 |
3 | const getGameSettings = (key: GameKey) => APP_SETTINGS[key];
4 |
5 | export { getGameSettings };
6 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/font-weight.tokens.scss:
--------------------------------------------------------------------------------
1 | :root {
2 |
3 | /**
4 | * @tokens Font Weights
5 | * @presenter FontWeight
6 | */
7 | --font-weight-regular: 400;
8 | --font-weight-bold: 600;
9 | }
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/lazyImport/__mocks__/TestComponent.tsx:
--------------------------------------------------------------------------------
1 | const TestComponent = () => (
2 |
5 | );
6 |
7 | export default TestComponent;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/BackupSection/BackupSection.module.scss:
--------------------------------------------------------------------------------
1 | .BackupSection {
2 | .buttonGroup {
3 | display: flex;
4 | gap: var(--spacing-5);
5 | margin-block: var(--spacing-6) var(--spacing-12);
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/opacity.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["opacity.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"opacity.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/index.ts:
--------------------------------------------------------------------------------
1 | export { BackupList } from "./ui/BackupList";
2 |
3 | export { RestoreDefaultSettings } from "./ui/RestoreDefaultSettings";
4 |
5 | export { SaveSettingsButton } from "./ui/SaveSettingsButton";
6 |
--------------------------------------------------------------------------------
/src/renderer/src/main.tsx:
--------------------------------------------------------------------------------
1 | import ReactDOM from "react-dom/client";
2 |
3 | import "./index.scss";
4 | import { App } from "./app";
5 |
6 | ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
7 | ,
8 | );
9 |
--------------------------------------------------------------------------------
/src/main/features/backup/deleteBackupHandler/deleteBackupHandler.ts:
--------------------------------------------------------------------------------
1 | import { rm } from "fs/promises";
2 |
3 | const deleteBackupHandler = async (filePath: string) => {
4 | await rm(filePath);
5 | };
6 |
7 | export { deleteBackupHandler };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/font-size.tokens.css:
--------------------------------------------------------------------------------
1 | :root {
2 | /**
3 | * @tokens Font Sizes
4 | * @presenter FontSize
5 | */
6 | --font-size-s: 0.75rem;
7 | --font-size-m: 0.875rem;
8 | --font-size-l: 1rem;
9 | }
10 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/shadows.tokens.scss:
--------------------------------------------------------------------------------
1 | :root {
2 |
3 | /**
4 | * @tokens Shadows
5 | * @presenter Shadow
6 | */
7 | --shadow-m: 0 1px 3px rgb(0 0 0 / 20%);
8 | --shadow-l: 0 1px 5px rgb(0 0 0 / 30%);
9 | }
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/types/types.ts:
--------------------------------------------------------------------------------
1 | import { GameKey as GK } from "@main/shared/config";
2 |
3 | export type { IpcRequest } from "@main/shared/types";
4 |
5 | export type { AppRouter } from "@main/router";
6 |
7 | export type Game = GK;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/font-size.tokens.scss:
--------------------------------------------------------------------------------
1 | :root {
2 |
3 | /**
4 | * @tokens Font Sizes
5 | * @presenter FontSize
6 | */
7 | --font-size-s: 0.75rem;
8 | --font-size-m: 0.875rem;
9 | --font-size-l: 1rem;
10 | }
11 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Card/__mocks__/Card.mock.tsx:
--------------------------------------------------------------------------------
1 | import { CardProps } from "../Card.type";
2 |
3 | const CardMock = (props: CardProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default CardMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/FakeButton/FakeButton.module.scss:
--------------------------------------------------------------------------------
1 | @use "../../styles/_vars.scss" as v;
2 |
3 | .FakeButton {
4 | height: 100%;
5 | width: 100%;
6 |
7 | &:focus-visible {
8 | @include v.focus-visible;
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Link/__mocks__/Link.mock.tsx:
--------------------------------------------------------------------------------
1 | import { LinkProps } from "../Link.type";
2 |
3 | const LinkMock = (props: LinkProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default LinkMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Menu/__mocks__/Menu.mock.tsx:
--------------------------------------------------------------------------------
1 | import { MenuProps } from "../Menu.type";
2 |
3 | const MenuMock = (props: MenuProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default MenuMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Text/__mocks__/Text.mock.tsx:
--------------------------------------------------------------------------------
1 | import { TextProps } from "../Text.type";
2 |
3 | const TextMock = (props: TextProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default TextMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/border.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["border.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"border.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/border-radius.tokens.css:
--------------------------------------------------------------------------------
1 | :root {
2 | /**
3 | * @tokens Border Radius
4 | * @presenter BorderRadius
5 | */
6 | --border-radius-s: 4px;
7 | --border-radius-m: 8px;
8 | --border-radius-l: 16px;
9 | }
10 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Backup/__mocks__/Backup.mock.tsx:
--------------------------------------------------------------------------------
1 | import { BackupProps } from "../Backup.type";
2 |
3 | const BackupMock = (props: BackupProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { BackupMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Table/__mocks__/Table.mock.tsx:
--------------------------------------------------------------------------------
1 | import { TableProps } from "../Table.type";
2 |
3 | const TableMock = (props: TableProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default TableMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/letter-spacing.tokens.css:
--------------------------------------------------------------------------------
1 | :root {
2 | /**
3 | * @tokens Letter Spacings
4 | * @presenter LetterSpacing
5 | */
6 | --letter-spacing-none: 0;
7 | --letter-spacing-s: 1px;
8 | --letter-spacing-m: 2px;
9 | }
10 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledModsList/InstalledModsList.module.scss:
--------------------------------------------------------------------------------
1 | .InstalledModsList {
2 | .table {
3 | width: 100%;
4 |
5 | th:first-child,
6 | td:first-child {
7 | width: 50px;
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/Error/__mocks__/Error.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ErrorProps } from "../Error.type";
2 |
3 | const ErrorMock = (props: ErrorProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default ErrorMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Button/__mocks__/Button.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ButtonProps } from "../Button.type";
2 |
3 | const ButtonMock = (props: ButtonProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default ButtonMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/border-radius.tokens.scss:
--------------------------------------------------------------------------------
1 | :root {
2 |
3 | /**
4 | * @tokens Border Radius
5 | * @presenter BorderRadius
6 | */
7 |
8 | --border-radius-s: 4px;
9 | --border-radius-m: 8px;
10 | --border-radius-l: 16px;
11 | }
12 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/letter-spacing.tokens.scss:
--------------------------------------------------------------------------------
1 | :root {
2 |
3 | /**
4 | * @tokens Letter Spacings
5 | * @presenter LetterSpacing
6 | */
7 | --letter-spacing-none: 0;
8 | --letter-spacing-s: 1px;
9 | --letter-spacing-m: 2px;
10 | }
11 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/Backup/__mocks__/Backup.mock.tsx:
--------------------------------------------------------------------------------
1 | import { BackupProps } from "../Backup.type";
2 |
3 | const BackupMock = (props: BackupProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { BackupMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Search/__mocks__/Search.mock.tsx:
--------------------------------------------------------------------------------
1 | import { SearchProps } from "../Search.type";
2 |
3 | const SearchMock = (props: SearchProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default SearchMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Select/__mocks__/Select.mock.tsx:
--------------------------------------------------------------------------------
1 | import { SelectProps } from "../Select.type";
2 |
3 | const SelectMock = (props: SelectProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default SelectMock;
8 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/workerManager/workerManager.type.ts:
--------------------------------------------------------------------------------
1 | import { Worker } from "node:worker_threads";
2 |
3 | import { Remote } from "comlink";
4 |
5 | export type AppWorker = Remote;
6 |
7 | export type WorkerFactory = (options: WorkerOptions) => Worker;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/spacings.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["spacings.tokens.scss"],"names":[],"mappings":"AAAA;AAEA;AACE;AAAA;AAAA;AAAA;EAKE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAEF;EACA;EACA;EACA","file":"spacings.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/pages/Settings/__mocks__/Settings.mock.tsx:
--------------------------------------------------------------------------------
1 | import { SettingsProps } from "../Settings.type";
2 |
3 | const SettingsMock = (props: SettingsProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { SettingsMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Heading/Heading.type.ts:
--------------------------------------------------------------------------------
1 | export type HeadingProps = {
2 | className?: string;
3 | children?: React.ReactNode;
4 | onClick?: (event: React.MouseEvent) => void;
5 | variant?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
6 | };
7 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/NoImage/__mocks__/NoImage.mock.tsx:
--------------------------------------------------------------------------------
1 | import { NoImageProps } from "../NoImage.type";
2 |
3 | const NoImageMock = (props: NoImageProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default NoImageMock;
8 |
--------------------------------------------------------------------------------
/config/build/afterSign.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-var-requires,no-console */
2 | const fs = require("fs");
3 | const path = require("path");
4 |
5 | const afterSign = () => {
6 | console.log("after sign");
7 | };
8 |
9 | exports.default = afterSign;
10 |
--------------------------------------------------------------------------------
/src/common/lib/helpers/typeGuards/typeGuards.ts:
--------------------------------------------------------------------------------
1 | const isHtmlElement = (value: unknown): value is HTMLElement =>
2 | value instanceof HTMLElement;
3 |
4 | const isError = (value: unknown): value is Error => value instanceof Error;
5 |
6 | export { isHtmlElement, isError };
7 |
--------------------------------------------------------------------------------
/src/main/shared/config/config.type.ts:
--------------------------------------------------------------------------------
1 | export type AppSettings = Record;
2 |
3 | export type GameKey = "BG3";
4 |
5 | export type GameSettings = {
6 | MODS_DIRECTORY: string;
7 | MOD_SETTINGS_PATH: string;
8 | BACKUP_DIR: string;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/delete.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/index.ts:
--------------------------------------------------------------------------------
1 | export { useMutationObserver } from "./useMutationObserver";
2 |
3 | export { useOutsideClick } from "./useOutsideClick";
4 |
5 | export { useTheme } from "./useTheme";
6 |
7 | export { useWorkerManager } from "./useWorkerManager";
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Card/Card.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 |
3 | export type CardProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | children?: ReactNode;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Spinner/Spinner.type.ts:
--------------------------------------------------------------------------------
1 | export type SpinnerProps = {
2 | /**
3 | * a string that will be applied as a css class to parent element
4 | */
5 | className?: string;
6 | type?: "bars" | "oval" | "puff" | "rings" | "ripple" | "tail-spin";
7 | };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Backup/Backup.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type BackupProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: Game;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Checkbox/__mocks__/Checkbox.mock.tsx:
--------------------------------------------------------------------------------
1 | import { CheckboxProps } from "../Checkbox.type";
2 |
3 | const CheckboxMock = (props: CheckboxProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default CheckboxMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Table/Table.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 |
3 | export type TableProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | children?: ReactNode;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextArea/__mocks__/TextArea.mock.tsx:
--------------------------------------------------------------------------------
1 | import { TextAreaProps } from "../TextArea.type";
2 |
3 | const TextAreaMock = (props: TextAreaProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default TextAreaMock;
8 |
--------------------------------------------------------------------------------
/src/electron-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | import type { ElectronHandler } from "./preload";
4 |
5 | declare global {
6 | // eslint-disable-next-line no-unused-vars
7 | interface Window {
8 | electron: ElectronHandler;
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/getModInfo/getModInfo.type.ts:
--------------------------------------------------------------------------------
1 | export type ModInfo = {
2 | author?: string;
3 | fileName: string;
4 | folder?: string;
5 | md5?: string;
6 | name?: string;
7 | uuid?: string;
8 | version?: string;
9 | versionType?: string;
10 | };
11 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Container/__mocks__/Container.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ContainerProps } from "../Container.type";
2 |
3 | const ContainerMock = (props: ContainerProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default ContainerMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LazyImage/__mocks__/LazyImage.mock.tsx:
--------------------------------------------------------------------------------
1 | import { LazyImageProps } from "../LazyImage.type";
2 |
3 | const LazyImageMock = (props: LazyImageProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default LazyImageMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/MenuItem/__mocks__/MenuItem.mock.tsx:
--------------------------------------------------------------------------------
1 | import { MenuItemProps } from "../MenuItem.type";
2 |
3 | const MenuItemMock = (props: MenuItemProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default MenuItemMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextField/__mocks__/TextField.mock.tsx:
--------------------------------------------------------------------------------
1 | import { TextFieldProps } from "../TextField.type";
2 |
3 | const TextFieldMock = (props: TextFieldProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default TextFieldMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/AppNavBar/__mocks__/AppNavBar.mock.tsx:
--------------------------------------------------------------------------------
1 | import { AppNavBarProps } from "../AppNavBar.type";
2 |
3 | const AppNavBarMock = (props: AppNavBarProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default AppNavBarMock;
8 |
--------------------------------------------------------------------------------
/src/main/entities/mod/index.ts:
--------------------------------------------------------------------------------
1 | export type { ModInfo } from "./lib/helpers";
2 |
3 | export {
4 | activateMod,
5 | createModNode,
6 | createModNodeOrder,
7 | deactivateMod,
8 | getModInfoFromFile,
9 | getModInfoFromBytes,
10 | getModData,
11 | } from "./lib/helpers";
12 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./activateMod";
2 |
3 | export * from "./createModNode";
4 |
5 | export * from "./createModNodeOrder";
6 |
7 | export * from "./deactivateMod";
8 |
9 | export * from "./getModData";
10 |
11 | export * from "./getModInfo";
12 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Settings/Settings.type.ts:
--------------------------------------------------------------------------------
1 | import { GameKey } from "@main/shared/config";
2 |
3 | export type SettingsProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: GameKey;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Container/Container.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 |
3 | export type ContainerProps = {
4 | children?: ReactNode;
5 | /**
6 | * a string that will be applied as a css class to parent element
7 | */
8 | className?: string;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Text/__snapshots__/Text.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/__mocks__/GameNavBar.mock.tsx:
--------------------------------------------------------------------------------
1 | import { GameNavBarProps } from "../GameNavBar.type";
2 |
3 | const GameNavBarMock = (props: GameNavBarProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { GameNavBarMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/EmptyList/__mocks__/EmptyList.mock.tsx:
--------------------------------------------------------------------------------
1 | import { EmptyListProps } from "../EmptyList.type";
2 |
3 | const EmptyListMock = (props: EmptyListProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default EmptyListMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/error.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/config/index.ts:
--------------------------------------------------------------------------------
1 | import * as secrets from "./config";
2 |
3 | Object.entries(secrets).forEach(([key, value]) => {
4 | if (typeof value === "undefined") {
5 | throw new Error(`${key} config was not provided`);
6 | }
7 | });
8 |
9 | export * from "./config";
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Card/__snapshots__/Card.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/FakeButton/__mocks__/FakeButton.mock.tsx:
--------------------------------------------------------------------------------
1 | import { FakeButtonProps } from "../FakeButton.type";
2 |
3 | const FakeButtonMock = (props: FakeButtonProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default FakeButtonMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/IconButton/__mocks__/IconButton.mock.tsx:
--------------------------------------------------------------------------------
1 | import { IconButtonProps } from "../IconButton.type";
2 |
3 | const IconButtonMock = (props: IconButtonProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default IconButtonMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LinkButton/__mocks__/LinkButton.mock.tsx:
--------------------------------------------------------------------------------
1 | import { LinkButtonProps } from "../LinkButton.type";
2 |
3 | const LinkButtonMock = (props: LinkButtonProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default LinkButtonMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/StickyBlock/StickyBlock.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 |
3 | export type StickyBlockProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | children?: ReactNode;
9 | };
10 |
--------------------------------------------------------------------------------
/src/main/features/settings/updateGameSettingsHandler/updateGameSettingsHandler.type.ts:
--------------------------------------------------------------------------------
1 | import { GameKey } from "@main/shared/config";
2 |
3 | export type GameSettingsUpdateDto = {
4 | modSettingsFile: string;
5 | modsDirectory: string;
6 | backupDirectory: string;
7 | gameKey: GameKey;
8 | };
9 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/BackupList/__mocks__/BackupList.mock.tsx:
--------------------------------------------------------------------------------
1 | import { BackupListProps } from "../BackupList.type";
2 |
3 | const BackupListMock = (props: BackupListProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { BackupListMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/settings/ui/SettingsForm/SettingsForm.module.scss:
--------------------------------------------------------------------------------
1 | .SettingsForm {
2 | display: grid;
3 | gap: var(--spacing-8);
4 | grid-template-columns: 1fr;
5 | margin-block: var(--spacing-12) 0;
6 |
7 | .submitButton {
8 | justify-self: flex-start;
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/BaldursGate3/__mocks__/BaldursGate3.mock.tsx:
--------------------------------------------------------------------------------
1 | import { BaldursGate3Props } from "../BaldursGate3.type";
2 |
3 | const BaldursGate3Mock = (props: BaldursGate3Props) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { BaldursGate3Mock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/DataTable/__mocks__/DataTable.mock.tsx:
--------------------------------------------------------------------------------
1 | import { DataTableProps } from "../DataTable.type";
2 |
3 | const DataTableMock = (props: DataTableProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default DataTableMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Loading/Loading.type.ts:
--------------------------------------------------------------------------------
1 | import { SpinnerProps } from "../Spinner";
2 |
3 | export type LoadingProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | type?: SpinnerProps["type"];
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/StickyBlock/__mocks__/StickyBlock.mock.tsx:
--------------------------------------------------------------------------------
1 | import { StickyBlockProps } from "../StickyBlock.type";
2 |
3 | const StickyBlockMock = (props: StickyBlockProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default StickyBlockMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Table/__snapshots__/Table.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/BackupList/BackupList.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type BackupListProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: Game;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileRow/__mocks__/ModFileRow.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ModFileRowProps } from "../ModFileRow.type";
2 |
3 | const ModFileRowMock = (props: ModFileRowProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default ModFileRowMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/EmptyList/__mocks__/EmptyList.mock.tsx:
--------------------------------------------------------------------------------
1 | import { EmptyListProps } from "../EmptyList.type";
2 |
3 | const EmptyListMock = (props: EmptyListProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default EmptyListMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ModsOrder/__mocks__/ModsOrder.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ModsOrderProps } from "../ModsOrder.type";
2 |
3 | const ModsOrderMock = (props: ModsOrderProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default ModsOrderMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useTheme/__mocks__/useTheme.mock.ts:
--------------------------------------------------------------------------------
1 | import { vi } from "vitest";
2 |
3 | const useThemeMock = (themeKey: string) => ({
4 | toggleTheme: vi.fn(),
5 | setPreferredTheme: vi.fn(),
6 | theme: `mockedTheme-${themeKey}`,
7 | });
8 |
9 | export { useThemeMock };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/BackupSection/BackupSection.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type BackupSectionProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: Game;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileForm/__mocks__/ModFileForm.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ModFileFormProps } from "../ModFileForm.type";
2 |
3 | const ModFileFormMock = (props: ModFileFormProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default ModFileFormMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileList/__mocks__/ModFileList.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ModFileListProps } from "../ModFileList.type";
2 |
3 | const ModFileListMock = (props: ModFileListProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { ModFileListMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/EmptyList/EmptyList.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 |
3 | export type EmptyListProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | children?: ReactNode;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Heading/__snapshots__/Heading.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
9 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Spinner/__snapshots__/Spinner.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
10 |
11 | `;
12 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/ToggleButton/__mocks__/ToggleButton.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ToggleButtonProps } from "../ToggleButton.type";
2 |
3 | const ToggleButtonMock = (props: ToggleButtonProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default ToggleButtonMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/ModFileSection/ModFileSection.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type ModFileSectionProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: Game;
9 | };
10 |
--------------------------------------------------------------------------------
/PakReader/PackageVersion.cs:
--------------------------------------------------------------------------------
1 | namespace PakReader;
2 |
3 | public enum PackageVersion
4 | {
5 | V7 = 7, // D:OS 1
6 | V9 = 9, // D:OS 1 EE
7 | V10 = 10, // D:OS 2
8 | V13 = 13, // D:OS 2 DE
9 | V15 = 15, // BG3 EA
10 | V16 = 16, // BG3 EA Patch4
11 | V18 = 18 // BG3 Release
12 | };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileRow/ModFileRow.test.tsx:
--------------------------------------------------------------------------------
1 | import { describe, expect, it } from "vitest";
2 |
3 | import { ModFileRow } from "./ModFileRow";
4 |
5 | describe("", () => {
6 | it("should be defined", () => {
7 | expect(ModFileRow).toBeDefined();
8 | });
9 | });
10 |
--------------------------------------------------------------------------------
/src/renderer/src/features/settings/ui/SettingsForm/__mocks__/SettingsForm.mock.tsx:
--------------------------------------------------------------------------------
1 | import { SettingsFormProps } from "../SettingsForm.type";
2 |
3 | const SettingsFormMock = (props: SettingsFormProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { SettingsFormMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/BackupSection/__mocks__/BackupSection.mock.tsx:
--------------------------------------------------------------------------------
1 | import { BackupSectionProps } from "../BackupSection.type";
2 |
3 | const BackupSectionMock = (props: BackupSectionProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { BackupSectionMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/__mocks__/GameNavLink.mock.tsx:
--------------------------------------------------------------------------------
1 | import { GameNavLinkProps } from "../GameNavLink.type";
2 |
3 | const GameNavLinkMock = (props: GameNavLinkProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { GameNavLinkMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/routes/AppRoutes/AppRoutes.type.ts:
--------------------------------------------------------------------------------
1 | import { route } from "react-router-typesafe-routes/dom";
2 |
3 | export const APP_ROUTES = {
4 | BaldursGate3: route(
5 | "BG3",
6 | {},
7 | {
8 | BACKUP: route("backup"),
9 | SETTINGS: route("settings"),
10 | },
11 | ),
12 | };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Container/__snapshots__/Container.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/Backup/Backup.module.scss:
--------------------------------------------------------------------------------
1 | .Backup {
2 | align-items: center;
3 | display: flex;
4 | gap: var(--spacing-3);
5 | padding: var(--spacing-5);
6 |
7 | .copy {
8 | margin-left: auto;
9 | }
10 |
11 | &:not(:last-child) {
12 | border-bottom: none;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/SuspenseError/__mocks__/SuspenseError.mock.tsx:
--------------------------------------------------------------------------------
1 | import { SuspenseErrorProps } from "../SuspenseError.type";
2 |
3 | const SuspenseErrorMock = (props: SuspenseErrorProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default SuspenseErrorMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/__snapshots__/GameNavBar.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
9 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/InstalledModsSection/InstalledModsSection.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type InstalledModsSectionProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: Game;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/ModFileSection/__mocks__/ModFileSection.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ModFileSectionProps } from "../ModFileSection.type";
2 |
3 | const ModFileSectionMock = (props: ModFileSectionProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { ModFileSectionMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/index.ts:
--------------------------------------------------------------------------------
1 | export { AppNavBar } from "./AppNavBar";
2 |
3 | export { BackupSection } from "./BackupSection";
4 |
5 | export { InstalledModsSection } from "./InstalledModsSection";
6 |
7 | export { GameNavBar } from "./GameNavBar";
8 |
9 | export { ModFileSection } from "./ModFileSection";
10 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/SaveSettingsButton/SaveSettingsButton.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type SaveSettingsButtonProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: Game;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileButton/__mocks__/ModFileButton.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ModFileButtonProps } from "../ModFileButton.type";
2 |
3 | const ModFileButtonMock = (props: ModFileButtonProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default ModFileButtonMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledMod/__mocks__/InstalledMod.mock.tsx:
--------------------------------------------------------------------------------
1 | import { InstalledModProps } from "../InstalledMod.type";
2 |
3 | const InstalledModMock = (props: InstalledModProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export default InstalledModMock;
8 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/BaldursGate3/__snapshots__/BaldursGate3.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/StickyBlock/__snapshots__/StickyBlock.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/main/features/backup/copyBackupContentHandler/copyBackupContentHandler.ts:
--------------------------------------------------------------------------------
1 | import { readFile } from "fs/promises";
2 |
3 | const copyBackupContentHandler = async (filePath: string) => {
4 | const content = await readFile(filePath);
5 |
6 | return content.toString();
7 | };
8 |
9 | export { copyBackupContentHandler };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/BackupList/__snapshots__/BackupList.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/EmptyList/__snapshots__/EmptyList.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useMutationObserver/useMutationObserver.test.tsx:
--------------------------------------------------------------------------------
1 | import { useMutationObserver } from "./useMutationObserver";
2 |
3 | describe("useMutationObserver", () => {
4 | const hook = useMutationObserver;
5 |
6 | it("should be defined", () => {
7 | expect(hook).toBeDefined();
8 | });
9 | });
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Text/Text.module.scss:
--------------------------------------------------------------------------------
1 | .Text {
2 | --font-size: 1.4rem;
3 | --line-height: 2rem;
4 |
5 | color: inherit;
6 | font-size: var(--font-size);
7 | line-height: var(--line-height);
8 | margin: 0;
9 |
10 | &.small {
11 | --font-size: 1.2rem;
12 | --line-height: 1.8rem;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Text/Text.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 |
3 | export type TextProps = {
4 | children?: ReactNode;
5 |
6 | /**
7 | * a string that will be applied as a css class to parent element
8 | */
9 | className?: string;
10 | id?: string;
11 | size?: "regular" | "small";
12 | };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/Backup/Backup.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type BackupProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | name: string;
9 | filePath: string;
10 | game: Game;
11 | };
12 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/RestoreDefaultSettings/RestoreDefaultSettings.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type RestoreDefaultSettingsProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: Game;
9 | };
10 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/copy.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/appPaths/appPaths.ts:
--------------------------------------------------------------------------------
1 | import path from "path";
2 |
3 | const src = path.resolve(__dirname, "../../../../../");
4 | const main = path.join(src, "main");
5 | const renderer = path.join(src, "renderer");
6 |
7 | const appPaths = {
8 | src,
9 | main,
10 | renderer,
11 | };
12 |
13 | export { appPaths };
14 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LinkButton/__snapshots__/LinkButton.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
10 | `;
11 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/DataTable/DataTable.type.ts:
--------------------------------------------------------------------------------
1 | import { ColumnDef } from "@tanstack/react-table";
2 |
3 | export type DataTableProps = {
4 | columns: ColumnDef[];
5 | /**
6 | * a string that will be applied as a css class to parent element
7 | */
8 | className?: string;
9 | data: Array;
10 | };
11 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Search/Search.module.scss:
--------------------------------------------------------------------------------
1 | @import "../../styles/input-base";
2 | @import "../../styles/vars";
3 |
4 | .Search {
5 | @extend %input-base;
6 |
7 | .container {
8 | input {
9 | cursor: pointer;
10 | }
11 | }
12 |
13 | .container:focus-visible {
14 | @include focus-visible;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LinkButton/LinkButton.module.scss:
--------------------------------------------------------------------------------
1 | @use "../Button/Button.module.scss";
2 | @use "../IconButton/IconButton.module.scss";
3 |
4 | .LinkButton {
5 | text-decoration: none;
6 |
7 | &.button {
8 | @extend %button;
9 |
10 | gap: 10px;
11 | }
12 |
13 | &.icon {
14 | @extend %icon-button;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/setupTests.ts:
--------------------------------------------------------------------------------
1 | import { cleanup } from "@testing-library/react";
2 | import { afterEach, vi } from "vitest";
3 | import "@testing-library/jest-dom/vitest";
4 | import "@testing-library/jest-dom";
5 |
6 | // runs a cleanup after each test case (e.g. clearing jsdom)
7 | afterEach(() => {
8 | cleanup();
9 |
10 | vi.resetAllMocks();
11 | });
12 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/MenuItem/__snapshots__/MenuItem.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
11 |
12 | `;
13 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/easings.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["easings.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"easings.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/SaveSettingsButton/__mocks__/SaveSettingsButton.mock.tsx:
--------------------------------------------------------------------------------
1 | import { SaveSettingsButtonProps } from "../SaveSettingsButton.type";
2 |
3 | const SaveSettingsButtonMock = (props: SaveSettingsButtonProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { SaveSettingsButtonMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledModsList/__mocks__/InstalledModsList.mock.tsx:
--------------------------------------------------------------------------------
1 | import { InstalledModsListProps } from "../InstalledModsList.type";
2 |
3 | const InstalledModsListMock = (props: InstalledModsListProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { InstalledModsListMock };
8 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/1-Bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: You're having technical issues. 🐞
4 | labels: "bug"
5 | ---
6 |
7 | ## Your Environment
8 |
9 |
10 |
11 | - Manager Version :
12 | - Link to problem mod :
13 | - Operating System and version :
14 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/opacity.tokens.css:
--------------------------------------------------------------------------------
1 | :root {
2 | /**
3 | * @tokens Opacities
4 | * @presenter Opacity
5 | */
6 | --opacity-1: 0.1;
7 | --opacity-2: 0.2;
8 | --opacity-3: 0.3;
9 | --opacity-4: 0.4;
10 | --opacity-5: 0.5;
11 | --opacity-6: 0.6;
12 | --opacity-7: 0.7;
13 | --opacity-8: 0.8;
14 | --opacity-9: 0.9;
15 | }
16 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/FakeButton/__snapshots__/FakeButton.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
12 | `;
13 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/InstalledModsSection/__mocks__/InstalledModsSection.mock.tsx:
--------------------------------------------------------------------------------
1 | import { InstalledModsSectionProps } from "../InstalledModsSection.type";
2 |
3 | const InstalledModsSectionMock = (props: InstalledModsSectionProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { InstalledModsSectionMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/opacity.tokens.scss:
--------------------------------------------------------------------------------
1 | :root {
2 |
3 | /**
4 | * @tokens Opacities
5 | * @presenter Opacity
6 | */
7 | --opacity-1: 0.1;
8 | --opacity-2: 0.2;
9 | --opacity-3: 0.3;
10 | --opacity-4: 0.4;
11 | --opacity-5: 0.5;
12 | --opacity-6: 0.6;
13 | --opacity-7: 0.7;
14 | --opacity-8: 0.8;
15 | --opacity-9: 0.9;
16 | }
17 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/grid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Link/__snapshots__/Link.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
12 | `;
13 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/InstalledModsSection/__snapshots__/InstalledModsSection.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
10 | `;
11 |
--------------------------------------------------------------------------------
/.versionrc.js:
--------------------------------------------------------------------------------
1 | const electronBuilderJson = {
2 | filename: "./electron-builder.json",
3 | updater: require("./versionBumper.js"),
4 | };
5 |
6 | const mainPackageJson = {
7 | filename: "./package.json",
8 | type: "json",
9 | };
10 |
11 | module.exports = {
12 | bumpFiles: [mainPackageJson, electronBuilderJson],
13 | packageFiles: [mainPackageJson],
14 | };
15 |
--------------------------------------------------------------------------------
/config/build/beforeBuild.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-console,@typescript-eslint/no-var-requires */
2 | const fs = require("fs");
3 | const path = require("path");
4 |
5 | const beforeBuild = () => {
6 | console.log("before build")
7 | const buildDir = path.resolve(__dirname, "../../dist");
8 |
9 | fs.rmSync(buildDir);
10 | };
11 |
12 | exports.default = beforeBuild;
13 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/spacings.tokens.scss:
--------------------------------------------------------------------------------
1 | /* stylelint-disable */
2 |
3 | :root {
4 | /**
5 | * @tokens Spacings
6 | * @presenter Spacing
7 | */
8 | @for $i from 1 through 10 {
9 | --spacing-#{$i}: #{$i * 0.2}rem;
10 | }
11 | --spacing-11: 2.4rem;
12 | --spacing-12: 3.2rem;
13 | --spacing-13: 4.8rem;
14 | --spacing-14: 6.4rem;
15 | }
16 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/AppNavBar/AppNavBar.module.scss:
--------------------------------------------------------------------------------
1 | .AppNavBar {
2 | --border-color: var(--primary-2);
3 |
4 | @media (prefers-color-scheme: light) {
5 | --border-color: var(--primary-3);
6 | }
7 |
8 | border-right: 1px solid var(--border-color);
9 | display: flex;
10 | flex: 1;
11 | flex-direction: column;
12 | padding: 1rem 0.5rem;
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/features/settings/getGameSettingsHandler/getGameSettingsHandler.ts:
--------------------------------------------------------------------------------
1 | import { GameKey } from "@main/shared/config";
2 | import { getGameSettings } from "@main/shared/lib/helpers";
3 |
4 | const getGameSettingsHandler = (gameKey: GameKey) => {
5 | const settings = getGameSettings(gameKey);
6 |
7 | return settings;
8 | };
9 |
10 | export { getGameSettingsHandler };
11 |
--------------------------------------------------------------------------------
/src/main/controllers/backup/validation.ts:
--------------------------------------------------------------------------------
1 | import z from "zod";
2 |
3 | import { gameKeyValidation } from "@main/shared/lib/helpers/validation";
4 |
5 | const stringValidation = z.string();
6 |
7 | const restoreFromFileValidation = z.object({
8 | file: stringValidation,
9 | gameKey: gameKeyValidation,
10 | });
11 |
12 | export { restoreFromFileValidation, stringValidation };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/GameNavLink.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 | import { LinkProps } from "react-router-dom";
3 |
4 | export type GameNavLinkProps = {
5 | children?: ReactNode;
6 | /**
7 | * a string that will be applied as a css class to parent element
8 | */
9 | className?: string;
10 | to: LinkProps["to"];
11 | };
12 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/RestoreDefaultSettings/__mocks__/RestoreDefaultSettings.mock.tsx:
--------------------------------------------------------------------------------
1 | import { RestoreDefaultSettingsProps } from "../RestoreDefaultSettings.type";
2 |
3 | const RestoreDefaultSettingsMock = (props: RestoreDefaultSettingsProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { RestoreDefaultSettingsMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/__mocks__/ToggleActiveModButton.mock.tsx:
--------------------------------------------------------------------------------
1 | import { ToggleActiveModButtonProps } from "../ToggleActiveModButton.type";
2 |
3 | const ToggleActiveModButtonMock = (props: ToggleActiveModButtonProps) => (
4 | {JSON.stringify(props)}
5 | );
6 |
7 | export { ToggleActiveModButtonMock };
8 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/EmptyList/EmptyList.type.ts:
--------------------------------------------------------------------------------
1 | import { ChangeEventHandler } from "react";
2 |
3 | export type EmptyListProps = {
4 | acceptedFileTypes: string[];
5 | /**
6 | * a string that will be applied as a css class to parent element
7 | */
8 | className?: string;
9 | error?: string;
10 | onFilesSelect: ChangeEventHandler;
11 | };
12 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/brands/facebook.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/delete-forever.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LazyImage/LazyImage.type.ts:
--------------------------------------------------------------------------------
1 | import { ImgHTMLAttributes, ReactNode, RefObject } from "react";
2 |
3 | export type LazyImageProps = ImgHTMLAttributes & {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | imageRef?: RefObject;
9 | children?: ReactNode;
10 | };
11 |
--------------------------------------------------------------------------------
/src/main/controllers/settings/validation.ts:
--------------------------------------------------------------------------------
1 | import z from "zod";
2 |
3 | import { gameKeyValidation } from "@main/shared/lib/helpers/validation";
4 |
5 | const updateGameSettingsValidation = z.object({
6 | backupDirectory: z.string(),
7 | modSettingsFile: z.string(),
8 | modsDirectory: z.string(),
9 | gameKey: gameKeyValidation,
10 | });
11 |
12 | export { updateGameSettingsValidation };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileRow/ModFileRow.module.scss:
--------------------------------------------------------------------------------
1 | .ModFileRow {
2 | align-items: center;
3 | display: grid;
4 | font-size: 1.6rem;
5 | gap: 1%;
6 | grid-template-columns: 44% 34% 20%;
7 | white-space: nowrap;
8 |
9 | + .ModFileRow {
10 | border-top: none;
11 | }
12 |
13 | span {
14 | overflow: hidden;
15 | text-overflow: ellipsis;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/search.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Card/Card.tsx:
--------------------------------------------------------------------------------
1 | import { classNames } from "@renderer/shared/lib/helpers";
2 |
3 | import css from "./Card.module.scss";
4 | import { CardProps } from "./Card.type";
5 |
6 | const Card = ({ className, children }: CardProps) => (
7 |
8 | {children}
9 |
10 | );
11 |
12 | export default Card;
13 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/BackupSection/__snapshots__/BackupSection.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
14 | `;
15 |
--------------------------------------------------------------------------------
/scripts/clean.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 | const { rimraf } = require("rimraf");
4 |
5 | const buildDir = path.resolve(__dirname, "../dist");
6 | const dotnetBuildDir = path.resolve(__dirname, "../PakReader/bin");
7 |
8 | if (fs.existsSync(buildDir)) {
9 | rimraf(buildDir);
10 | }
11 |
12 | if (fs.existsSync(dotnetBuildDir)) {
13 | rimraf(dotnetBuildDir);
14 | }
15 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/styles/_card-base.scss:
--------------------------------------------------------------------------------
1 | %card-base {
2 | @layer base {
3 | --background: var(--surface-1);
4 | --border-color: var(--primary-2);
5 |
6 | @media (prefers-color-scheme: light) {
7 | --border-color: var(--primary-3);
8 | }
9 |
10 | background-color: var(--background);
11 | border: 1px solid var(--border-color);
12 | padding: 1rem;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/MenuItem/MenuItem.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 |
3 | export type MenuItemProps = {
4 | children?: ReactNode;
5 | /**
6 | * a string that will be applied as a css class to parent element
7 | */
8 | className?: string;
9 | isSelected?: boolean;
10 | onClick?: (value?: T) => void;
11 | onFocus?: (value?: T) => void;
12 | value?: T;
13 | };
14 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/NoImage/__snapshots__/NoImage.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
9 |
14 |
15 |
16 | `;
17 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/DataTable/__snapshots__/DataTable.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
15 | `;
16 |
--------------------------------------------------------------------------------
/src/common/lib/helpers/delay/delay.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * a function returning a promise which resolves
3 | * after a passed timout in milliseconds
4 | * @param timeout - a timeout before promise resolves
5 | * @example
6 | * delay(500);
7 | * await delay(700);
8 | */
9 | const delay = (timeout: number) =>
10 | new Promise((resolve) => {
11 | setTimeout(resolve, timeout);
12 | });
13 |
14 | export { delay };
15 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ModsOrder/ModsOrder.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | import { InstalledMod } from "../InstalledModsList/InstalledModsList.type";
4 |
5 | export type ModsOrderProps = {
6 | /**
7 | * a string that will be applied as a css class to parent element
8 | */
9 | className?: string;
10 | game: Game;
11 | mods?: InstalledMod[];
12 | };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/restore.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/storybookDecorators/storybookDecorators.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable import/no-unused-modules */
2 | import { MemoryRouter as Router } from "react-router-dom";
3 |
4 | type StoryFunc = () => T;
5 |
6 | const withRouter = (Story: StoryFunc) => (
7 |
8 |
9 |
10 | );
11 |
12 | export { withRouter };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Table/Table.tsx:
--------------------------------------------------------------------------------
1 | import { classNames } from "@renderer/shared/lib/helpers";
2 |
3 | import css from "./Table.module.scss";
4 | import { TableProps } from "./Table.type";
5 |
6 | const Table = ({ className, children }: TableProps) => (
7 |
10 | );
11 |
12 | export default Table;
13 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/ToggleButton/ToggleButton.type.ts:
--------------------------------------------------------------------------------
1 | import { MouseEventHandler, ReactNode } from "react";
2 |
3 | export type ToggleButtonProps = {
4 | active?: boolean;
5 | children?: ReactNode;
6 | /**
7 | * a string that will be applied as a css class to parent element
8 | */
9 | className?: string;
10 | disabled?: boolean;
11 | onClick?: MouseEventHandler;
12 | };
13 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export { appPaths } from "./appPaths";
2 |
3 | export { ipcRequestHandler } from "./ipcRequestHandler";
4 |
5 | export { getGameSettings } from "./getGameSettings";
6 |
7 | export { netConnection } from "./netConnection";
8 |
9 | export { resolveHtmlPath } from "./resolveHtmlPath";
10 |
11 | export { WorkerManager } from "./workerManager";
12 |
13 | export { t } from "./trpc";
14 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/ToggleActiveModButton.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type ToggleActiveModButtonProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | fileName: string;
9 | game: Game;
10 | isActive: boolean;
11 | uuid: string | undefined;
12 | };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Backup/__snapshots__/Backup.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
9 |
13 | Backups
14 |
15 |
16 |
17 | `;
18 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/visibility.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/index.ts:
--------------------------------------------------------------------------------
1 | export { classNames } from "./classNames";
2 |
3 | export { compose } from "./compose";
4 |
5 | export { delay } from "./delay";
6 |
7 | export { getNodeText } from "./getNodeText";
8 |
9 | export { lazyImport } from "./lazyImport";
10 |
11 | export { mergeRefs } from "./mergeRefs";
12 |
13 | export { trpcClient, trpc } from "./trpc";
14 |
15 | export * from "./typeGuards";
16 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LazyImage/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | .def {
3 | height: 200px;
4 | width: 150px;
5 | }
6 |
7 | .grid {
8 | display: grid;
9 | gap: 2rem;
10 | grid-auto-rows: 200px;
11 | grid-template-columns: repeat(2, 300px);
12 | }
13 |
14 | .skeleton {
15 | --stop-hue: 53;
16 | --sk-color-1: var(--primary-4);
17 | --sk-color-2: var(--primary-5);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/config/build/afterAllArtifactBuild.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-var-requires,no-console */
2 | const fs = require("fs");
3 | const path = require("path");
4 | const { promisify } = require("util");
5 | const exec = promisify(require("child_process").exec);
6 |
7 | const afterAllArtifactBuild = (context) => {
8 | console.log("after all artifact build");
9 | };
10 |
11 | exports.default = afterAllArtifactBuild;
12 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileForm/ModFileForm.type.ts:
--------------------------------------------------------------------------------
1 | import { RouterOutputs } from "@main/shared/types";
2 | import { Game } from "@renderer/shared/types";
3 |
4 | export type ModFileFormProps = {
5 | /**
6 | * a string that will be applied as a css class to parent element
7 | */
8 | className?: string;
9 | game: Game;
10 | };
11 |
12 | export type ReadModResult = RouterOutputs["mod"]["readMods"];
13 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/delay/delay.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * a function returning a promise which resolves
3 | * after a passed timout in milliseconds
4 | * @param timeout - a timeout before promise resolves
5 | * @example
6 | * delay(500);
7 | * await delay(700);
8 | */
9 | const delay = (timeout: number) =>
10 | new Promise((resolve) => {
11 | setTimeout(resolve, timeout);
12 | });
13 |
14 | export { delay };
15 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/FakeButton/FakeButton.type.ts:
--------------------------------------------------------------------------------
1 | import { MouseEvent, ReactNode } from "react";
2 |
3 | export type FakeButtonProps = {
4 | ariaLabel?: string;
5 | ariaLabelledby?: string;
6 | autoFocus?: boolean;
7 | /**
8 | * a string that will be applied as a css class to parent element
9 | */
10 | className?: string;
11 | children?: ReactNode;
12 | onClick?: (event: MouseEvent) => void;
13 | };
14 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextArea/TextArea.module.scss:
--------------------------------------------------------------------------------
1 | @import "../../styles/input-base";
2 |
3 | .TextArea {
4 | @extend %input-base;
5 |
6 | .counter {
7 | @extend %input-base, .label;
8 |
9 | margin-inline-start: auto;
10 | width: fit-content;
11 | }
12 |
13 | .container {
14 | height: 100%;
15 | }
16 |
17 | .labelBlock {
18 | align-items: baseline;
19 | display: flex;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileRow/ModFileRow.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type ModFileRowProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: Game;
9 | modName?: string;
10 | modVersion?: string | number | null;
11 | currentModVersion?: string | number;
12 | modFilePath: string;
13 | };
14 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileButton/ModFileButton.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type ModFileButtonProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: Game;
9 | modPath: string;
10 | currentModVersion: string | number | undefined;
11 | modVersion: string | number | null | undefined;
12 | };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/ToggleButton/__snapshots__/ToggleButton.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
14 |
15 | `;
16 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/__snapshots__/GameNavLink.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
15 | `;
16 |
--------------------------------------------------------------------------------
/PakReader/PackageInfo.cs:
--------------------------------------------------------------------------------
1 | namespace PakReader;
2 |
3 | public class PackageInfo
4 | {
5 | public PackageInfo(string name, Stream input)
6 | {
7 | using (MemoryStream ms = new MemoryStream())
8 | {
9 | input.CopyTo(ms);
10 | Data = ms.ToArray();
11 | }
12 |
13 | Name = name;
14 | }
15 |
16 | public byte[] Data { get; set; }
17 | public string Name { get; set; }
18 | }
19 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/Error/Error.module.scss:
--------------------------------------------------------------------------------
1 | .Error {
2 | --error-color: var(--danger-4);
3 |
4 | color: var(--error-color);
5 |
6 | @media (prefers-color-scheme: light) {
7 | --error-color: var(--danger-7);
8 | }
9 |
10 | .header {
11 | align-items: center;
12 | display: flex;
13 | gap: 1rem;
14 | margin-bottom: 2rem;
15 | }
16 |
17 | svg {
18 | fill: var(--error-color);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/NoImage/NoImage.module.scss:
--------------------------------------------------------------------------------
1 | .NoImage {
2 | --hue: 275;
3 |
4 | background-color: var(--primary-4);
5 | display: grid;
6 | grid-template-columns: 1fr;
7 | height: 100%;
8 | padding: 1rem;
9 | place-items: center;
10 | width: 100%;
11 |
12 | .cross {
13 | aspect-ratio: 1/1;
14 | fill: var(--primary-8);
15 | max-width: 10rem;
16 | min-width: 1rem;
17 | opacity: 0.6;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/features/mod/index.ts:
--------------------------------------------------------------------------------
1 | export { deleteModsHandler } from "./deleteModsHandler";
2 |
3 | export { getInstalledModsHandler } from "./getInstalledModsHandler";
4 |
5 | export { installModsHandler } from "./installModsHandler";
6 |
7 | export { readModsHandler } from "./readModsHandler";
8 |
9 | export { reorderActiveModsHandler } from "./reorderActiveModsHandler";
10 |
11 | export { toggleActiveModHandler } from "./toggleActiveModHandler";
12 |
--------------------------------------------------------------------------------
/src/main/router.ts:
--------------------------------------------------------------------------------
1 | import {
2 | backupController,
3 | modController,
4 | settingsController,
5 | } from "./controllers";
6 | import { t } from "./shared/lib/helpers";
7 |
8 | const appRouter = t.router({
9 | backup: t.router({ ...backupController }),
10 | mod: t.router({ ...modController }),
11 | settings: t.router({ ...settingsController }),
12 | });
13 |
14 | export type AppRouter = typeof appRouter;
15 |
16 | export { appRouter };
17 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileForm/ModFileForm.module.scss:
--------------------------------------------------------------------------------
1 | .ModFileForm {
2 | display: flex;
3 | flex-direction: column;
4 | min-height: 75dvh;
5 |
6 | &.isLoading {
7 | cursor: progress;
8 | }
9 |
10 | .header {
11 | font-weight: 500;
12 |
13 | *:last-child {
14 | pointer-events: none;
15 | visibility: hidden;
16 | }
17 | }
18 |
19 | .clear {
20 | margin-top: 2rem;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/renderer/src/features/settings/ui/SettingsForm/SettingsForm.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | export type SettingsFormProps = {
4 | /**
5 | * a string that will be applied as a css class to parent element
6 | */
7 | className?: string;
8 | game: Game;
9 | };
10 |
11 | export type SettingsFormValues = {
12 | modSettingsFile: string;
13 | modsDirectory: string;
14 | backupDirectory: string;
15 | };
16 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Container/Container.tsx:
--------------------------------------------------------------------------------
1 | import { classNames } from "@renderer/shared/lib/helpers";
2 |
3 | import css from "./Container.module.scss";
4 | import { ContainerProps } from "./Container.type";
5 |
6 | const Container = ({ children, className }: ContainerProps) => (
7 |
8 | {children}
9 |
10 | );
11 |
12 | export default Container;
13 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/createModNodeOrder/createModNodeOrder.ts:
--------------------------------------------------------------------------------
1 | import { ModInfo } from "../getModInfo";
2 |
3 | const createModNodeOrder = (mod: ModInfo) => {
4 | const template = `
5 |
6 |
7 |
8 |
9 | `;
10 |
11 | return template;
12 | };
13 |
14 | export { createModNodeOrder };
15 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Loading/__snapshots__/Loading.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
7 |
11 |
16 |
17 |
18 | `;
19 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledMod/InstalledMod.type.ts:
--------------------------------------------------------------------------------
1 | import { RouterOutputs } from "@main/shared/types";
2 | import { Game } from "@renderer/shared/types";
3 |
4 | export type InstalledModProps = {
5 | /**
6 | * a string that will be applied as a css class to parent element
7 | */
8 | className?: string;
9 | game: Game;
10 | mod: RouterOutputs["mod"]["getInstalledMods"]["installedMods"][number];
11 | position: number;
12 | };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LazyImage/__snapshots__/LazyImage.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
9 |
12 |
17 |
18 |
19 | `;
20 |
--------------------------------------------------------------------------------
/src/main/features/backup/index.ts:
--------------------------------------------------------------------------------
1 | export { createBackupHandler } from "./createBackupHandler";
2 |
3 | export { copyBackupContentHandler } from "./copyBackupContentHandler";
4 |
5 | export { deleteBackupHandler } from "./deleteBackupHandler";
6 |
7 | export { getBackupsHandler } from "./getBackupsHandler";
8 |
9 | export { restoreDefaultSettingsHandler } from "./restoreDefaultSettingsHandler";
10 |
11 | export { restoreFromFileHandler } from "./restoreFromFileHandler";
12 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/IconButton/__snapshots__/IconButton.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
16 |
17 | `;
18 |
--------------------------------------------------------------------------------
/src/main/features/backup/restoreDefaultSettingsHandler/restoreDefaultSettingsHandler.ts:
--------------------------------------------------------------------------------
1 | import { saveModSettings } from "@main/entities/modSettingsFile";
2 | import { GameKey } from "@main/shared/config";
3 |
4 | import { defaults } from "./defaults";
5 |
6 | const restoreDefaultSettingsHandler = async (gameKey: GameKey) => {
7 | const content = defaults[gameKey];
8 |
9 | await saveModSettings(content, gameKey);
10 | };
11 |
12 | export { restoreDefaultSettingsHandler };
13 |
--------------------------------------------------------------------------------
/src/renderer/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Electron
6 |
7 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/main/entities/mod/lib/helpers/getModData/getModData.ts:
--------------------------------------------------------------------------------
1 | import { memoizeTtl } from "@common/lib";
2 |
3 | import { getPakFileDataFromArchive } from "./lib";
4 |
5 | const getModData = async (filePath: string) => {
6 | const pakFileData = await getPakFileDataFromArchive(filePath);
7 | const result = { filePath, pakFileData };
8 |
9 | return result;
10 | };
11 |
12 | const getModDataMemoized = memoizeTtl(getModData);
13 |
14 | export { getModDataMemoized as getModData };
15 |
--------------------------------------------------------------------------------
/src/main/features/mod/toggleActiveModHandler/lib/helpers/isActiveMod/isActiveMod.ts:
--------------------------------------------------------------------------------
1 | import { getCurrentSettings } from "@main/entities/modSettingsFile";
2 | import { GameKey } from "@main/shared/config";
3 |
4 | const isActiveMod = async (modUUID: string, key: GameKey) => {
5 | const settings = await getCurrentSettings(key);
6 | const attribute = settings(`#ModOrder children [value="${modUUID}"]`);
7 |
8 | return !!attribute.length;
9 | };
10 |
11 | export { isActiveMod };
12 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Loading/Loading.test.tsx:
--------------------------------------------------------------------------------
1 | import { render } from "@testing-library/react";
2 |
3 | import Loading from "./Loading";
4 |
5 | describe("", () => {
6 | const Component = ;
7 |
8 | it("should be defined", () => {
9 | expect(Loading).toBeDefined();
10 | });
11 |
12 | it("should match the snapshot", () => {
13 | const { container } = render(Component);
14 |
15 | expect(container).toMatchSnapshot();
16 | });
17 | });
18 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Select/Select.module.scss:
--------------------------------------------------------------------------------
1 | @import "../../styles/input-base";
2 | @import "../../styles/vars";
3 |
4 | .Select {
5 | @extend %input-base;
6 |
7 | .container {
8 | svg {
9 | transition: transform 250ms ease-in-out;
10 | }
11 |
12 | &[aria-expanded="true"] {
13 | svg {
14 | transform: rotateX(180deg);
15 | }
16 | }
17 | }
18 |
19 | .container:focus-visible {
20 | @include focus-visible;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/shared/types/api.ts:
--------------------------------------------------------------------------------
1 | import { inferReactQueryProcedureOptions } from "@trpc/react-query";
2 | import { inferRouterInputs, inferRouterOutputs } from "@trpc/server";
3 |
4 | import { AppRouter } from "@main/router";
5 |
6 | type ReactQueryOptions = inferReactQueryProcedureOptions;
7 |
8 | type RouterInputs = inferRouterInputs;
9 |
10 | type RouterOutputs = inferRouterOutputs;
11 |
12 | export type { ReactQueryOptions, RouterInputs, RouterOutputs };
13 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledModsList/InstalledModsList.type.ts:
--------------------------------------------------------------------------------
1 | import { RouterOutputs } from "@main/shared/types";
2 | import { Game } from "@renderer/shared/types";
3 |
4 | export type InstalledModsListProps = {
5 | /**
6 | * a string that will be applied as a css class to parent element
7 | */
8 | className?: string;
9 | game: Game;
10 | };
11 |
12 | export type InstalledMod =
13 | RouterOutputs["mod"]["getInstalledMods"]["installedMods"][number];
14 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/StickyBlock/StickyBlock.tsx:
--------------------------------------------------------------------------------
1 | import { classNames } from "@renderer/shared/lib/helpers";
2 |
3 | import css from "./StickyBlock.module.scss";
4 | import { StickyBlockProps } from "./StickyBlock.type";
5 |
6 | const StickyBlock = ({ className, children }: StickyBlockProps) => (
7 |
11 | {children}
12 |
13 | );
14 |
15 | export default StickyBlock;
16 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/spinners/eclipse-1s-200px.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Button/__snapshots__/Button.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
19 |
20 | `;
21 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/InstalledMod/InstalledMod.module.scss:
--------------------------------------------------------------------------------
1 | .InstalledMod {
2 | align-items: center;
3 | counter-increment: modOrder;
4 | display: grid;
5 | font-size: 1.6rem;
6 | gap: 1%;
7 | grid-template-columns: 5% 40% 24% 20% 6%;
8 | white-space: nowrap;
9 |
10 | + .InstalledMod {
11 | border-top: none;
12 | }
13 |
14 | span {
15 | overflow: hidden;
16 | text-overflow: ellipsis;
17 | }
18 |
19 | .delete {
20 | aspect-ratio: 1;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/init.ts:
--------------------------------------------------------------------------------
1 | import { verifyModSettings } from "@main/entities/modSettingsFile";
2 | import { createBackupHandler, getBackupsHandler } from "@main/features/backup";
3 | import { createBackupDir } from "@main/shared/config";
4 |
5 | const init = async () => {
6 | await verifyModSettings("BG3");
7 |
8 | createBackupDir();
9 |
10 | const backupFiles = await getBackupsHandler("BG3");
11 |
12 | if (!backupFiles.length) {
13 | await createBackupHandler("BG3");
14 | }
15 | };
16 |
17 | export { init };
18 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/EmptyList/EmptyList.module.scss:
--------------------------------------------------------------------------------
1 | @layer EmptyList, base;
2 |
3 | .EmptyList {
4 | display: grid;
5 | flex: 1;
6 | place-content: center;
7 |
8 | @layer EmptyList {
9 | border-top: none;
10 | }
11 |
12 | .header {
13 | margin-bottom: 2rem;
14 | place-self: center;
15 | }
16 |
17 | .button {
18 | place-self: center;
19 | }
20 |
21 | > input {
22 | display: none;
23 | }
24 |
25 | .error {
26 | padding-bottom: 5rem;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/styles/_vars.scss:
--------------------------------------------------------------------------------
1 | @mixin focus-visible {
2 | outline: 0.2rem solid var(--warning-6);
3 | outline-offset: 0.2rem;
4 | transition: outline-offset 250ms ease-out;
5 |
6 | &:active {
7 | outline-offset: 0;
8 | }
9 | }
10 |
11 | @mixin theme($value: "dark") {
12 | @if $value == "light" {
13 | @at-root [data-theme="light"] & {
14 | @content;
15 | }
16 | } @else if $value == "dark" {
17 | @at-root [data-theme="dark"] & {
18 | @content;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/AppNavBar/__snapshots__/AppNavBar.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
19 | `;
20 |
--------------------------------------------------------------------------------
/src/main/features/mod/installModsHandler/installModsHandler.ts:
--------------------------------------------------------------------------------
1 | import { GameKey } from "@main/shared/config";
2 |
3 | import { extractContents } from "./lib/helpers";
4 |
5 | const installModsHandler = async (filePaths: string[], key: GameKey) => {
6 | try {
7 | const extractResults = await Promise.all(
8 | filePaths.map((file) => extractContents(file, key)),
9 | );
10 |
11 | return extractResults;
12 | } catch (e) {
13 | console.error(e);
14 | }
15 | };
16 |
17 | export { installModsHandler };
18 |
--------------------------------------------------------------------------------
/src/main/features/backup/restoreFromFileHandler/restoreFromFileHandler.ts:
--------------------------------------------------------------------------------
1 | import { readFile } from "fs/promises";
2 |
3 | import { saveModSettings } from "@main/entities/modSettingsFile";
4 |
5 | import { RestoreFromFileDto } from "./restoreFromFileHandler.type";
6 |
7 | const restoreFromFileHandler = async ({
8 | file,
9 | gameKey,
10 | }: RestoreFromFileDto) => {
11 | const content = await readFile(file);
12 |
13 | await saveModSettings(content.toString(), gameKey);
14 | };
15 |
16 | export { restoreFromFileHandler };
17 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/arrow-down.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/icons/tick.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Spinner/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | display: grid;
3 | grid-auto-rows: 200px;
4 | grid-template-columns: repeat(4, 200px); /* stylelint-disable-line */
5 |
6 | .loader {
7 | align-items: center;
8 | display: flex;
9 | flex-direction: column;
10 | justify-content: center;
11 | padding: 20px;
12 |
13 | p {
14 | color: #ffffff;
15 | margin-bottom: 10px;
16 | }
17 |
18 | svg {
19 | height: 100%;
20 | width: 100%;
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/shared/types/types.ts:
--------------------------------------------------------------------------------
1 | export type IpcRequest = {
2 | body: any;
3 | headers: any;
4 | method: string;
5 | url: string;
6 | };
7 |
8 | export type IpcResponse = {
9 | body: any;
10 | headers: any;
11 | status: number;
12 | };
13 |
14 | export interface IElectronAPI {
15 | node: () => string;
16 | chrome: () => string;
17 | electron: () => string;
18 | trpc: (req: IpcRequest) => Promise;
19 | }
20 |
21 | declare global {
22 | interface Window {
23 | appApi: IElectronAPI;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/EmptyList/EmptyList.tsx:
--------------------------------------------------------------------------------
1 | import { classNames } from "@renderer/shared/lib/helpers";
2 | import { Card } from "@renderer/shared/ui";
3 |
4 | import css from "./EmptyList.module.scss";
5 | import { EmptyListProps } from "./EmptyList.type";
6 |
7 | const EmptyList = ({ className, children }: EmptyListProps) => (
8 |
12 | {children}
13 |
14 | );
15 |
16 | export { EmptyList };
17 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/resolveHtmlPath/resolveHtmlPath.ts:
--------------------------------------------------------------------------------
1 | import path from "path";
2 | import { URL } from "url";
3 |
4 | const resolveHtmlPath = (htmlFileName: string) => {
5 | if (process.env.NODE_ENV === "development") {
6 | const port = process.env.PORT || 1212;
7 | const url = new URL(`http://localhost:${port}`);
8 |
9 | url.pathname = htmlFileName;
10 |
11 | return url.href;
12 | }
13 |
14 | return `file://${path.resolve(__dirname, "../renderer/", htmlFileName)}`;
15 | };
16 |
17 | export { resolveHtmlPath };
18 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Checkbox/Checkbox.test.tsx:
--------------------------------------------------------------------------------
1 | import { render } from "@testing-library/react";
2 | import { describe, expect, it } from "vitest";
3 |
4 | import { Checkbox } from "./Checkbox";
5 |
6 | describe("", () => {
7 | const Component = ;
8 |
9 | it("should be defined", () => {
10 | expect(Checkbox).toBeDefined();
11 | });
12 |
13 | it("should match the snapshot", () => {
14 | const { container } = render(Component);
15 |
16 | expect(container).toMatchSnapshot();
17 | });
18 | });
19 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/LinkButton/LinkButton.type.ts:
--------------------------------------------------------------------------------
1 | import { AnchorHTMLAttributes } from "react";
2 |
3 | import { ButtonProps } from "../Button";
4 |
5 | type AnchorAttributes = AnchorHTMLAttributes;
6 |
7 | export type LinkButtonProps = AnchorAttributes &
8 | Pick & {
9 | as?: LinkButtonType;
10 | /**
11 | * a string that will be applied as a css class to parent element
12 | */
13 | className?: string;
14 | };
15 |
16 | export type LinkButtonType = "button" | "icon";
17 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/spinners/rolling-1s-200px.svg:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/getNodeText/getNodeText.ts:
--------------------------------------------------------------------------------
1 | import { ReactElement, ReactNode } from "react";
2 |
3 | const getNodeText = (node: ReactNode): number | string => {
4 | if (typeof node === "string" || typeof node === "number") {
5 | return node;
6 | }
7 |
8 | if (node instanceof Array) {
9 | return node.map(getNodeText).join("");
10 | }
11 |
12 | if (typeof node === "object" && node) {
13 | return getNodeText((node as ReactElement).props.children);
14 | }
15 |
16 | return "";
17 | };
18 |
19 | export { getNodeText };
20 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/hooks/useWorkerManager/useWorkerManager.ts:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 |
3 | import WorkerManager, { WorkerFactory } from "./workerManager";
4 |
5 | const useWorkerManager = (workerFactory: WorkerFactory) => {
6 | const [manager] = useState(() => new WorkerManager(workerFactory));
7 |
8 | useEffect(() => {
9 | manager.init();
10 |
11 | return () => {
12 | manager.destoy();
13 | };
14 | }, [manager]);
15 |
16 | return { manager };
17 | };
18 |
19 | export { useWorkerManager };
20 |
--------------------------------------------------------------------------------
/versionBumper.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-var-requires,import/group-exports,no-unsafe-optional-chaining,padding-line-between-statements */
2 | module.exports.readVersion = (contents) => {
3 | try {
4 | const config = JSON.parse(contents);
5 |
6 | return config.buildVersion;
7 | } catch (e) {
8 | console.error(e);
9 | }
10 | };
11 |
12 | module.exports.writeVersion = (contents, version) => {
13 | const config = JSON.parse(contents);
14 |
15 | config.buildVersion = version;
16 |
17 | return JSON.stringify(config);
18 | };
19 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileList/ModFileList.type.ts:
--------------------------------------------------------------------------------
1 | import { Game } from "@renderer/shared/types";
2 |
3 | import { EmptyListProps } from "../EmptyList";
4 | import { ReadModResult } from "../ModFileForm/ModFileForm.type";
5 |
6 | export type ModFileListProps = Pick<
7 | EmptyListProps,
8 | "acceptedFileTypes" | "onFilesSelect"
9 | > & {
10 | /**
11 | * a string that will be applied as a css class to parent element
12 | */
13 | className?: string;
14 | error?: string;
15 | game: Game;
16 | zipFiles: ReadModResult | null;
17 | };
18 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Loading/Loading.module.scss:
--------------------------------------------------------------------------------
1 | .Loading {
2 | --color: 255, 255, 255;
3 | --background: rgb(var(--color) 0.05);
4 |
5 | @media (prefers-color-scheme: light) {
6 | --color: 0, 0, 0;
7 | }
8 |
9 | align-items: center;
10 | background-color: var(--background);
11 | display: flex;
12 | justify-content: center;
13 | left: 0;
14 | max-height: 100vh;
15 | position: absolute;
16 | top: 0;
17 | width: 100%;
18 |
19 | .spinner {
20 | aspect-ratio: initial;
21 | height: 50px;
22 | width: 50px;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/features/mod/readModsHandler/worker.ts:
--------------------------------------------------------------------------------
1 | import { parentPort } from "worker_threads";
2 |
3 | import { expose } from "comlink";
4 | import nodeEndpoint from "comlink/dist/umd/node-adapter";
5 |
6 | import { getModData } from "@main/entities/mod/lib/helpers/getModData/getModData";
7 |
8 | export class ReadDataWorker {
9 | startGetModData = async (path: string) => {
10 | const { filePath, pakFileData } = await getModData(path);
11 |
12 | return { pakFileData, filePath };
13 | };
14 | }
15 |
16 | expose(new ReadDataWorker(), nodeEndpoint(parentPort!));
17 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/EmptyList/EmptyList.test.tsx:
--------------------------------------------------------------------------------
1 | import { render } from "@testing-library/react";
2 | import { describe, expect, it } from "vitest";
3 |
4 | import { EmptyList } from "./EmptyList";
5 |
6 | describe("", () => {
7 | const Component = ;
8 |
9 | it("should be defined", () => {
10 | expect(EmptyList).toBeDefined();
11 | });
12 |
13 | it("should match the snapshot", () => {
14 | const { container } = render(Component);
15 |
16 | expect(container).toMatchSnapshot();
17 | });
18 | });
19 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/classNames/classNames.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Filters out falsy values and generates a string of concatenated
3 | * class names
4 | * @param {(string | number | undefined | null | boolean)[]} args
5 | * @returns {string} - a string of concatenated classes separated by a space
6 | * @example
7 | * // returns "foo bar"
8 | * classNames(false, "foo", undefined, "bar");
9 | */
10 | const classNames = (
11 | ...args: (boolean | number | string | null | undefined)[]
12 | ) => args.filter((arg) => !!arg).join(" ");
13 |
14 | export { classNames };
15 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Table/Table.module.scss:
--------------------------------------------------------------------------------
1 | .Table {
2 | --background: var(--secondary-8);
3 | --border-color: var(--secondary-7);
4 |
5 | @media (prefers-color-scheme: light) {
6 | --background: var(--secondary-2);
7 | --border-color: var(--secondary-3);
8 | }
9 |
10 | background-color: var(--background);
11 | border: 1px solid;
12 | border-collapse: collapse;
13 | border-color: var(--border-color);
14 | font-size: 16px;
15 |
16 | th,
17 | td {
18 | border: 1px solid var(--border-color);
19 | padding: 5px 10px;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Text/Text.tsx:
--------------------------------------------------------------------------------
1 | import { classNames } from "@renderer/shared/lib/helpers";
2 |
3 | import css from "./Text.module.scss";
4 | import { TextProps } from "./Text.type";
5 |
6 | const Text = ({ children, className, id, size = "regular" }: TextProps) => {
7 | const classes = [css.Text, className];
8 |
9 | if (size === "small") {
10 | classes.push(css.small);
11 | }
12 |
13 | return (
14 |
15 | {children}
16 |
17 | );
18 | };
19 |
20 | export default Text;
21 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/Backup/Backup.tsx:
--------------------------------------------------------------------------------
1 | import { classNames } from "@renderer/shared/lib/helpers";
2 | import { Heading } from "@renderer/shared/ui";
3 | import { BackupSection } from "@renderer/widgets";
4 |
5 | import css from "./Backup.module.scss";
6 | import { BackupProps } from "./Backup.type";
7 |
8 | const Backup = ({ className, game }: BackupProps) => (
9 |
10 | Backups
11 |
12 |
13 | );
14 |
15 | export { Backup };
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ### Editors
2 | ## Idea
3 | .idea
4 |
5 | ## VS Code
6 | .vscode
7 |
8 | # Logs
9 | logs
10 | *.log
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 | .eslintcache
20 |
21 | ### Dependency
22 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
23 | node_modules
24 |
25 |
26 | ### Generated Code
27 | ## Build
28 | dist
29 | out
30 | *.log*
31 |
32 | ## Cache
33 | .*cache
34 |
35 | # OSX
36 | .DS_Store
37 |
38 | ## .NET
39 | **/bin
40 | **/obj
41 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modFile/ui/ModFileButton/__snapshots__/ModFileButton.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
21 |
22 | `;
23 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/NoImage/NoImage.tsx:
--------------------------------------------------------------------------------
1 | import { memo } from "react";
2 |
3 | import Cross from "@renderer/shared/assets/icons/cross-circle.svg";
4 | import { classNames } from "@renderer/shared/lib/helpers";
5 |
6 | import css from "./NoImage.module.scss";
7 | import { NoImageProps } from "./NoImage.type";
8 |
9 | const NoImage = ({ className }: NoImageProps) => (
10 |
11 |
12 |
13 | );
14 |
15 | export { NoImage };
16 |
17 | export default memo(NoImage);
18 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/color.tokens.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sourceRoot":"","sources":["color.tokens.scss"],"names":[],"mappings":"AAAA;AAuBA;AACE;AAAA;AAAA;AAAA;AAME;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;AARF;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;AARF;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;AARF;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;AARF;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;AARF;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA","file":"color.tokens.css"}
--------------------------------------------------------------------------------
/src/renderer/src/widgets/ui/ModFileSection/__snapshots__/ModFileSection.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
9 |
13 |
17 | Modification Files
18 |
19 |
20 |
21 |
22 | `;
23 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Checkbox/Checkbox.type.ts:
--------------------------------------------------------------------------------
1 | export type CheckboxProps = {
2 | /**
3 | * a string that will be applied as a css class to parent element
4 | */
5 | className?: string;
6 | checked?: boolean;
7 | defaultChecked?: boolean;
8 | disabled?: boolean;
9 | error?: boolean;
10 | name?: string;
11 | inputRef?: React.Ref;
12 | /**
13 | * label text to render next to checkbox
14 | */
15 | label?: string;
16 | onChange?: React.ChangeEventHandler;
17 | readOnly?: boolean;
18 | value?: string;
19 | };
20 |
--------------------------------------------------------------------------------
/src/common/lib/helpers/fileExtension/fileExtension.ts:
--------------------------------------------------------------------------------
1 | const isJson = (fileName: string) => {
2 | const regex = /\.json$/i;
3 |
4 | return regex.test(fileName);
5 | };
6 |
7 | const isZip = (fileName: string) => {
8 | const regex = /\.zip$/i;
9 |
10 | return regex.test(fileName);
11 | };
12 |
13 | const isPak = (fileName: string) => {
14 | const regex = /\.pak$/i;
15 |
16 | return regex.test(fileName);
17 | };
18 |
19 | const isLsx = (fileName: string) => {
20 | const regex = /\.lsx$/i;
21 |
22 | return regex.test(fileName);
23 | };
24 |
25 | export { isJson, isZip, isPak, isLsx };
26 |
--------------------------------------------------------------------------------
/src/main/features/mod/deleteModsHandler/lib/helpers/removeModFromSettings/removeModFromSettings.ts:
--------------------------------------------------------------------------------
1 | import {
2 | getCurrentSettings,
3 | saveModSettings,
4 | } from "@main/entities/modSettingsFile";
5 | import { GameKey } from "@main/shared/config";
6 |
7 | const removeModFromSettings = async (modUUID: string, key: GameKey) => {
8 | const settings = await getCurrentSettings(key);
9 | const attribute = settings(`#Mods children [value="${modUUID}"]`);
10 |
11 | attribute.parent().remove();
12 |
13 | await saveModSettings(settings.xml(), key);
14 | };
15 |
16 | export { removeModFromSettings };
17 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/Error/__snapshots__/Error.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
9 |
18 |
22 | foobar
23 |
24 |
25 |
26 | `;
27 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@electron-toolkit/tsconfig/tsconfig.node.json",
3 | "include": [
4 | "electron.vite.config.*",
5 | "src/main",
6 | "src/preload",
7 | "src/common",
8 | "src/electron-env.d.ts"
9 | ],
10 | "compilerOptions": {
11 | "baseUrl": ".",
12 | "composite": true,
13 | "noImplicitReturns": false,
14 | "paths": {
15 | "@common/*": ["src/common/*"],
16 | "@main/*": ["src/main/*"],
17 | "@preload/*": ["src/preload/*"]
18 | },
19 | "types": ["electron-vite/node"]
20 | },
21 | "exclude": ["node_modules"]
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/fileExtension/fileExtension.ts:
--------------------------------------------------------------------------------
1 | const isJson = (fileName: string) => {
2 | const regex = /\.json$/i;
3 |
4 | return regex.test(fileName);
5 | };
6 |
7 | const isZip = (fileName: string) => {
8 | const regex = /\.zip$/i;
9 |
10 | return regex.test(fileName);
11 | };
12 |
13 | const isPak = (fileName: string) => {
14 | const regex = /\.pak$/i;
15 |
16 | return regex.test(fileName);
17 | };
18 |
19 | const isLsx = (fileName: string) => {
20 | const regex = /\.lsx$/i;
21 |
22 | return regex.test(fileName);
23 | };
24 |
25 | export { isJson, isZip, isPak, isLsx };
26 |
--------------------------------------------------------------------------------
/src/renderer/src/app/styles/tokens/spacings.tokens.css:
--------------------------------------------------------------------------------
1 | /* stylelint-disable */
2 | :root {
3 | /**
4 | * @tokens Spacings
5 | * @presenter Spacing
6 | */
7 | --spacing-1: 0.2rem;
8 | --spacing-2: 0.4rem;
9 | --spacing-3: 0.6rem;
10 | --spacing-4: 0.8rem;
11 | --spacing-5: 1rem;
12 | --spacing-6: 1.2rem;
13 | --spacing-7: 1.4rem;
14 | --spacing-8: 1.6rem;
15 | --spacing-9: 1.8rem;
16 | --spacing-10: 2rem;
17 | --spacing-11: 2.4rem;
18 | --spacing-12: 3.2rem;
19 | --spacing-13: 4.8rem;
20 | --spacing-14: 6.4rem;
21 | }
22 |
23 | /*# sourceMappingURL=spacings.tokens.css.map */
24 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/NoImage/Story.module.scss:
--------------------------------------------------------------------------------
1 | .Story {
2 | > div {
3 | &:not(:last-child) {
4 | margin-bottom: 2rem;
5 | }
6 |
7 | &:nth-child(1) {
8 | height: 32px;
9 | width: 32px;
10 | }
11 |
12 | &:nth-child(2) {
13 | height: 64px;
14 | width: 64px;
15 | }
16 |
17 | &:nth-child(3) {
18 | height: 500px;
19 | width: 300px;
20 | }
21 |
22 | &:nth-child(4) {
23 | height: 300px;
24 | width: 500px;
25 | }
26 |
27 | &:nth-child(5) {
28 | height: 480px;
29 | width: 768px;
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/__snapshots__/ToggleActiveModButton.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
21 |
22 | `;
23 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/ToggleButton/ToggleButton.module.scss:
--------------------------------------------------------------------------------
1 | @import "../../styles/button-base";
2 |
3 | .ToggleButton {
4 | @extend %button-base;
5 |
6 | // TODO ask Natasha about button width
7 | justify-content: flex-start;
8 |
9 | &:is(.active:not(:disabled)) {
10 | --border-color: var(--secondary-4);
11 | --background: var(--secondary-6);
12 |
13 | cursor: auto;
14 | pointer-events: none;
15 | }
16 |
17 | .content {
18 | align-items: center;
19 | display: inline-flex;
20 | gap: 1rem;
21 | max-height: var(--text-height);
22 | white-space: nowrap;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/SaveSettingsButton/__snapshots__/SaveSettingsButton.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
21 |
22 | `;
23 |
--------------------------------------------------------------------------------
/src/renderer/src/routes/AppRoutes/AppRoutes.test.tsx:
--------------------------------------------------------------------------------
1 | import { describe, expect, it, vi } from "vitest";
2 |
3 | import { renderWithRouter } from "@renderer/shared/lib/helpers/testUtils";
4 |
5 | import { AppRoutes } from "./AppRoutes";
6 |
7 | vi.mock("@renderer/pages");
8 |
9 | describe("", () => {
10 | const Component = ;
11 |
12 | it("should be defined", () => {
13 | expect(AppRoutes).toBeDefined();
14 | });
15 |
16 | it("should match the snapshot", () => {
17 | const { container } = renderWithRouter(Component);
18 |
19 | expect(container).toMatchSnapshot();
20 | });
21 | });
22 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/lib/helpers/mergeRefs/mergeRefs.ts:
--------------------------------------------------------------------------------
1 | import { Ref, RefObject } from "react";
2 |
3 | type Mutable = {
4 | -readonly [k in keyof T]: T[k];
5 | };
6 |
7 | type Refs = (Ref | undefined)[];
8 |
9 | const mergeRefs =
10 | (...refs: Refs) =>
11 | (value: T): void => {
12 | for (let i = 0; i < refs.length; i++) {
13 | const ref = refs[i];
14 |
15 | if (typeof ref === "function") {
16 | ref(value);
17 | } else if (ref) {
18 | (ref as Mutable>).current = value;
19 | }
20 | }
21 | };
22 |
23 | export { mergeRefs };
24 |
--------------------------------------------------------------------------------
/src/renderer/src/features/backup/ui/RestoreDefaultSettings/__snapshots__/RestoreDefaultSettings.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
21 |
22 | `;
23 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/TextField/__snapshots__/TextField.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
26 |
27 | `;
28 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/DataTable/DataTable.test.tsx:
--------------------------------------------------------------------------------
1 | import { render } from "@testing-library/react";
2 | import { describe, expect, it } from "vitest";
3 |
4 | import DataTable from "./DataTable";
5 |
6 | describe("", () => {
7 | const data: any[] = [];
8 | const columns: any[] = [];
9 | const Component = ;
10 |
11 | it("should be defined", () => {
12 | expect(DataTable).toBeDefined();
13 | });
14 |
15 | it("should match the snapshot", () => {
16 | const { container } = render(Component);
17 |
18 | expect(container).toMatchSnapshot();
19 | });
20 | });
21 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/Error/Error.tsx:
--------------------------------------------------------------------------------
1 | import ErrorIcon from "@renderer/shared/assets/icons/error.svg";
2 | import { classNames } from "@renderer/shared/lib/helpers";
3 | import { Heading } from "@renderer/shared/ui";
4 |
5 | import css from "./Error.module.scss";
6 | import { ErrorProps } from "./Error.type";
7 |
8 | const Error = ({ className, error }: ErrorProps) => (
9 |
10 |
11 |
12 | Error:
13 |
14 | {error}
15 |
16 | );
17 |
18 | export default Error;
19 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Checkbox/__snapshots__/Checkbox.test.tsx.snap:
--------------------------------------------------------------------------------
1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2 |
3 | exports[` > should match the snapshot 1`] = `
4 |
5 |
28 |
29 | `;
30 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/assets/spinners/oval.svg:
--------------------------------------------------------------------------------
1 |
2 |
13 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/components/SuspenseError/SuspenseError.tsx:
--------------------------------------------------------------------------------
1 | import { QueryErrorResetBoundary } from "@tanstack/react-query";
2 | import { Suspense } from "react";
3 |
4 | import ErrorBoundary from "../ErrorBoundary";
5 |
6 | import { SuspenseErrorProps } from "./SuspenseError.type";
7 |
8 | const SuspenseError = ({ children, loadingFallback }: SuspenseErrorProps) => (
9 |
10 | {({ reset }) => (
11 |
12 | {children}
13 |
14 | )}
15 |
16 | );
17 |
18 | export default SuspenseError;
19 |
--------------------------------------------------------------------------------
/src/renderer/src/shared/ui/Menu/Menu.type.ts:
--------------------------------------------------------------------------------
1 | import { ReactNode, RefObject } from "react";
2 |
3 | export type MenuProps = {
4 | children?: ReactNode;
5 | /**
6 | * a string that will be applied as a css class to parent element
7 | */
8 | className?: string;
9 | /**
10 | * a ref to an element that combobox will attach to during render
11 | */
12 | comboboxRef: RefObject;
13 | /**
14 | * a unique id to use in conjunction with aria-controls
15 | */
16 | id: string;
17 | /**
18 | * a callback which fires on outside click of Menu
19 | * to close the current Modal component
20 | */
21 | onClose: () => void;
22 | };
23 |
--------------------------------------------------------------------------------
/src/main/entities/modSettingsFile/lib/helpers/getCurrentSettings/getCurrentSettings.ts:
--------------------------------------------------------------------------------
1 | import fs from "fs/promises";
2 |
3 | import { load } from "cheerio";
4 |
5 | import { GameKey } from "@main/shared/config";
6 | import { getGameSettings } from "@main/shared/lib/helpers";
7 |
8 | const getCurrentSettings = async (key: GameKey) => {
9 | const { MOD_SETTINGS_PATH } = getGameSettings(key);
10 | const modSettingsFile = await fs.readFile(MOD_SETTINGS_PATH);
11 | const contents = modSettingsFile.toString();
12 | const cheerioAPI = load(contents, { xmlMode: true, decodeEntities: false });
13 |
14 | return cheerioAPI;
15 | };
16 |
17 | export { getCurrentSettings };
18 |
--------------------------------------------------------------------------------
/src/main/shared/lib/helpers/netConnection/netConnection.ts:
--------------------------------------------------------------------------------
1 | import { resolve } from "path";
2 |
3 | import { app } from "electron";
4 | import { ConnectionBuilder } from "electron-cgi";
5 |
6 | import { PAK_READER_PATH } from "@main/shared/config";
7 |
8 | let pakReaderPath = PAK_READER_PATH;
9 |
10 | if (app.isPackaged) {
11 | pakReaderPath = resolve(process.resourcesPath, "./bin/PakReader");
12 | }
13 |
14 | const netConnection = new ConnectionBuilder().connectTo(pakReaderPath).build();
15 |
16 | netConnection.onDisconnect = () => {
17 | // eslint-disable-next-line no-console
18 | console.log("Lost connection to the .Net process");
19 | };
20 |
21 | export { netConnection };
22 |
--------------------------------------------------------------------------------
/src/renderer/src/pages/BaldursGate3/BaldursGate3.tsx:
--------------------------------------------------------------------------------
1 | import { classNames } from "@renderer/shared/lib/helpers";
2 | import { InstalledModsSection, ModFileSection } from "@renderer/widgets";
3 |
4 | import css from "./BaldursGate3.module.scss";
5 | import { BaldursGate3Props } from "./BaldursGate3.type";
6 |
7 | const BaldursGate3 = ({ className }: BaldursGate3Props) => {
8 | const game = "BG3";
9 |
10 | return (
11 |
15 |
16 |
17 |
18 | );
19 | };
20 |
21 | export { BaldursGate3 };
22 |
--------------------------------------------------------------------------------