├── .eslintrc.json ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .gitmodules ├── .npmrc ├── CODESTYLE.md ├── LICENSE.md ├── README.md ├── api.tsconfig.json ├── app ├── generatedSchemas │ └── IPreset.schema.json ├── package.json └── pnpm-lock.yaml ├── assets ├── dotnetprobe.exe ├── fonts │ ├── Montserrat-Black.ttf │ ├── Montserrat-BlackItalic.ttf │ ├── Montserrat-Bold.ttf │ ├── Montserrat-BoldItalic.ttf │ ├── Montserrat-ExtraBold.ttf │ ├── Montserrat-ExtraBoldItalic.ttf │ ├── Montserrat-ExtraLight.ttf │ ├── Montserrat-ExtraLightItalic.ttf │ ├── Montserrat-Italic.ttf │ ├── Montserrat-Light.ttf │ ├── Montserrat-LightItalic.ttf │ ├── Montserrat-Medium.ttf │ ├── Montserrat-MediumItalic.ttf │ ├── Montserrat-Regular.ttf │ ├── Montserrat-SemiBold.ttf │ ├── Montserrat-SemiBoldItalic.ttf │ ├── Montserrat-Thin.ttf │ ├── Montserrat-ThinItalic.ttf │ ├── Roboto-Black.ttf │ ├── Roboto-BlackItalic.ttf │ ├── Roboto-Bold.ttf │ ├── Roboto-BoldCondensed.ttf │ ├── Roboto-BoldCondensedItalic.ttf │ ├── Roboto-BoldItalic.ttf │ ├── Roboto-Condensed.ttf │ ├── Roboto-CondensedItalic.ttf │ ├── Roboto-Italic.ttf │ ├── Roboto-Light.ttf │ ├── Roboto-LightItalic.ttf │ ├── Roboto-Medium.ttf │ ├── Roboto-MediumItalic.ttf │ ├── Roboto-Thin.ttf │ ├── Roboto-ThinItalic.ttf │ ├── icons.svg │ └── roboto.woff2 ├── images │ ├── Thumbs.db │ ├── ad-banner-large.png │ ├── ad-banner.png │ ├── bg.png │ ├── dashlets │ │ ├── add-game.png │ │ ├── add-mods.png │ │ ├── install-tools.png │ │ └── login-link.png │ ├── license_nucleo.txt │ ├── log-in-bg.png │ ├── nexus.svg │ ├── noavatar.png │ ├── splash.png │ ├── vortex.ico │ └── vortex.png ├── licenses │ ├── Apache-2.0.md │ ├── BSD-2-Clause.md │ ├── BSD-3-Clause.md │ ├── GPL-2.0.md │ ├── GPL-3.0.md │ ├── ISC.md │ ├── LGPL-3.0.md │ └── MIT.md ├── modules.json └── vcruntime │ ├── api-ms-win-core-console-l1-1-0.dll │ ├── api-ms-win-core-datetime-l1-1-0.dll │ ├── api-ms-win-core-debug-l1-1-0.dll │ ├── api-ms-win-core-errorhandling-l1-1-0.dll │ ├── api-ms-win-core-file-l1-1-0.dll │ ├── api-ms-win-core-file-l1-2-0.dll │ ├── api-ms-win-core-file-l2-1-0.dll │ ├── api-ms-win-core-handle-l1-1-0.dll │ ├── api-ms-win-core-heap-l1-1-0.dll │ ├── api-ms-win-core-interlocked-l1-1-0.dll │ ├── api-ms-win-core-libraryloader-l1-1-0.dll │ ├── api-ms-win-core-localization-l1-2-0.dll │ ├── api-ms-win-core-memory-l1-1-0.dll │ ├── api-ms-win-core-namedpipe-l1-1-0.dll │ ├── api-ms-win-core-processenvironment-l1-1-0.dll │ ├── api-ms-win-core-processthreads-l1-1-0.dll │ ├── api-ms-win-core-processthreads-l1-1-1.dll │ ├── api-ms-win-core-profile-l1-1-0.dll │ ├── api-ms-win-core-rtlsupport-l1-1-0.dll │ ├── api-ms-win-core-string-l1-1-0.dll │ ├── api-ms-win-core-synch-l1-1-0.dll │ ├── api-ms-win-core-synch-l1-2-0.dll │ ├── api-ms-win-core-sysinfo-l1-1-0.dll │ ├── api-ms-win-core-timezone-l1-1-0.dll │ ├── api-ms-win-core-util-l1-1-0.dll │ ├── api-ms-win-crt-conio-l1-1-0.dll │ ├── api-ms-win-crt-convert-l1-1-0.dll │ ├── api-ms-win-crt-environment-l1-1-0.dll │ ├── api-ms-win-crt-filesystem-l1-1-0.dll │ ├── api-ms-win-crt-heap-l1-1-0.dll │ ├── api-ms-win-crt-locale-l1-1-0.dll │ ├── api-ms-win-crt-math-l1-1-0.dll │ ├── api-ms-win-crt-multibyte-l1-1-0.dll │ ├── api-ms-win-crt-private-l1-1-0.dll │ ├── api-ms-win-crt-process-l1-1-0.dll │ ├── api-ms-win-crt-runtime-l1-1-0.dll │ ├── api-ms-win-crt-stdio-l1-1-0.dll │ ├── api-ms-win-crt-string-l1-1-0.dll │ ├── api-ms-win-crt-time-l1-1-0.dll │ ├── api-ms-win-crt-utility-l1-1-0.dll │ ├── concrt140.dll │ ├── msvcp140.dll │ ├── msvcp140_1.dll │ ├── msvcp140_2.dll │ ├── msvcp140_atomic_wait.dll │ ├── msvcp140_codecvt_ids.dll │ ├── ucrtbase.dll │ ├── vcamp140.dll │ ├── vccorlib140.dll │ ├── vcomp140.dll │ ├── vcruntime140.dll │ └── vcruntime140_1.dll ├── bootstrap.ps1 ├── build ├── amd64-unicode │ └── AccessControl.dll ├── icon.ico ├── installer.nsh ├── installer_ci.nsh ├── x86-ansi │ └── AccessControl.dll └── x86-unicode │ └── AccessControl.dll ├── createMD5List.js ├── dev-app-update.yml ├── electron-builder-advanced.json ├── electron-builder-ci.json ├── electron-builder-oneclick.json ├── electron-builder-test.json ├── electron-builder-web.json ├── icons └── custom │ ├── 753.svg │ ├── nexus-header.svg │ └── nexus.svg ├── locales └── en │ └── common.json ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── src ├── actions │ ├── app.ts │ ├── index.ts │ ├── loadOrder.ts │ ├── notificationSettings.ts │ ├── notifications.ts │ ├── safeCreateAction.ts │ ├── session.ts │ ├── tables.ts │ ├── user.ts │ └── window.ts ├── app │ ├── Application.ts │ ├── MainWindow.ts │ ├── SplashScreen.ts │ └── TrayIcon.ts ├── constants.ts ├── controls │ ├── ActionContextMenu.tsx │ ├── ActionControl.tsx │ ├── ActionDropdown.tsx │ ├── Advanced.tsx │ ├── Banner.tsx │ ├── Collapse.tsx │ ├── CollapseIcon.tsx │ ├── ContextMenu.tsx │ ├── Dashlet.tsx │ ├── DraggableList.tsx │ ├── DraggableListItem.tsx │ ├── Dropdown.tsx │ ├── DropdownButton.tsx │ ├── Dropzone.tsx │ ├── DynDiv.tsx │ ├── DynamicProps.tsx │ ├── EmptyPlaceholder.tsx │ ├── ErrorBoundary.tsx │ ├── ExtensibleControl.tsx │ ├── ExtensionGate.tsx │ ├── FlexLayout.tsx │ ├── FormFeedback.tsx │ ├── FormFields.tsx │ ├── FormInput.tsx │ ├── Icon.base.tsx │ ├── Icon.stories.js │ ├── Icon.tsx │ ├── IconBar.tsx │ ├── IconBar.unfinished_stories.js │ ├── Image.tsx │ ├── InputButton.tsx │ ├── Modal.tsx │ ├── More.tsx │ ├── Overlay.tsx │ ├── OverlayTrigger.tsx │ ├── PortalMenu.tsx │ ├── ProgressBar.tsx │ ├── RadialProgress.tsx │ ├── ReactSelectWrap.tsx │ ├── SelectUpDown.tsx │ ├── Spinner.tsx │ ├── Step.tsx │ ├── Steps.tsx │ ├── Table.tsx │ ├── Timer.tsx │ ├── Toggle.tsx │ ├── ToolIcon.tsx │ ├── ToolbarDropdown.tsx │ ├── ToolbarIcon.tsx │ ├── TooltipControls.tsx │ ├── TriStateCheckbox.tsx │ ├── Usage.tsx │ ├── VisibilityProxy.tsx │ ├── Webview.tsx │ ├── ZoomableImage.tsx │ ├── api.ts │ ├── constants.ts │ └── table │ │ ├── DateTimeFilter.tsx │ │ ├── GameFilter.tsx │ │ ├── GroupingRow.tsx │ │ ├── HeaderCell.tsx │ │ ├── MyTable.tsx │ │ ├── NumericFilter.tsx │ │ ├── OptionsFilter.tsx │ │ ├── SortIndicator.tsx │ │ ├── TableDetail.tsx │ │ ├── TableRow.tsx │ │ └── TextFilter.tsx ├── extensions │ ├── about_dialog │ │ ├── index.ts │ │ └── views │ │ │ └── AboutPage.tsx │ ├── analytics │ │ ├── actions │ │ │ └── analytics.action.ts │ │ ├── analytics │ │ │ ├── Analytics.ts │ │ │ ├── events.ts │ │ │ └── navigation.ts │ │ ├── constants.ts │ │ ├── index.ts │ │ ├── reducers │ │ │ └── settings.reducer.ts │ │ ├── types.ts │ │ └── views │ │ │ └── SettingsAnalytics.tsx │ ├── announcement_dashlet │ │ ├── AnnouncementDashlet.tsx │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── reducers │ │ │ ├── announcements.ts │ │ │ ├── persistent.ts │ │ │ └── surveys.ts │ │ ├── types.ts │ │ └── util.ts │ ├── browser │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── reducers.ts │ │ ├── types.ts │ │ └── views │ │ │ └── BrowserView.tsx │ ├── category_management │ │ ├── actions │ │ │ ├── category.ts │ │ │ └── session.ts │ │ ├── index.ts │ │ ├── reducers │ │ │ ├── category.ts │ │ │ └── session.ts │ │ ├── selectors.ts │ │ ├── types │ │ │ ├── ICategoryDictionary.ts │ │ │ └── ITrees.ts │ │ ├── util │ │ │ ├── CategoryFilter.tsx │ │ │ ├── createTreeDataObject.ts │ │ │ ├── generateSubtitle.ts │ │ │ └── retrieveCategoryPath.ts │ │ └── views │ │ │ ├── CategoryDialog.tsx │ │ │ └── CategoryList.tsx │ ├── dashboard │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── reducer.ts │ │ ├── types │ │ │ └── IDashletProps.ts │ │ └── views │ │ │ ├── Dashboard.tsx │ │ │ ├── FixedItem.tsx │ │ │ ├── PackeryGrid.tsx │ │ │ ├── PackeryItem.tsx │ │ │ └── Settings.tsx │ ├── diagnostics_files │ │ ├── index.ts │ │ ├── types │ │ │ └── ISession.ts │ │ ├── util │ │ │ └── loadVortexLogs.ts │ │ └── views │ │ │ └── DiagnosticsFilesDialog.tsx │ ├── download_management │ │ ├── DownloadManager.ts │ │ ├── DownloadObserver.ts │ │ ├── FileAssembler.ts │ │ ├── SpeedCalculator.ts │ │ ├── actions │ │ │ ├── settings.ts │ │ │ ├── state.ts │ │ │ └── transactions.ts │ │ ├── downloadAttributes.tsx │ │ ├── index.ts │ │ ├── reducers │ │ │ ├── settings.ts │ │ │ ├── state.ts │ │ │ └── transactions.ts │ │ ├── selectors.ts │ │ ├── texts.ts │ │ ├── types │ │ │ ├── IChunk.ts │ │ │ ├── IDownload.ts │ │ │ ├── IDownloadJob.ts │ │ │ ├── IDownloadResult.ts │ │ │ ├── ProgressCallback.ts │ │ │ └── ProtocolHandlers.ts │ │ ├── util │ │ │ ├── downloadDirectory.ts │ │ │ ├── getDownloadGames.ts │ │ │ ├── getDownloadPath.ts │ │ │ ├── postprocessDownload.ts │ │ │ ├── queryDLInfo.ts │ │ │ ├── setDownloadGames.ts │ │ │ └── throttle.ts │ │ └── views │ │ │ ├── Dashlet.tsx │ │ │ ├── DownloadGameList.tsx │ │ │ ├── DownloadGraph.tsx │ │ │ ├── DownloadProgressFilter.tsx │ │ │ ├── DownloadView.tsx │ │ │ ├── FileTime.tsx │ │ │ ├── Settings.tsx │ │ │ ├── ShutdownButton.tsx │ │ │ └── SpeedOMeter.tsx │ ├── extension_manager │ │ ├── BrowseExtensions.tsx │ │ ├── ExtensionManager.tsx │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── installExtension.ts │ │ ├── reducers.ts │ │ ├── tableAttributes.tsx │ │ ├── types.ts │ │ └── util.ts │ ├── file_based_loadorder │ │ ├── actions │ │ │ └── loadOrder.ts │ │ ├── collections │ │ │ └── loadOrder.ts │ │ ├── gameSupport.ts │ │ ├── index.ts │ │ ├── reducers │ │ │ └── loadOrder.ts │ │ ├── types │ │ │ ├── collections.ts │ │ │ └── types.ts │ │ ├── util.ts │ │ └── views │ │ │ ├── FileBasedLoadOrderPage.tsx │ │ │ ├── InfoPanel.tsx │ │ │ ├── ItemRenderer.tsx │ │ │ └── LoadOrderCollections.tsx │ ├── file_preview │ │ └── index.ts │ ├── firststeps_dashlet │ │ ├── Dashlet.tsx │ │ ├── IToDo.ts │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── reducers.ts │ │ └── todos.tsx │ ├── gamemode_management │ │ ├── GameModeManager.ts │ │ ├── actions │ │ │ ├── discovery.ts │ │ │ ├── persistent.ts │ │ │ ├── session.ts │ │ │ └── settings.ts │ │ ├── constants.ts │ │ ├── index.ts │ │ ├── reducers │ │ │ ├── discovery.ts │ │ │ ├── persistent.ts │ │ │ ├── session.ts │ │ │ └── settings.ts │ │ ├── selectors.ts │ │ ├── types │ │ │ ├── IDiscoveryResult.ts │ │ │ ├── IGameStored.ts │ │ │ ├── IModType.ts │ │ │ └── IToolStored.ts │ │ ├── util │ │ │ ├── ProcessMonitor.ts │ │ │ ├── Progress.ts │ │ │ ├── discovery.ts │ │ │ ├── getDriveList.ts │ │ │ ├── getGame.ts │ │ │ ├── modTypeExtensions.ts │ │ │ └── queryGameInfo.ts │ │ └── views │ │ │ ├── GameInfoPopover.tsx │ │ │ ├── GamePicker.tsx │ │ │ ├── GameRow.tsx │ │ │ ├── GameThumbnail.tsx │ │ │ ├── HideGameIcon.tsx │ │ │ ├── ModTypeWidget.tsx │ │ │ ├── NoGameDashlet.tsx │ │ │ ├── PathSelection.tsx │ │ │ ├── ProgressFooter.tsx │ │ │ ├── RecentlyManagedDashlet.tsx │ │ │ └── ShowHiddenButton.tsx │ ├── gameversion_management │ │ ├── GameVersionManager.ts │ │ ├── index.ts │ │ ├── types │ │ │ └── IGameVersionProvider.ts │ │ └── util │ │ │ ├── getGameVersion.ts │ │ │ └── validation.ts │ ├── hardlink_activator │ │ └── index.ts │ ├── harmony_injector │ │ ├── delegates │ │ │ ├── Context.ts │ │ │ ├── Core.ts │ │ │ ├── DelegateBase.ts │ │ │ └── UI.ts │ │ ├── index.ts │ │ ├── types │ │ │ └── injector.ts │ │ └── util │ │ │ └── netVersion.ts │ ├── history_management │ │ ├── HistoryDialog.tsx │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── reducers.ts │ │ └── types.ts │ ├── index.ts │ ├── ini_prep │ │ ├── TweakList.tsx │ │ ├── gameSupport.ts │ │ └── index.ts │ ├── installer_fomod │ │ ├── actions │ │ │ ├── installerUI.ts │ │ │ └── settings.ts │ │ ├── constants.ts │ │ ├── delegates │ │ │ ├── Context.ts │ │ │ ├── Core.ts │ │ │ ├── DelegateBase.ts │ │ │ ├── Ini.ts │ │ │ ├── Plugins.ts │ │ │ └── UI.ts │ │ ├── index.ts │ │ ├── reducers │ │ │ ├── installerUI.ts │ │ │ └── settings.ts │ │ ├── types │ │ │ └── interface.ts │ │ ├── util │ │ │ ├── gameSupport.ts │ │ │ └── netVersion.ts │ │ └── views │ │ │ ├── InstallerDialog.tsx │ │ │ └── Workarounds.tsx │ ├── installer_nested_fomod │ │ └── index.ts │ ├── instructions_overlay │ │ ├── Container.tsx │ │ ├── InstructionsOverlay.tsx │ │ ├── actions.ts │ │ ├── index.ts │ │ └── reducer.ts │ ├── mod_load_order │ │ ├── actions │ │ │ ├── loadOrder.ts │ │ │ └── settings.ts │ │ ├── collections │ │ │ └── loadOrder.ts │ │ ├── gameSupport.ts │ │ ├── index.ts │ │ ├── reducers │ │ │ ├── loadOrder.ts │ │ │ └── settings.ts │ │ ├── types │ │ │ ├── collections.ts │ │ │ └── types.ts │ │ ├── util.ts │ │ └── views │ │ │ ├── DefaultInfoPanel.tsx │ │ │ ├── DefaultItemRenderer.tsx │ │ │ ├── DraggableList.tsx │ │ │ ├── LoadOrderCollections.tsx │ │ │ └── LoadOrderPage.tsx │ ├── mod_management │ │ ├── InstallContext.ts │ │ ├── InstallManager.ts │ │ ├── LinkingDeployment.ts │ │ ├── actions │ │ │ ├── deployment.ts │ │ │ ├── mods.ts │ │ │ ├── session.ts │ │ │ ├── settings.ts │ │ │ └── transactions.ts │ │ ├── constants.ts │ │ ├── eventHandlers.ts │ │ ├── index.ts │ │ ├── listInstaller.tsx │ │ ├── modActivation.ts │ │ ├── modAttributes.tsx │ │ ├── modIdManager.ts │ │ ├── modMerging.ts │ │ ├── preStartDeployHook.ts │ │ ├── reducers │ │ │ ├── deployment.ts │ │ │ ├── mods.ts │ │ │ ├── session.ts │ │ │ ├── settings.ts │ │ │ └── transactions.ts │ │ ├── selectors.ts │ │ ├── stagingDirectory.ts │ │ ├── texts.ts │ │ ├── types │ │ │ ├── IDependency.ts │ │ │ ├── IDeploymentManifest.ts │ │ │ ├── IDeploymentMethod.ts │ │ │ ├── IFileEntry.ts │ │ │ ├── IFileMerge.ts │ │ │ ├── IInstallContext.ts │ │ │ ├── IInstallOptions.ts │ │ │ ├── IInstallResult.ts │ │ │ ├── IMod.ts │ │ │ ├── IModInstaller.ts │ │ │ ├── IModProps.ts │ │ │ ├── IModSource.ts │ │ │ ├── IRemoveModOptions.ts │ │ │ ├── IResolvedMerger.ts │ │ │ ├── IStateMods.ts │ │ │ ├── InstallFunc.ts │ │ │ └── TestSupported.ts │ │ ├── util │ │ │ ├── ModHistory.ts │ │ │ ├── VersionFilter.tsx │ │ │ ├── activationStore.ts │ │ │ ├── allTypesSupported.ts │ │ │ ├── basicInstaller.ts │ │ │ ├── combine.ts │ │ │ ├── dependencies.ts │ │ │ ├── deploy.ts │ │ │ ├── deploymentMethods.ts │ │ │ ├── exceptions.ts │ │ │ ├── externalChanges.ts │ │ │ ├── filterModInfo.ts │ │ │ ├── getInstallPath.ts │ │ │ ├── manifest_formats │ │ │ │ └── format_1.ts │ │ │ ├── metaLookupMatch.ts │ │ │ ├── modGrouping.ts │ │ │ ├── modName.ts │ │ │ ├── modReference.ts │ │ │ ├── modSource.ts │ │ │ ├── modUpdateState.ts │ │ │ ├── queryGameId.ts │ │ │ ├── refreshMods.ts │ │ │ ├── removeMods.ts │ │ │ ├── resolvePath.ts │ │ │ ├── sort.ts │ │ │ ├── testModReference.ts │ │ │ └── versionClean.ts │ │ └── views │ │ │ ├── ActivationButton.tsx │ │ │ ├── Author.tsx │ │ │ ├── CheckModVersionsButton.tsx │ │ │ ├── DeactivationButton.tsx │ │ │ ├── Description.tsx │ │ │ ├── DuplicatesDialog.tsx │ │ │ ├── ExternalChangeDialog.tsx │ │ │ ├── FixDeploymentDialog.tsx │ │ │ ├── InstallArchiveButton.tsx │ │ │ ├── ModList.tsx │ │ │ ├── Settings.tsx │ │ │ ├── URLInput.tsx │ │ │ ├── VersionChangelogButton.tsx │ │ │ ├── VersionIconButton.tsx │ │ │ └── Workarounds.tsx │ ├── move_activator │ │ └── index.ts │ ├── news_dashlet │ │ ├── APIDashlet.tsx │ │ ├── BaseDashlet.tsx │ │ ├── RSSDashlet.tsx │ │ ├── constants.ts │ │ ├── index.ts │ │ ├── rss.ts │ │ └── types.ts │ ├── nexus_integration │ │ ├── NXMUrl.ts │ │ ├── actions │ │ │ ├── account.ts │ │ │ ├── persistent.ts │ │ │ ├── session.ts │ │ │ └── settings.ts │ │ ├── attributes.tsx │ │ ├── constants.ts │ │ ├── eventHandlers.ts │ │ ├── index.tsx │ │ ├── reducers │ │ │ ├── account.ts │ │ │ ├── persistent.ts │ │ │ ├── session.ts │ │ │ └── settings.ts │ │ ├── selectors.ts │ │ ├── texts.ts │ │ ├── types │ │ │ ├── IJWTAccessToken.ts │ │ │ ├── INexusAPIExtension.ts │ │ │ └── IValidateKeyData.ts │ │ ├── util.ts │ │ ├── util │ │ │ ├── UIDs.ts │ │ │ ├── checkModsVersion.ts │ │ │ ├── chromeAllowScheme.ts │ │ │ ├── chromePath.ts │ │ │ ├── convertGameId.ts │ │ │ ├── endorseMod.ts │ │ │ ├── graphQueries.ts │ │ │ ├── guessModID.ts │ │ │ ├── oauth.ts │ │ │ ├── retrieveCategories.ts │ │ │ ├── sso.ts │ │ │ ├── submitFeedback.ts │ │ │ ├── tracking.tsx │ │ │ └── transformUserInfo.ts │ │ └── views │ │ │ ├── DashboardBanner.tsx │ │ │ ├── EndorseModButton.tsx │ │ │ ├── EndorsementFilter.tsx │ │ │ ├── FreeUserDLDialog.tsx │ │ │ ├── GoPremiumDashlet.tsx │ │ │ ├── LoginDialog.tsx │ │ │ ├── LoginIcon.tsx │ │ │ ├── NexusModIdDetail.tsx │ │ │ ├── PremiumNagBanner.tsx │ │ │ └── Settings.tsx │ ├── null_activator │ │ └── index.ts │ ├── onboarding_dashlet │ │ ├── Dashlet.tsx │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── reducers.ts │ │ ├── steps.ts │ │ └── views │ │ │ └── Overlay.tsx │ ├── profile_management │ │ ├── actions │ │ │ ├── profiles.ts │ │ │ ├── settings.ts │ │ │ └── transferSetup.ts │ │ ├── constants.ts │ │ ├── index.ts │ │ ├── reducers │ │ │ ├── profiles.ts │ │ │ ├── settings.ts │ │ │ └── transferSetup.ts │ │ ├── selectors.ts │ │ ├── sync.ts │ │ ├── texts.ts │ │ ├── types │ │ │ ├── Errors.ts │ │ │ ├── IProfile.ts │ │ │ └── IProfileFeature.ts │ │ ├── util │ │ │ └── manage.ts │ │ └── views │ │ │ ├── Connector.tsx │ │ │ ├── Line.tsx │ │ │ ├── ProfileEdit.tsx │ │ │ ├── ProfileItem.tsx │ │ │ ├── ProfileView.tsx │ │ │ ├── TransferDialog.tsx │ │ │ └── TransferIcon.tsx │ ├── recovery │ │ ├── Workarounds.tsx │ │ └── index.ts │ ├── settings_application │ │ ├── SettingsVortex.tsx │ │ ├── index.ts │ │ └── texts.ts │ ├── settings_interface │ │ ├── SettingsInterface.tsx │ │ ├── actions │ │ │ ├── automation.ts │ │ │ └── interface.ts │ │ ├── index.ts │ │ ├── languagemap.ts │ │ ├── reducers │ │ │ ├── automation.ts │ │ │ └── interface.ts │ │ └── texts.ts │ ├── settings_metaserver │ │ ├── SettingsMetaserver.tsx │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── reducers.ts │ │ └── texts.ts │ ├── starter_dashlet │ │ ├── AddToolButton.tsx │ │ ├── BoxWithHandle.tsx │ │ ├── EnvButton.tsx │ │ ├── Environment.tsx │ │ ├── Tool.tsx │ │ ├── ToolButton.tsx │ │ ├── ToolEditDialog.tsx │ │ ├── Tools.tsx │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── reducers.ts │ │ ├── types.ts │ │ ├── useDebouncedCallback.ts │ │ └── util.ts │ ├── sticky_mods │ │ └── index.ts │ ├── symlink_activator │ │ └── index.ts │ ├── symlink_activator_elevate │ │ ├── Settings.tsx │ │ ├── actions.ts │ │ ├── index.ts │ │ ├── reducers.ts │ │ ├── remoteCode.ts │ │ └── walk.ts │ ├── test_runner │ │ └── index.ts │ ├── tool_variables_base │ │ └── index.ts │ └── updater │ │ ├── SettingsUpdate.tsx │ │ ├── actions.ts │ │ ├── autoupdater.ts │ │ ├── index.ts │ │ ├── reducers.ts │ │ └── texts.ts ├── index.dev.html ├── index.html ├── index.ts ├── main.ts ├── reducers │ ├── app.ts │ ├── index.ts │ ├── loadOrder.ts │ ├── notificationSettings.ts │ ├── notifications.ts │ ├── session.ts │ ├── tables.ts │ ├── user.ts │ └── window.ts ├── renderer.tsx ├── splash.html ├── splash.ts ├── stylesheets │ ├── bootstrap-override.scss │ ├── bootstrap │ │ ├── _bootstrap-compass.scss │ │ ├── _bootstrap-mincer.scss │ │ ├── _bootstrap-sprockets.scss │ │ ├── _bootstrap.scss │ │ ├── bootstrap │ │ │ ├── _alerts.scss │ │ │ ├── _badges.scss │ │ │ ├── _breadcrumbs.scss │ │ │ ├── _button-groups.scss │ │ │ ├── _buttons.scss │ │ │ ├── _carousel.scss │ │ │ ├── _close.scss │ │ │ ├── _code.scss │ │ │ ├── _component-animations.scss │ │ │ ├── _dropdowns.scss │ │ │ ├── _forms.scss │ │ │ ├── _glyphicons.scss │ │ │ ├── _grid.scss │ │ │ ├── _input-groups.scss │ │ │ ├── _jumbotron.scss │ │ │ ├── _labels.scss │ │ │ ├── _list-group.scss │ │ │ ├── _media.scss │ │ │ ├── _mixins.scss │ │ │ ├── _modals.scss │ │ │ ├── _navbar.scss │ │ │ ├── _navs.scss │ │ │ ├── _normalize.scss │ │ │ ├── _pager.scss │ │ │ ├── _pagination.scss │ │ │ ├── _panels.scss │ │ │ ├── _popovers.scss │ │ │ ├── _print.scss │ │ │ ├── _progress-bars.scss │ │ │ ├── _responsive-embed.scss │ │ │ ├── _responsive-utilities.scss │ │ │ ├── _scaffolding.scss │ │ │ ├── _tables.scss │ │ │ ├── _theme.scss │ │ │ ├── _thumbnails.scss │ │ │ ├── _tooltip.scss │ │ │ ├── _type.scss │ │ │ ├── _utilities.scss │ │ │ ├── _variables.scss │ │ │ ├── _wells.scss │ │ │ └── mixins │ │ │ │ ├── _alerts.scss │ │ │ │ ├── _background-variant.scss │ │ │ │ ├── _border-radius.scss │ │ │ │ ├── _buttons.scss │ │ │ │ ├── _center-block.scss │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _forms.scss │ │ │ │ ├── _gradients.scss │ │ │ │ ├── _grid-framework.scss │ │ │ │ ├── _grid.scss │ │ │ │ ├── _hide-text.scss │ │ │ │ ├── _image.scss │ │ │ │ ├── _labels.scss │ │ │ │ ├── _list-group.scss │ │ │ │ ├── _nav-divider.scss │ │ │ │ ├── _nav-vertical-align.scss │ │ │ │ ├── _opacity.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _panels.scss │ │ │ │ ├── _progress-bar.scss │ │ │ │ ├── _reset-filter.scss │ │ │ │ ├── _reset-text.scss │ │ │ │ ├── _resize.scss │ │ │ │ ├── _responsive-visibility.scss │ │ │ │ ├── _size.scss │ │ │ │ ├── _tab-focus.scss │ │ │ │ ├── _table-row.scss │ │ │ │ ├── _text-emphasis.scss │ │ │ │ ├── _text-overflow.scss │ │ │ │ └── _vendor-prefixes.scss │ │ └── readme.txt │ ├── datepicker │ │ ├── datepicker.scss │ │ ├── mixins.scss │ │ └── variables.scss │ ├── desktop.scss │ ├── details.scss │ ├── functions.scss │ ├── loadingScreen.scss │ ├── react-select-variables.scss │ ├── react-select.scss │ ├── react-sortable-tree-original.scss │ ├── react-sortable-tree.scss │ ├── resizer.scss │ ├── style.scss │ ├── thirdparty.scss │ ├── variables.scss │ └── vortex │ │ ├── banner.scss │ │ ├── bbcode.scss │ │ ├── bebasneue.scss │ │ ├── browser.scss │ │ ├── charts.scss │ │ ├── collapse.scss │ │ ├── collapseicon.scss │ │ ├── dashlet-rss.scss │ │ ├── dashlet.scss │ │ ├── dialog-about.scss │ │ ├── dialog-categories.scss │ │ ├── dialog-diagnostic-files.scss │ │ ├── dialog-extensions.scss │ │ ├── dialog-external-change.scss │ │ ├── dialog-fix-deployment.scss │ │ ├── dialog-fomod.scss │ │ ├── dialog-history.scss │ │ ├── dialog-login.scss │ │ ├── dialog-search-paths.scss │ │ ├── dialogs.scss │ │ ├── dropzone.scss │ │ ├── gamepicker.scss │ │ ├── globals.scss │ │ ├── hover-menu.scss │ │ ├── icon.scss │ │ ├── iconbar.scss │ │ ├── instructions-overlay.scss │ │ ├── layout.scss │ │ ├── main-window.scss │ │ ├── montserrat.scss │ │ ├── more.scss │ │ ├── navbar.scss │ │ ├── nexusmods.scss │ │ ├── notification.scss │ │ ├── page-dashboard.scss │ │ ├── page-download.scss │ │ ├── page-extensions.scss │ │ ├── page-game.scss │ │ ├── page-mod-load-order.scss │ │ ├── page-mod.scss │ │ ├── page-profile.scss │ │ ├── page-settings.scss │ │ ├── placeholder.scss │ │ ├── portal-menu.scss │ │ ├── progress.scss │ │ ├── progressbar.scss │ │ ├── quicklaunch.scss │ │ ├── radial.scss │ │ ├── roboto.scss │ │ ├── starter.scss │ │ ├── steps.scss │ │ ├── supertable.scss │ │ ├── table.scss │ │ ├── timer.scss │ │ ├── todo.scss │ │ ├── toggle.scss │ │ ├── tristatecheckbox.scss │ │ ├── usage.scss │ │ └── window-controls.scss ├── toJSONSchema.ts ├── types │ ├── Extension.ts │ ├── IActionDefinition.ts │ ├── IAttributeState.ts │ ├── IBannerOptions.ts │ ├── IComponentContext.ts │ ├── IDialog.ts │ ├── IDiscoveredTool.ts │ ├── IDynDivOptions.ts │ ├── IError.ts │ ├── IExecInfo.ts │ ├── IExtensionContext.ts │ ├── IExtensionProvider.ts │ ├── IGame.ts │ ├── IGame.validator.json │ ├── IGame.validator.ts │ ├── IGameStore.ts │ ├── IGameStoreEntry.ts │ ├── II18NProps.ts │ ├── IMainPage.ts │ ├── IModLookupResult.ts │ ├── IModifiers.ts │ ├── INotification.ts │ ├── IPreset.ts │ ├── IState.ts │ ├── ITableAttribute.ts │ ├── ITestResult.ts │ ├── ITool.ts │ ├── SortDirection.ts │ ├── VortexInstallType.ts │ ├── api.ts │ └── collections │ │ ├── IGameSpecificInterfaceProps.ts │ │ └── api.ts ├── util │ ├── AsyncComponent.tsx │ ├── BatchContext.ts │ ├── ComponentEx.ts │ ├── ConcurrencyLimiter.ts │ ├── CustomErrors.ts │ ├── Debouncer.ts │ ├── EpicGamesLauncher.ts │ ├── ExtensionManager.ts │ ├── ExtensionProvider.ts │ ├── GameStoreHelper.ts │ ├── GlobalNotifications.ts │ ├── LazyComponent.tsx │ ├── LevelPersist.ts │ ├── MutexContext.ts │ ├── PresetManager.ts │ ├── ReduxPersistor.ts │ ├── ReduxProp.ts │ ├── ReduxWatcher.ts │ ├── StarterInfo.ts │ ├── Steam.ts │ ├── StyleManager.ts │ ├── SubPersistor.ts │ ├── api.ts │ ├── application.electron.ts │ ├── application.ts │ ├── archives.ts │ ├── asyncRequire.tsx │ ├── bbcode.ts │ ├── bbcode │ │ ├── BrTag.tsx │ │ ├── FontTag.tsx │ │ ├── HeadingTag.tsx │ │ ├── IdentityTag.tsx │ │ ├── LineTag.tsx │ │ ├── LinkTag.tsx │ │ ├── MoreTag.tsx │ │ ├── SizeTag.tsx │ │ ├── SpoilerTag.tsx │ │ ├── SvgTag.tsx │ │ ├── TooltipTag.tsx │ │ └── YoutubeTag.tsx │ ├── bindProps.ts │ ├── calculateFolderSize.ts │ ├── checksum.ts │ ├── commandLine.ts │ ├── constants.ts │ ├── copyRecursive.ts │ ├── datelocales.ts │ ├── deepMerge.ts │ ├── devel.ts │ ├── electron.ts │ ├── electronRemote.ts │ ├── errorHandling.ts │ ├── estimateSize.ts │ ├── exeIcon.ts │ ├── extensionRequire.ts │ ├── fileValidation.ts │ ├── fs.ts │ ├── fsAtomic.ts │ ├── genHash.ts │ ├── getAttr.ts │ ├── getFileList.ts │ ├── getNormalizeFunc.ts │ ├── getVortexPath.ts │ ├── github.ts │ ├── i18n.ts │ ├── lazyRequire.ts │ ├── libxmljs.ts │ ├── local.ts │ ├── log.ts │ ├── makeCaseInsensitive.ts │ ├── makeReactive.ts │ ├── menu.ts │ ├── message.ts │ ├── migrate.ts │ ├── monkeyPatching.ts │ ├── nativeErrors.ts │ ├── network.ts │ ├── onceCB.ts │ ├── opn.ts │ ├── reduxLogger.ts │ ├── reduxSanity.ts │ ├── relativeTime.ts │ ├── requireRebuild.ts │ ├── requireRemap.ts │ ├── runElevatedCustomTool.ts │ ├── selectors.ts │ ├── smoothScroll.ts │ ├── startupSettings.ts │ ├── store.ts │ ├── storeHelper.ts │ ├── transferPath.ts │ ├── updateStore.ts │ ├── util.ts │ ├── vortex-run │ │ ├── lib │ │ │ ├── elevated.d.ts │ │ │ ├── elevated.js │ │ │ ├── index.d.ts │ │ │ ├── index.js │ │ │ ├── thread.d.ts │ │ │ └── thread.js │ │ ├── package.json │ │ ├── src │ │ │ ├── elevated.ts │ │ │ ├── index.ts │ │ │ └── thread.ts │ │ └── tsconfig.json │ ├── walk.ts │ └── webview.ts ├── validationCode │ ├── IPreset.validate.js │ ├── dummy.js │ └── validation.ts └── views │ ├── DNDContainer.tsx │ ├── Dialog.tsx │ ├── DialogContainer.tsx │ ├── GlobalOverlay.tsx │ ├── LoadingScreen.tsx │ ├── MainFooter.tsx │ ├── MainOverlay.tsx │ ├── MainPage.tsx │ ├── MainPageBody.tsx │ ├── MainPageContainer.tsx │ ├── MainPageHeader.tsx │ ├── MainWindow.tsx │ ├── Notification.tsx │ ├── NotificationButton.tsx │ ├── OverlayContainer.tsx │ ├── PageButton.tsx │ ├── QuickLauncher.tsx │ ├── Settings.tsx │ ├── WindowControls.tsx │ └── api.ts ├── structure.md ├── tools ├── addicons │ ├── index.html │ ├── main.js │ └── renderer.js ├── editicons.cmd ├── generateicons.js ├── iconconfig.json ├── mdiconfig.json ├── renameicons.js ├── sourcemap.cmd ├── sourcemap │ ├── .vscode │ │ └── tasks.json │ ├── package.json │ ├── src │ │ ├── SourceMap.ts │ │ ├── main.ts │ │ └── translate.ts │ └── tsconfig.json └── stackmap │ ├── .gitignore │ ├── .vscode │ ├── extensions.json │ ├── launch.json │ ├── settings.json │ └── tasks.json │ ├── .vscodeignore │ ├── CHANGELOG.md │ ├── README.md │ ├── media │ ├── paste-dark.svg │ ├── paste-light.svg │ ├── version-dark.svg │ ├── version-light.svg │ └── vortex.png │ ├── package.json │ ├── src │ ├── SourceMap.ts │ ├── extension.ts │ └── test │ │ └── index.ts │ ├── tsconfig.json │ ├── tslint.json │ └── webpack.config.js ├── tsconfig.json ├── typings.custom ├── bbcode-to-react.d.ts ├── index.d.ts ├── readme.txt ├── redux-devtools-dispatch.d.ts ├── redux-persist.d.ts ├── redux-watcher.d.ts └── simple-vdf.d.ts ├── updateLicenses.js ├── updateLicensesFormat.json ├── vortex.bat └── webpack.config.js /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | 5 | --- 6 | 7 | **Describe the bug** 8 | A clear and concise description of what the bug is. 9 | 10 | **To Reproduce** 11 | Steps to reproduce the behavior: 12 | 1. Go to '...' 13 | 2. Click on '....' 14 | 3. Scroll down to '....' 15 | 4. See error 16 | 17 | **Expected behavior** 18 | A clear and concise description of what you expected to happen. 19 | 20 | **Screenshots** 21 | If applicable, add screenshots to help explain your problem. 22 | 23 | **Platform (please complete the following information):** 24 | - OS: [e.g. Windows 10] 25 | - Vortex Version [e.g. 0.16.12] 26 | 27 | **Additional context** 28 | Add any other context about the problem here. 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Describe alternatives you've considered** 14 | A clear and concise description of any alternative solutions or features you've considered. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # User-specific files 2 | .env 3 | **/.vscode 4 | **/*.VC.db 5 | **/*.kate-swp 6 | **/*.kateproject* 7 | 8 | # auto generated 9 | **/node_modules/* 10 | **/npm-debug.log 11 | **/yarn-error.log 12 | **/eslint.log 13 | 14 | # temporary fonts directory used during font-svg generation (see tools/renameicons.js) 15 | /fonts/ 16 | 17 | # build results 18 | app/* 19 | dist 20 | dist_custom 21 | dist_portable 22 | dist_web 23 | icons/fontawesome/ 24 | icons/Font-Awesome-SVG-PNG-master/ 25 | icons/fontawesome/ 26 | icons/Nucleo_Colored/ 27 | icons/Nucleo_Glyph/ 28 | icons/Nucleo_Outline/ 29 | icons/nucleo-standard-license.txt 30 | 31 | # tracked results 32 | !app/*lock* 33 | !app/package.json 34 | !app/generatedSchemas 35 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | disturl=https://electronjs.org/headers 2 | target=22.2.0 3 | runtime=electron 4 | arch=x64 5 | target_arch=x64 6 | msvs_version=2022 7 | #app-builder-lib is required to provide schema validation 8 | #hoisted it rather than add a direct depend because 9 | #schema validation is not strictly required and hoisting 10 | #guarantees electron-builder's version is used 11 | public-hoist-pattern[]=app-builder-lib 12 | #submodules track their own changes 13 | shared-workspace-lockfile=false 14 | use-lockfile-v6=true 15 | #other monorepo settings 16 | link-workspace-packages=true 17 | prefer-workspace-packages=true 18 | resolve-peers-from-workspace-root=true 19 | -------------------------------------------------------------------------------- /api.tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "nodenext", 5 | "moduleResolution": "nodenext", 6 | "noImplicitAny": false, 7 | "removeComments": false, 8 | "preserveConstEnums": true, 9 | "rootDir": "src", 10 | "outDir": "api/lib", 11 | "sourceMap": false, 12 | "jsx":"react", 13 | "emitDeclarationOnly": true, 14 | "declaration": true, 15 | "skipLibCheck": true, 16 | "esModuleInterop": true 17 | }, 18 | "files": [ 19 | "src/index.ts", 20 | "typings.custom/index.d.ts" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /assets/dotnetprobe.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/dotnetprobe.exe -------------------------------------------------------------------------------- /assets/fonts/Montserrat-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-Black.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-BlackItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-BoldItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-ExtraBold.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-ExtraLight.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-Italic.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-Light.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-LightItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-Medium.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-MediumItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-Regular.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-SemiBold.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-Thin.ttf -------------------------------------------------------------------------------- /assets/fonts/Montserrat-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Montserrat-ThinItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-Black.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-BlackItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-BoldCondensed.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-BoldCondensed.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-BoldCondensedItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-BoldCondensedItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-BoldItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Condensed.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-Condensed.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-CondensedItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-CondensedItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-Italic.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-Light.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-LightItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-Medium.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-MediumItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-Thin.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/Roboto-ThinItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/roboto.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/fonts/roboto.woff2 -------------------------------------------------------------------------------- /assets/images/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/Thumbs.db -------------------------------------------------------------------------------- /assets/images/ad-banner-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/ad-banner-large.png -------------------------------------------------------------------------------- /assets/images/ad-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/ad-banner.png -------------------------------------------------------------------------------- /assets/images/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/bg.png -------------------------------------------------------------------------------- /assets/images/dashlets/add-game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/dashlets/add-game.png -------------------------------------------------------------------------------- /assets/images/dashlets/add-mods.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/dashlets/add-mods.png -------------------------------------------------------------------------------- /assets/images/dashlets/install-tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/dashlets/install-tools.png -------------------------------------------------------------------------------- /assets/images/dashlets/login-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/dashlets/login-link.png -------------------------------------------------------------------------------- /assets/images/license_nucleo.txt: -------------------------------------------------------------------------------- 1 | Copyright (C) Amber Creative Lab Ltd 2 | 3 | Version 1, 2 July 2018 4 | 5 | Nucleo Icons 6 | 7 | https://nucleoapp.com/ 8 | 9 | The Nucleo icons are copyrighted. Redistribution is not permitted. Use in source and binary forms, with or without modification, is permitted only if you possess a Nucleo icons license. 10 | 11 | Please refer to the license for additional information https://nucleoapp.com/license -------------------------------------------------------------------------------- /assets/images/log-in-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/log-in-bg.png -------------------------------------------------------------------------------- /assets/images/noavatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/noavatar.png -------------------------------------------------------------------------------- /assets/images/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/splash.png -------------------------------------------------------------------------------- /assets/images/vortex.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/vortex.ico -------------------------------------------------------------------------------- /assets/images/vortex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/images/vortex.png -------------------------------------------------------------------------------- /assets/licenses/ISC.md: -------------------------------------------------------------------------------- 1 | Internet Systems Consortium license 2 | =================================== 3 | 4 | Permission to use, copy, modify, and/or distribute this software for any purpose 5 | with or without fee is hereby granted, provided that the above copyright notice 6 | and this permission notice appear in all copies. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 10 | FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS 12 | OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 13 | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 14 | THIS SOFTWARE. 15 | -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-console-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-console-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-datetime-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-datetime-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-debug-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-debug-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-errorhandling-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-errorhandling-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-file-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-file-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-file-l1-2-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-file-l1-2-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-file-l2-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-file-l2-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-handle-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-handle-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-heap-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-heap-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-interlocked-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-interlocked-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-libraryloader-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-libraryloader-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-localization-l1-2-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-localization-l1-2-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-memory-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-memory-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-namedpipe-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-namedpipe-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-processenvironment-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-processenvironment-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-processthreads-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-processthreads-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-processthreads-l1-1-1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-processthreads-l1-1-1.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-profile-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-profile-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-rtlsupport-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-rtlsupport-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-string-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-string-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-synch-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-synch-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-synch-l1-2-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-synch-l1-2-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-sysinfo-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-sysinfo-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-timezone-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-timezone-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-core-util-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-core-util-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-conio-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-conio-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-convert-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-convert-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-environment-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-environment-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-filesystem-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-filesystem-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-heap-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-heap-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-locale-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-locale-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-math-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-math-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-multibyte-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-multibyte-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-private-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-private-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-process-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-process-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-runtime-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-runtime-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-stdio-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-stdio-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-string-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-string-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-time-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-time-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/api-ms-win-crt-utility-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/api-ms-win-crt-utility-l1-1-0.dll -------------------------------------------------------------------------------- /assets/vcruntime/concrt140.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/concrt140.dll -------------------------------------------------------------------------------- /assets/vcruntime/msvcp140.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/msvcp140.dll -------------------------------------------------------------------------------- /assets/vcruntime/msvcp140_1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/msvcp140_1.dll -------------------------------------------------------------------------------- /assets/vcruntime/msvcp140_2.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/msvcp140_2.dll -------------------------------------------------------------------------------- /assets/vcruntime/msvcp140_atomic_wait.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/msvcp140_atomic_wait.dll -------------------------------------------------------------------------------- /assets/vcruntime/msvcp140_codecvt_ids.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/msvcp140_codecvt_ids.dll -------------------------------------------------------------------------------- /assets/vcruntime/ucrtbase.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/ucrtbase.dll -------------------------------------------------------------------------------- /assets/vcruntime/vcamp140.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/vcamp140.dll -------------------------------------------------------------------------------- /assets/vcruntime/vccorlib140.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/vccorlib140.dll -------------------------------------------------------------------------------- /assets/vcruntime/vcomp140.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/vcomp140.dll -------------------------------------------------------------------------------- /assets/vcruntime/vcruntime140.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/vcruntime140.dll -------------------------------------------------------------------------------- /assets/vcruntime/vcruntime140_1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/assets/vcruntime/vcruntime140_1.dll -------------------------------------------------------------------------------- /build/amd64-unicode/AccessControl.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/build/amd64-unicode/AccessControl.dll -------------------------------------------------------------------------------- /build/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/build/icon.ico -------------------------------------------------------------------------------- /build/installer.nsh: -------------------------------------------------------------------------------- 1 | !macro customInstall 2 | SetRegView 64 3 | 4 | ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64" "Installed" 5 | ${If} $1 != "1" 6 | File /oname=$PLUGINSDIR\vc_redist.x64.exe "${BUILD_RESOURCES_DIR}\vc_redist.x64.exe" 7 | ExecWait '"$PLUGINSDIR\vc_redist.x64.exe" /passive /norestart' 8 | ${EndIf} 9 | 10 | AccessControl::GrantOnFile \ 11 | "$INSTDIR\resources\app.asar.unpacked\node_modules\fomod-installer\dist" "(S-1-15-2-1)" "ListDirectory + GenericRead + GenericExecute" 12 | Pop $R0 13 | ${If} $R0 == error 14 | Pop $R0 15 | MessageBox MB_OK `AccessControl error: $R0` 16 | ${EndIf} 17 | 18 | AccessControl::GrantOnFile \ 19 | "$INSTDIR\resources\app.asar.unpacked\node_modules\fomod-installer\dist" "(S-1-15-2-2)" "ListDirectory + GenericRead + GenericExecute" 20 | Pop $R0 21 | ${If} $R0 == error 22 | Pop $R0 23 | MessageBox MB_OK `AccessControl error: $R0` 24 | ${EndIf} 25 | 26 | !macroend -------------------------------------------------------------------------------- /build/installer_ci.nsh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/build/installer_ci.nsh -------------------------------------------------------------------------------- /build/x86-ansi/AccessControl.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/build/x86-ansi/AccessControl.dll -------------------------------------------------------------------------------- /build/x86-unicode/AccessControl.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/build/x86-unicode/AccessControl.dll -------------------------------------------------------------------------------- /dev-app-update.yml: -------------------------------------------------------------------------------- 1 | owner: Nexus-Mods 2 | repo: Vortex 3 | provider: github 4 | private: false 5 | publisherName: 6 | - Black Tree Gaming Limited 7 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'api' 3 | - 'app' 4 | - 'extensions/*' 5 | - 'extensions/games/game-pillarsofeternity2' 6 | - 'src/util/vortex-run' 7 | - 'tools/remote/*' 8 | -------------------------------------------------------------------------------- /src/actions/loadOrder.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from './safeCreateAction'; 2 | 3 | /** 4 | * generic action to store load orders for games. How it is to be interpreted 5 | * is up to the corresponding game support code. 6 | * the id will usually be the profile id for which the load order is to be stored, the items 7 | * in the order could be the ids of mods/plugins - in the order they should be loaded. 8 | * 9 | * With most games we don't store the load order this way but instead directly synchronise 10 | * with the data/configuration file holding the load order. 11 | * Use this only if that isn't an option (e.g. with "7 days to die" there is no generic way 12 | * to store the load order, it's only stored in the form of mod names and it would be 13 | * impractical to redeploy every time the load order is changed) 14 | */ 15 | export const setLoadOrder = safeCreateAction( 16 | 'SET_LOAD_ORDER', 17 | (id: string, order: any[]) => ({ id, order }) 18 | ); 19 | -------------------------------------------------------------------------------- /src/actions/notificationSettings.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from './safeCreateAction'; 2 | 3 | /** 4 | * set (or unset) notifications to not show again 5 | */ 6 | export const suppressNotification = safeCreateAction( 7 | 'SUPPRESS_NOTIFICATION', 8 | (id: string, suppress: boolean) => ({ id, suppress }) 9 | ); 10 | 11 | export const resetSuppression = safeCreateAction( 12 | 'RESET_SUPPRESSION', 13 | () => null 14 | ); 15 | -------------------------------------------------------------------------------- /src/actions/user.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from './safeCreateAction'; 2 | 3 | export const setMultiUser = safeCreateAction('SET_MUTLI_USER', (enabled: boolean) => enabled); 4 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const HTTP_HEADER_SIZE: number = 16384; 2 | export const DEBUG_PORT: string = '9222'; 3 | -------------------------------------------------------------------------------- /src/controls/Dashlet.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export interface IDashletProps { 4 | className: string; 5 | title: string; 6 | } 7 | 8 | class Dashlet extends React.Component { 9 | public override render() { 10 | const { className, title } = this.props; 11 | const classes = ['dashlet'].concat(className.split(' ')); 12 | return ( 13 |
14 | {!!title ?
{title}
: null} 15 | {this.props.children} 16 |
17 | ); 18 | } 19 | } 20 | 21 | export default Dashlet; 22 | -------------------------------------------------------------------------------- /src/controls/IconBar.unfinished_stories.js: -------------------------------------------------------------------------------- 1 | import { withInfo } from "@storybook/addon-info"; 2 | import { withKnobs } from '@storybook/addon-knobs'; 3 | import React from 'react'; 4 | import IconBase from './IconBase'; 5 | import IconBar from './IconBar'; 6 | 7 | const sets = { 8 | icons: new Set(['sample', 'spinner']), 9 | }; 10 | 11 | function getSet(set) { 12 | return Promise.resolve(sets[set]); 13 | } 14 | 15 | function Icon(props) { 16 | return ; 17 | } 18 | 19 | export default { 20 | title: 'IconBar', 21 | parameters: { 22 | componentSubtitle: 'Control containing multiple buttons', 23 | decorators: [withInfo, withKnobs], 24 | info: { 25 | inline: true, 26 | } 27 | } 28 | }; 29 | 30 | export const simple = () => ( 31 | 34 | ); 35 | -------------------------------------------------------------------------------- /src/controls/Spinner.tsx: -------------------------------------------------------------------------------- 1 | import Icon from './Icon'; 2 | 3 | import * as React from 'react'; 4 | 5 | export interface ISpinnerProps { 6 | style?: React.CSSProperties; 7 | className?: string; 8 | } 9 | 10 | function Spinner(props: ISpinnerProps) { 11 | return ; 12 | } 13 | 14 | export default Spinner; 15 | -------------------------------------------------------------------------------- /src/controls/Step.tsx: -------------------------------------------------------------------------------- 1 | import Icon from './Icon'; 2 | 3 | import * as React from 'react'; 4 | 5 | export interface IStepProps { 6 | stepId: string; 7 | title: string; 8 | description: string; 9 | index?: number; 10 | state?: 'done' | 'current' | 'future'; 11 | } 12 | 13 | class Step extends React.Component { 14 | public override render() { 15 | const { index, state, title } = this.props; 16 | return ( 17 |
18 |
19 | {state === 'done' ? : index + 1} 20 |
21 |
22 |
{title}
23 |
24 |
25 | ); 26 | } 27 | } 28 | 29 | export default Step; 30 | -------------------------------------------------------------------------------- /src/controls/constants.ts: -------------------------------------------------------------------------------- 1 | // name to be displayed for extension downloads 2 | export const SITE_GAME_NAME = 'Tools & Extensions'; 3 | 4 | // delay for hover effects (e.g. submenus opening on hover) that would otherwise 5 | // be frustrating or irritating 6 | export const HOVER_DELAY = 500; 7 | -------------------------------------------------------------------------------- /src/controls/table/SortIndicator.tsx: -------------------------------------------------------------------------------- 1 | import { SortDirection } from '../../types/SortDirection'; 2 | 3 | import Icon from '../Icon'; 4 | 5 | import * as React from 'react'; 6 | 7 | export interface IProps { 8 | direction: SortDirection; 9 | onSetDirection: (direction: SortDirection) => void; 10 | } 11 | 12 | class SortIndicator extends React.Component { 13 | public override render(): JSX.Element { 14 | const { direction } = this.props; 15 | return ( 16 |
17 | 18 |
19 | ); 20 | } 21 | 22 | private icon(direction: SortDirection): string { 23 | switch (direction) { 24 | case 'none': return 'sort-none'; 25 | case 'asc': return 'sort-up'; 26 | case 'desc': return 'sort-down'; 27 | default: return 'question'; 28 | } 29 | } 30 | } 31 | 32 | export default SortIndicator; 33 | -------------------------------------------------------------------------------- /src/extensions/about_dialog/index.ts: -------------------------------------------------------------------------------- 1 | import { IExtensionContext } from '../../types/IExtensionContext'; 2 | 3 | import AboutPage from './views/AboutPage'; 4 | 5 | function init(context: IExtensionContext): boolean { 6 | context.registerAction('global-icons', 200, 'about', {}, 'About', () => { 7 | context.api.events.emit('show-main-page', 'About'); 8 | }); 9 | 10 | context.registerMainPage('', 'About', AboutPage, { group: 'hidden' }); 11 | 12 | return true; 13 | } 14 | 15 | export default init; 16 | -------------------------------------------------------------------------------- /src/extensions/analytics/actions/analytics.action.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from '../../../actions/safeCreateAction'; 2 | 3 | /** 4 | * changes the 'analytics' toggle, which is either on or off 5 | */ 6 | export const setAnalytics = safeCreateAction('SET_UPDATE_ANALYTICS', analytics => analytics); 7 | -------------------------------------------------------------------------------- /src/extensions/analytics/constants.ts: -------------------------------------------------------------------------------- 1 | export const HELP_ARTICLE = 'https://help.nexusmods.com/article/121-diagnostics-usage-data-vortex'; 2 | -------------------------------------------------------------------------------- /src/extensions/analytics/reducers/settings.reducer.ts: -------------------------------------------------------------------------------- 1 | import { IReducerSpec } from '../../../types/IExtensionContext'; 2 | 3 | import { setAnalytics } from '../actions/analytics.action'; 4 | 5 | import update from 'immutability-helper'; 6 | 7 | /** 8 | * reducer for changes to interface settings 9 | */ 10 | const settingsReducer: IReducerSpec = { 11 | reducers: { 12 | [setAnalytics as any]: (state, payload) => update(state, { enabled: { $set: payload } }), 13 | }, 14 | defaults: { 15 | enabled: false, 16 | }, 17 | }; 18 | 19 | export default settingsReducer; 20 | -------------------------------------------------------------------------------- /src/extensions/analytics/types.ts: -------------------------------------------------------------------------------- 1 | export type StateListeners = Array<{ path: string[], callback: (previous, current) => void }>; 2 | export type EventListeners = Array<{ event: string, callback: (event) => void }>; 3 | -------------------------------------------------------------------------------- /src/extensions/announcement_dashlet/actions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from 'redux-act'; 2 | import { IAnnouncement, ISurveyInstance } from './types'; 3 | 4 | export const setAnnouncements = createAction('SET_ANNOUNCEMENTS', 5 | (announcements: IAnnouncement[]) => announcements); 6 | 7 | export const setAvailableSurveys = createAction('SET_AVAILABLE_SURVEYS', 8 | (surveys: ISurveyInstance[]) => surveys); 9 | 10 | export const setSuppressSurvey = createAction('SET_SUPPRESS_SURVEY', 11 | (id: string, suppress: boolean) => ({ id, suppress })); 12 | -------------------------------------------------------------------------------- /src/extensions/announcement_dashlet/reducers/announcements.ts: -------------------------------------------------------------------------------- 1 | import { IReducerSpec } from '../../../types/IExtensionContext'; 2 | import { setSafe } from '../../../util/storeHelper'; 3 | 4 | import * as actions from '../actions'; 5 | 6 | const sessionReducer: IReducerSpec = { 7 | reducers: { 8 | [actions.setAnnouncements as any]: (state, payload) => 9 | setSafe(state, ['announcements'], payload), 10 | }, 11 | defaults: { 12 | announcements: [], 13 | }, 14 | }; 15 | 16 | export default sessionReducer; 17 | -------------------------------------------------------------------------------- /src/extensions/announcement_dashlet/reducers/persistent.ts: -------------------------------------------------------------------------------- 1 | import * as _ from 'lodash'; 2 | import { IReducerSpec } from '../../../types/IExtensionContext'; 3 | import { setSafe } from '../../../util/storeHelper'; 4 | 5 | import * as actions from '../actions'; 6 | 7 | const persistentReducer: IReducerSpec = { 8 | reducers: { 9 | [actions.setSuppressSurvey as any]: (state, payload) => 10 | setSafe(state, ['suppressed', payload.id], payload.suppress), 11 | }, 12 | defaults: { 13 | }, 14 | }; 15 | 16 | export default persistentReducer; 17 | -------------------------------------------------------------------------------- /src/extensions/announcement_dashlet/reducers/surveys.ts: -------------------------------------------------------------------------------- 1 | import * as _ from 'lodash'; 2 | import { IReducerSpec } from '../../../types/IExtensionContext'; 3 | import { setSafe } from '../../../util/storeHelper'; 4 | 5 | import * as actions from '../actions'; 6 | 7 | const surveySessionReducer: IReducerSpec = { 8 | reducers: { 9 | [actions.setAvailableSurveys as any]: (state, payload) => 10 | setSafe(state, ['available'], payload), 11 | }, 12 | defaults: { 13 | }, 14 | }; 15 | 16 | export default surveySessionReducer; 17 | -------------------------------------------------------------------------------- /src/extensions/browser/actions.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from '../../actions/safeCreateAction'; 2 | 3 | import { Action } from 'redux'; 4 | 5 | type ShowUrlFunc = (url: string, instructions?: string, subscriber?: string, skippable?: boolean) 6 | => Action<{ url: string, instructions: string, subscriber: string, skippable: boolean }>; 7 | 8 | export const showURL: ShowUrlFunc = safeCreateAction( 9 | 'SHOW_URL', 10 | (url: string, instructions?: string, subscriber?: string, skippable?: boolean) => ( 11 | { url, instructions, subscriber, skippable: skippable ?? false } 12 | ) 13 | ) as any; // FIXME 14 | 15 | export const closeBrowser = safeCreateAction('CLOSE_BROWSER'); 16 | -------------------------------------------------------------------------------- /src/extensions/browser/reducers.ts: -------------------------------------------------------------------------------- 1 | import { IReducerSpec } from '../../types/IExtensionContext'; 2 | import { merge, setSafe } from '../../util/storeHelper'; 3 | 4 | import * as actions from './actions'; 5 | 6 | /** 7 | * reducer for changes to ephemeral session state 8 | */ 9 | export const sessionReducer: IReducerSpec = { 10 | reducers: { 11 | [actions.showURL as any]: (state, payload) => { 12 | const { url, instructions, subscriber, skippable } = payload; 13 | return merge(state, [], { url, instructions, subscriber, skippable }); 14 | }, 15 | [actions.closeBrowser as any]: (state, payload) => 16 | setSafe(state, ['url'], undefined), 17 | }, 18 | defaults: { 19 | url: undefined, 20 | instructions: undefined, 21 | subscriber: undefined, 22 | skippable: undefined, 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /src/extensions/browser/types.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicBOMB/Vortex/6b061b74887407cdfed5bcc442dfb990fb00dabc/src/extensions/browser/types.ts -------------------------------------------------------------------------------- /src/extensions/category_management/actions/session.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from '../../../actions/safeCreateAction'; 2 | 3 | export const showCategoriesDialog = safeCreateAction( 4 | 'SHOW_CATEGORIES_DIALOG', 5 | (show) => show 6 | ); 7 | -------------------------------------------------------------------------------- /src/extensions/category_management/reducers/session.ts: -------------------------------------------------------------------------------- 1 | import { IReducerSpec } from '../../../types/IExtensionContext'; 2 | import {setSafe} from '../../../util/storeHelper'; 3 | 4 | import * as actions from '../actions/session'; 5 | 6 | /** 7 | * reducer for changes to ephemeral session state 8 | */ 9 | export const sessionReducer: IReducerSpec = { 10 | reducers: { 11 | [actions.showCategoriesDialog as any]: (state, payload) => 12 | setSafe(state, [ 'showDialog' ], payload), 13 | }, 14 | defaults: { 15 | showDialog: false, 16 | }, 17 | }; 18 | -------------------------------------------------------------------------------- /src/extensions/category_management/selectors.ts: -------------------------------------------------------------------------------- 1 | import { activeGameId } from '../../util/selectors'; 2 | 3 | export function allCategories(state: any) { 4 | const gameMode = activeGameId(state); 5 | const categories = state.persistent.categories[gameMode]; 6 | return categories !== undefined ? categories : []; 7 | } 8 | -------------------------------------------------------------------------------- /src/extensions/category_management/types/ICategoryDictionary.ts: -------------------------------------------------------------------------------- 1 | export interface ICategory { 2 | name: string; 3 | parentCategory: string; 4 | order: number; 5 | } 6 | 7 | export interface ICategoryDictionary { 8 | [id: string]: ICategory; 9 | } 10 | -------------------------------------------------------------------------------- /src/extensions/category_management/types/ITrees.ts: -------------------------------------------------------------------------------- 1 | import { TreeItem } from 'react-sortable-tree'; 2 | 3 | export interface ICategoriesTree extends TreeItem { 4 | categoryId: string; 5 | expanded: boolean; 6 | parentId: string; 7 | subtitle: string; 8 | title: string; 9 | order: number; 10 | modCount: number; 11 | children: ICategoriesTree[]; 12 | } 13 | -------------------------------------------------------------------------------- /src/extensions/category_management/util/generateSubtitle.ts: -------------------------------------------------------------------------------- 1 | import { IMod } from '../../mod_management/types/IMod'; 2 | 3 | import { TFunction } from 'i18next'; 4 | 5 | /** 6 | * generate the category's subtitle 7 | * 8 | * @param {string} rootId 9 | * @param {any} mods 10 | * @return {string} 11 | */ 12 | 13 | function generateSubtitle(t: TFunction, 14 | categoryId: string, 15 | mods: { [categoryId: string]: IMod[] }, 16 | totalChildModCount?: number) { 17 | const modsCount = (mods?.[categoryId] ?? []).length; 18 | let subt: string = (modsCount === 0) 19 | ? t('Empty') : t('{{ count }} mods installed', {count: modsCount}); 20 | 21 | if ((totalChildModCount !== undefined) && (totalChildModCount > 0)) { 22 | subt = subt + t(' ({{ count }} mods in sub-categories)', {count: totalChildModCount}); 23 | } 24 | 25 | return subt; 26 | } 27 | 28 | export default generateSubtitle; 29 | -------------------------------------------------------------------------------- /src/extensions/dashboard/actions.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from '../../actions/safeCreateAction'; 2 | 3 | export const setLayout = safeCreateAction('SET_LAYOUT', layout => layout); 4 | 5 | export const setDashletEnabled = safeCreateAction('SET_WIDGET_ENABLED', 6 | (widgetId: string, enabled: boolean) => ({ widgetId, enabled })); 7 | 8 | export const setDashletWidth = safeCreateAction('SET_WIDGET_WIDTH', 9 | (widgetId: string, width: number) => ({ widgetId, width })); 10 | 11 | export const setDashletHeight = safeCreateAction('SET_WIDGET_HEIGHT', 12 | (widgetId: string, height: number) => ({ widgetId, height })); 13 | -------------------------------------------------------------------------------- /src/extensions/dashboard/types/IDashletProps.ts: -------------------------------------------------------------------------------- 1 | import {PropsCallback} from '../../../types/IExtensionContext'; 2 | 3 | export interface IDashletProps { 4 | title: string; 5 | width: 1 | 2 | 3; 6 | height: 1 | 2 | 3 | 4 | 5; 7 | position: number; 8 | component: React.ComponentClass; 9 | props?: PropsCallback; 10 | isVisible?: (state: any) => boolean; 11 | fixed: boolean; 12 | closable: boolean; 13 | } 14 | -------------------------------------------------------------------------------- /src/extensions/diagnostics_files/index.ts: -------------------------------------------------------------------------------- 1 | 2 | import { setDialogVisible } from '../../actions/session'; 3 | import { IExtensionContext } from '../../types/IExtensionContext'; 4 | 5 | import DiagnosticsFilesDialog from './views/DiagnosticsFilesDialog'; 6 | 7 | function init(context: IExtensionContext): boolean { 8 | context.registerAction('global-icons', 190, 'bug', {}, 'Diagnostics Files', 9 | () => { context.api.store.dispatch(setDialogVisible('diagnostics-files-dialog')); }); 10 | 11 | context.registerDialog('diagnostics-files-dialog', DiagnosticsFilesDialog); 12 | 13 | return true; 14 | } 15 | 16 | export default init; 17 | -------------------------------------------------------------------------------- /src/extensions/diagnostics_files/types/ISession.ts: -------------------------------------------------------------------------------- 1 | import {LogLevel} from '../../../util/log'; 2 | 3 | export interface ISession { 4 | from: Date; 5 | to: Date; 6 | logs: ILog[]; 7 | } 8 | 9 | export interface ILog { 10 | lineno: number; 11 | time: string; 12 | text: string; 13 | type: LogLevel; 14 | } 15 | -------------------------------------------------------------------------------- /src/extensions/download_management/actions/settings.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from '../../../actions/safeCreateAction'; 2 | // @ts-ignore fewer imports in typings 3 | import * as reduxAct from 'redux-act'; 4 | 5 | export const setMaxDownloads = safeCreateAction( 6 | 'SET_MAX_DOWNLOADS', 7 | (max) => max 8 | ); 9 | export const setDownloadPath = safeCreateAction( 10 | 'SET_DOWNLOAD_PATH', 11 | (dlPath) => dlPath 12 | ); 13 | export const setShowDLDropzone = safeCreateAction( 14 | 'SET_SHOW_DL_DROPZONE', 15 | (show) => show 16 | ); 17 | export const setShowDLGraph = safeCreateAction( 18 | 'SET_SHOW_DL_GRAPH', 19 | (show) => show 20 | ); 21 | export const setCopyOnIFF = safeCreateAction( 22 | 'SET_COPY_ON_IFF', 23 | (enabled) => enabled 24 | ); 25 | export const setMaxBandwidth = safeCreateAction( 26 | 'SET_MAX_BANDWIDTH', 27 | (bandwidth) => bandwidth 28 | ); 29 | -------------------------------------------------------------------------------- /src/extensions/download_management/actions/transactions.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from '../../../actions/safeCreateAction'; 2 | 3 | /** 4 | * Used to track transfer attempts and correctly recover if it gets interrupted. 5 | */ 6 | export const setTransferDownloads = safeCreateAction('SET_TRANSFER_DOWNLOADS', 7 | (destination: string) => ({ destination })); 8 | -------------------------------------------------------------------------------- /src/extensions/download_management/reducers/transactions.ts: -------------------------------------------------------------------------------- 1 | import { IReducerSpec } from '../../../types/IExtensionContext'; 2 | import { deleteOrNop, setSafe } from '../../../util/storeHelper'; 3 | import * as actions from '../actions/transactions'; 4 | 5 | export const transactionsReducer: IReducerSpec = { 6 | reducers: { 7 | [actions.setTransferDownloads as any]: (state, payload) => { 8 | const { destination } = payload; 9 | return ((destination === undefined) || (destination === '')) 10 | ? deleteOrNop(state, ['transfer', 'downloads']) 11 | : setSafe(state, ['transfer', 'downloads'], destination); 12 | }, 13 | }, 14 | defaults: { 15 | }, 16 | }; 17 | -------------------------------------------------------------------------------- /src/extensions/download_management/types/IChunk.ts: -------------------------------------------------------------------------------- 1 | import Promise from 'bluebird'; 2 | 3 | export interface IChunk { 4 | url: () => Promise; 5 | received: number; 6 | offset: number; 7 | size: number; 8 | } 9 | -------------------------------------------------------------------------------- /src/extensions/download_management/types/IDownloadJob.ts: -------------------------------------------------------------------------------- 1 | import { IChunk } from './IChunk'; 2 | import { IDownloadOptions } from './IDownload'; 3 | 4 | import Promise from 'bluebird'; 5 | 6 | export interface IDownloadJob extends IChunk { 7 | state: 'init' | 'running' | 'paused' | 'finished'; 8 | workerId?: number; 9 | options: IDownloadOptions; 10 | confirmedReceived: number; 11 | confirmedOffset: number; 12 | confirmedSize: number; 13 | extraCookies: string[]; 14 | 15 | dataCB?: (offset: number, data) => Promise; 16 | completionCB?: () => void; 17 | errorCB?: (err) => void; 18 | responseCB?: (size: number, fileName: string, chunkable: boolean) => void; 19 | } 20 | -------------------------------------------------------------------------------- /src/extensions/download_management/types/IDownloadResult.ts: -------------------------------------------------------------------------------- 1 | import { IChunk } from './IChunk'; 2 | 3 | export interface IDownloadResult { 4 | filePath: string; 5 | headers: any; 6 | unfinishedChunks: IChunk[]; 7 | hadErrors: boolean; 8 | size: number; 9 | metaInfo: any; 10 | } 11 | -------------------------------------------------------------------------------- /src/extensions/download_management/types/ProgressCallback.ts: -------------------------------------------------------------------------------- 1 | import {IChunk} from './IChunk'; 2 | 3 | export type ProgressCallback = (received: number, total: number, 4 | chunks: IChunk[], chunkable: boolean, 5 | urls: string[], filePath?: string) => void; 6 | -------------------------------------------------------------------------------- /src/extensions/download_management/types/ProtocolHandlers.ts: -------------------------------------------------------------------------------- 1 | import Promise from 'bluebird'; 2 | 3 | export interface IResolvedURL { 4 | urls: string[]; 5 | updatedUrl?: string; 6 | meta: any; 7 | } 8 | 9 | export interface IResolvedURLs { 10 | urls: string[]; 11 | updatedUrls?: string[]; 12 | meta: any; 13 | } 14 | 15 | export interface IProtocolHandlers { 16 | [schema: string]: (inputUrl: string, name: string, friendlyName: string) 17 | => Promise; 18 | } 19 | -------------------------------------------------------------------------------- /src/extensions/download_management/util/getDownloadGames.ts: -------------------------------------------------------------------------------- 1 | import { log } from '../../../util/log'; 2 | import { IDownload } from '../types/IDownload'; 3 | 4 | function getDownloadGames(download: IDownload): string[] { 5 | if (Array.isArray(download.game)) { 6 | return download.game; 7 | } else if (download.game === undefined) { 8 | log('warn', 'download with no game associated', JSON.stringify(download)); 9 | return []; 10 | } else { 11 | return [download.game]; 12 | } 13 | } 14 | 15 | export default getDownloadGames; 16 | -------------------------------------------------------------------------------- /src/extensions/download_management/views/ShutdownButton.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import ToolbarIcon from '../../../controls/ToolbarIcon'; 3 | import { TFunction } from '../../../util/i18n'; 4 | import { IDownload } from '../types/IDownload'; 5 | 6 | export interface IShutdownButtonProps { 7 | t: TFunction; 8 | shutdownPending: boolean; 9 | activeDownloads: { [key: string]: IDownload }; 10 | toggleShutdown: () => void; 11 | } 12 | 13 | function ShutdownButton(props: IShutdownButtonProps) { 14 | const { t, shutdownPending, activeDownloads, toggleShutdown } = props; 15 | return ( 16 | 23 | ); 24 | } 25 | 26 | export default ShutdownButton; 27 | -------------------------------------------------------------------------------- /src/extensions/extension_manager/actions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from 'redux-act'; 2 | import { IAvailableExtension, IExtension } from './types'; 3 | 4 | export const setAvailableExtensions = createAction('SET_AVAILABLE_EXTENSIONS', 5 | (extensions: IAvailableExtension[]) => extensions); 6 | 7 | export const setInstalledExtensions = createAction('SET_INSTALLED_EXTENSIONS', 8 | (extensions: { [extId: string]: IExtension }) => extensions); 9 | 10 | export const setExtensionsUpdate = createAction('SET_EXTENSIONS_UPDATE_TIME', 11 | (time: number) => time); 12 | -------------------------------------------------------------------------------- /src/extensions/extension_manager/reducers.ts: -------------------------------------------------------------------------------- 1 | import { IReducerSpec } from '../../types/IExtensionContext'; 2 | import { setSafe } from '../../util/storeHelper'; 3 | 4 | import * as actions from './actions'; 5 | 6 | /** 7 | * reducer for changes to ephemeral session state 8 | */ 9 | const sessionReducer: IReducerSpec = { 10 | reducers: { 11 | [actions.setAvailableExtensions as any]: (state, payload) => 12 | setSafe(state, ['available'], payload), 13 | [actions.setInstalledExtensions as any]: (state, payload) => 14 | setSafe(state, ['installed'], payload), 15 | [actions.setExtensionsUpdate as any]: (state, payload) => 16 | setSafe(state, ['updateTime'], payload), 17 | }, 18 | defaults: { 19 | available: [], 20 | installed: {}, 21 | updateTime: 0, 22 | }, 23 | }; 24 | 25 | export default sessionReducer; 26 | -------------------------------------------------------------------------------- /src/extensions/file_based_loadorder/actions/loadOrder.ts: -------------------------------------------------------------------------------- 1 | import createAction from '../../../actions/safeCreateAction'; 2 | import { ILoadOrderEntry, LoadOrder } from '../types/types'; 3 | 4 | // Change a specific load order entry. 5 | export const setFBLoadOrderEntry = 6 | createAction('SET_FB_LOAD_ORDER_ENTRY', 7 | (profileId: string, loEntry: ILoadOrderEntry) => 8 | ({ profileId, loEntry })) as any; 9 | 10 | export const setFBLoadOrder = 11 | createAction('SET_FB_LOAD_ORDER', 12 | (profileId: string, loadOrder: LoadOrder) => 13 | ({ profileId, loadOrder })) as any; 14 | -------------------------------------------------------------------------------- /src/extensions/firststeps_dashlet/IToDo.ts: -------------------------------------------------------------------------------- 1 | import { ToDoType } from '../../types/IExtensionContext'; 2 | 3 | import { TFunction } from 'i18next'; 4 | 5 | export interface IToDo { 6 | id: string; 7 | type: ToDoType; 8 | props?: (state: any) => any; 9 | icon: ((props: any) => JSX.Element) | string; 10 | text: ((t: TFunction, props: any) => JSX.Element | string) | string; 11 | value?: ((t: TFunction, props: any) => JSX.Element | string) | string; 12 | condition?: (props: any) => boolean; 13 | action?: (props: any) => void; 14 | priority?: number; 15 | } 16 | -------------------------------------------------------------------------------- /src/extensions/firststeps_dashlet/actions.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from '../../actions/safeCreateAction'; 2 | 3 | /** 4 | * dismiss a todo message from the "first steps" list 5 | */ 6 | export const dismissStep = safeCreateAction('DISMISS_STEP', step => step); 7 | -------------------------------------------------------------------------------- /src/extensions/firststeps_dashlet/reducers.ts: -------------------------------------------------------------------------------- 1 | import { IReducerSpec } from '../../types/IExtensionContext'; 2 | import {setSafe} from '../../util/storeHelper'; 3 | 4 | import * as actions from './actions'; 5 | 6 | /** 7 | * reducer for changes to interface settings 8 | */ 9 | const settingsReducer: IReducerSpec = { 10 | reducers: { 11 | [actions.dismissStep as any]: 12 | (state, payload) => setSafe(state, ['steps', payload], true), 13 | }, 14 | defaults: { 15 | dismissAll: false, 16 | steps: {}, 17 | }, 18 | }; 19 | 20 | export default settingsReducer; 21 | -------------------------------------------------------------------------------- /src/extensions/gamemode_management/actions/discovery.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from '../../../actions/safeCreateAction'; 2 | // @ts-ignore fewer imports in typings 3 | import * as reduxAct from 'redux-act'; 4 | export const setPhaseCount = safeCreateAction( 5 | 'SET_DISCOVERY_PHASE_COUNT', 6 | (count) => count 7 | ); 8 | 9 | export const discoveryProgress = safeCreateAction( 10 | 'DISCOVERY_PROGRESS', 11 | (idx: number, percent: number, directory: string) => ( 12 | { idx, percent, directory } 13 | ) 14 | ); 15 | 16 | export const discoveryFinished = safeCreateAction('DISCOVERY_FINISHED'); 17 | -------------------------------------------------------------------------------- /src/extensions/gamemode_management/actions/persistent.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from '../../../actions/safeCreateAction'; 2 | 3 | export const setGameInfo = safeCreateAction( 4 | 'SET_GAME_INFO', 5 | ( 6 | gameId: string, 7 | provider: string, 8 | priority: number, 9 | expires: number, 10 | values: Array<{ key: string, title: string, value: any }> 11 | ) => ( 12 | { gameId, provider, priority, expires, values } 13 | ) 14 | ); 15 | -------------------------------------------------------------------------------- /src/extensions/gamemode_management/actions/session.ts: -------------------------------------------------------------------------------- 1 | import safeCreateAction from '../../../actions/safeCreateAction'; 2 | // @ts-ignore fewer imports in typings 3 | import * as reduxAct from 'redux-act'; 4 | 5 | /** 6 | * sets the list of known/supported games 7 | */ 8 | export const setKnownGames = safeCreateAction( 9 | 'SET_KNOWN_GAMES', 10 | (games) => games 11 | ); 12 | 13 | export const clearGameDisabled = safeCreateAction('CLEAR_GAME_DISABLED'); 14 | 15 | export const setGameDisabled = safeCreateAction( 16 | 'SET_GAME_DISABLED', 17 | (gameId: string, disabledBy: string) => ( 18 | { gameId, disabledBy } 19 | ) 20 | ); 21 | -------------------------------------------------------------------------------- /src/extensions/gamemode_management/constants.ts: -------------------------------------------------------------------------------- 1 | export const SITE_ID = 'site'; 2 | -------------------------------------------------------------------------------- /src/extensions/gamemode_management/reducers/session.ts: -------------------------------------------------------------------------------- 1 | import { IReducerSpec } from '../../../types/IExtensionContext'; 2 | 3 | import * as actions from '../actions/session'; 4 | 5 | import update from 'immutability-helper'; 6 | import { setSafe } from '../../../util/storeHelper'; 7 | 8 | /** 9 | * reducer for changes to ephemeral session state 10 | */ 11 | export const sessionReducer: IReducerSpec = { 12 | reducers: { 13 | [actions.setKnownGames as any]: (state, payload) => update(state, { known: { $set: payload } }), 14 | [actions.setGameDisabled as any]: (state, payload) => 15 | setSafe(state, [ 'disabled', payload.gameId ], payload.disabledBy), 16 | [actions.clearGameDisabled as any]: (state, payload) => 17 | update(state, { disabled: { $set: {} } }), 18 | }, 19 | defaults: { 20 | known: [], 21 | disabled: {}, 22 | }, 23 | }; 24 | -------------------------------------------------------------------------------- /src/extensions/gamemode_management/types/IGameStored.ts: -------------------------------------------------------------------------------- 1 | import { IToolStored } from './IToolStored'; 2 | 3 | /** 4 | * cached information about games. 5 | * Don't trunst this, avoid using it as dynamic information 6 | * (e.g. the executable) that might be affected by which variant of the 7 | * game is discovered will not be correct 8 | */ 9 | export interface IGameStored { 10 | id: string; 11 | name: string; 12 | shortName?: string; 13 | logo?: string; 14 | extensionPath?: string; 15 | imageURL?: string; 16 | requiredFiles: string[]; 17 | // cached value of IGame.executable. DO NOT USE! This will only be correct 18 | // if the return value of executable() is independent of discovery information! 19 | executable: string; 20 | parameters?: string[]; 21 | supportedTools?: IToolStored[]; 22 | environment?: { [key: string]: string }; 23 | details?: { [key: string]: any }; 24 | shell?: boolean; 25 | contributed?: string|string[]; 26 | final?: boolean; 27 | } 28 | -------------------------------------------------------------------------------- /src/extensions/gamemode_management/types/IModType.ts: -------------------------------------------------------------------------------- 1 | import {IInstruction, IModTypeOptions} from '../../../types/IExtensionContext'; 2 | import {IGame} from '../../../types/IGame'; 3 | 4 | import Promise from 'bluebird'; 5 | 6 | export interface IModType { 7 | typeId: string; 8 | priority: number; 9 | isSupported: (gameId: string) => boolean; 10 | getPath: (game: IGame) => string; 11 | test: (installInstructions: IInstruction[]) => Promise; 12 | options: IModTypeOptions; 13 | } 14 | -------------------------------------------------------------------------------- /src/extensions/gamemode_management/types/IToolStored.ts: -------------------------------------------------------------------------------- 1 | export interface IToolStored { 2 | id: string; 3 | name: string; 4 | shortName?: string; 5 | logo: string; 6 | executable: string; 7 | parameters: string[]; 8 | environment: { [key: string]: string }; 9 | shell?: boolean; 10 | detach?: boolean; 11 | onStart?: 'hide' | 'hide_recover' | 'close'; 12 | exclusive?: boolean; 13 | defaultPrimary?: boolean; 14 | } 15 | -------------------------------------------------------------------------------- /src/extensions/gamemode_management/views/ShowHiddenButton.tsx: -------------------------------------------------------------------------------- 1 | import ToolbarIcon from '../../../controls/ToolbarIcon'; 2 | import { ComponentEx, connect, translate } from '../../../util/ComponentEx'; 3 | 4 | import { TFunction } from 'i18next'; 5 | import * as React from 'react'; 6 | 7 | export interface IBaseProps { 8 | toggleHidden: () => void; 9 | showHidden: boolean; 10 | t: TFunction; 11 | } 12 | 13 | class ShowHiddenButton extends ComponentEx { 14 | public override render(): JSX.Element { 15 | const { t, showHidden, toggleHidden } = this.props; 16 | 17 | return ( 18 |