From 3494353641428754451add3b1b62079e12e23ec7 Mon Sep 17 00:00:00 2001 From: Amir Zarrinkafsh Date: Sat, 19 Jun 2021 18:20:43 +1000 Subject: [PATCH] refactor(web): use absolute imports with aliases (#2100) * refactor(web): use absolute imports with aliases Refactors all of the TS/JS frontend to utilise absolute imports along with import aliases. Each of the paths within `src` are represented with their own alias: * @assets * @components * @constants (new) * @hooks * @layouts * @models * @services * @themes * @utils * @views `Routes.ts` and `constant.ts` have been relocated to the constants directory for consistency. --- web/.cracorc.js | 19 +++++++++++-- web/package.json | 9 +++--- web/src/App.test.tsx | 2 +- web/src/App.tsx | 28 +++++++++---------- web/src/components/AppStoreBadges.test.tsx | 2 +- web/src/components/AppStoreBadges.tsx | 4 +-- .../ColoredSnackbarContent.test.tsx | 2 +- web/src/components/FailureIcon.test.tsx | 2 +- web/src/components/FingerTouchIcon.test.tsx | 2 +- web/src/components/FingerTouchIcon.tsx | 2 +- web/src/components/FixedTextField.test.tsx | 2 +- web/src/components/InformationIcon.test.tsx | 2 +- web/src/components/LinearProgressBar.test.tsx | 2 +- web/src/components/NotificationBar.test.tsx | 2 +- web/src/components/NotificationBar.tsx | 6 ++-- web/src/components/PieChartIcon.test.tsx | 2 +- .../components/PushNotificationIcon.test.tsx | 2 +- web/src/components/PushNotificationIcon.tsx | 4 +-- web/src/components/SuccessIcon.test.tsx | 2 +- web/src/components/TimerIcon.test.tsx | 2 +- web/src/components/TimerIcon.tsx | 2 +- web/src/{ => constants}/Routes.ts | 0 web/src/{ => constants}/constants.ts | 0 web/src/hooks/Configuration.ts | 4 +-- web/src/hooks/Consent.ts | 4 +-- web/src/hooks/NotificationsContext.ts | 4 +-- web/src/hooks/State.ts | 4 +-- web/src/hooks/UserInfo.ts | 4 +-- web/src/index.tsx | 8 +++--- web/src/layouts/LoginLayout.tsx | 2 +- web/src/models/Configuration.ts | 2 +- web/src/models/Notifications.ts | 2 +- web/src/models/UserInfo.ts | 2 +- web/src/services/Api.ts | 2 +- web/src/services/Client.ts | 2 +- web/src/services/Configuration.ts | 8 +++--- web/src/services/Consent.ts | 4 +-- web/src/services/FirstFactor.ts | 6 ++-- web/src/services/OneTimePassword.ts | 6 ++-- web/src/services/PushNotification.ts | 6 ++-- web/src/services/RegisterDevice.ts | 4 +-- web/src/services/ResetPassword.ts | 4 +-- web/src/services/SecurityKey.ts | 6 ++-- web/src/services/SignOut.ts | 4 +-- web/src/services/State.ts | 4 +-- web/src/services/UserPreferences.ts | 8 +++--- web/src/themes/index.ts | 6 ++-- web/src/utils/AssetPath.ts | 2 +- web/src/utils/BasePath.ts | 2 +- .../RegisterOneTimePassword.tsx | 14 +++++----- .../RegisterSecurityKey.tsx | 15 ++++------ web/src/views/LoginPortal/Authenticated.tsx | 2 +- .../AuthenticatedView/AuthenticatedView.tsx | 6 ++-- .../LoginPortal/ConsentView/ConsentView.tsx | 12 ++++---- .../FirstFactor/FirstFactorForm.tsx | 14 +++++----- web/src/views/LoginPortal/LoginPortal.tsx | 28 +++++++++---------- .../SecondFactor/MethodContainer.tsx | 4 +-- .../SecondFactor/MethodSelectionDialog.tsx | 8 +++--- .../LoginPortal/SecondFactor/OTPDial.tsx | 8 +++--- .../SecondFactor/OneTimePasswordMethod.tsx | 10 +++---- .../SecondFactor/PushNotificationMethod.tsx | 16 +++++------ .../SecondFactor/SecondFactorForm.tsx | 26 ++++++++--------- .../SecondFactor/SecurityKeyMethod.tsx | 20 ++++++------- web/src/views/LoginPortal/SignOut/SignOut.tsx | 14 +++++----- .../ResetPassword/ResetPasswordStep1.tsx | 10 +++---- .../ResetPassword/ResetPasswordStep2.tsx | 12 ++++---- web/tsconfig.aliases.json | 19 +++++++++++++ web/tsconfig.json | 6 ++++ web/yarn.lock | 7 ++++- 69 files changed, 251 insertions(+), 210 deletions(-) rename web/src/{ => constants}/Routes.ts (100%) rename web/src/{ => constants}/constants.ts (100%) create mode 100644 web/tsconfig.aliases.json diff --git a/web/.cracorc.js b/web/.cracorc.js index 67c5744e..f5cc481d 100644 --- a/web/.cracorc.js +++ b/web/.cracorc.js @@ -1,5 +1,18 @@ +const isCoverage = process.env.COVERAGE === 'true' +const babelPlugins = isCoverage ? [ "babel-plugin-istanbul" ] : [] + module.exports = { babel: { - plugins: [ "babel-plugin-istanbul" ] - } -}; \ No newline at end of file + plugins: babelPlugins, + }, + plugins: [ + { + plugin: require("craco-alias"), + options: { + source: "tsconfig", + baseUrl: "./src", + tsConfigPath: "./tsconfig.aliases.json", + } + } + ] +}; diff --git a/web/package.json b/web/package.json index 2c95e45e..edc7dfce 100644 --- a/web/package.json +++ b/web/package.json @@ -3,7 +3,6 @@ "version": "0.1.0", "private": true, "dependencies": { - "@craco/craco": "6.1.2", "@fortawesome/fontawesome-svg-core": "1.2.35", "@fortawesome/free-regular-svg-icons": "5.15.3", "@fortawesome/free-solid-svg-icons": "5.15.3", @@ -46,10 +45,10 @@ }, "scripts": { "start": "craco start", - "build": "react-scripts build", + "build": "craco build", "lint": "eslint '*/**/*.{js,ts,tsx}' --fix", - "coverage": "craco build", - "test": "react-scripts test --coverage --no-cache", + "coverage": "COVERAGE=true craco build", + "test": "craco test --coverage --no-cache", "report": "nyc report -r clover -r json -r lcov -r text", "eject": "react-scripts eject" }, @@ -72,6 +71,8 @@ ] }, "devDependencies": { + "@craco/craco": "^6.1.2", + "craco-alias": "^3.0.1", "eslint-formatter-rdjson": "1.0.5" } } diff --git a/web/src/App.test.tsx b/web/src/App.test.tsx index 67a662c2..0af0bfe7 100644 --- a/web/src/App.test.tsx +++ b/web/src/App.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { shallow } from "enzyme"; -import App from "./App"; +import App from "@root/App"; it("renders without crashing", () => { shallow(); diff --git a/web/src/App.tsx b/web/src/App.tsx index a672fa84..f7747df5 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -4,9 +4,7 @@ import { config as faConfig } from "@fortawesome/fontawesome-svg-core"; import { CssBaseline, ThemeProvider } from "@material-ui/core"; import { BrowserRouter as Router, Route, Switch, Redirect } from "react-router-dom"; -import NotificationBar from "./components/NotificationBar"; -import NotificationsContext from "./hooks/NotificationsContext"; -import { Notification } from "./models/Notifications"; +import NotificationBar from "@components/NotificationBar"; import { FirstFactorRoute, ResetPasswordStep2Route, @@ -15,17 +13,19 @@ import { RegisterOneTimePasswordRoute, LogoutRoute, ConsentRoute, -} from "./Routes"; -import * as themes from "./themes"; -import { getBasePath } from "./utils/BasePath"; -import { getRememberMe, getResetPassword, getTheme } from "./utils/Configuration"; -import RegisterOneTimePassword from "./views/DeviceRegistration/RegisterOneTimePassword"; -import RegisterSecurityKey from "./views/DeviceRegistration/RegisterSecurityKey"; -import ConsentView from "./views/LoginPortal/ConsentView/ConsentView"; -import LoginPortal from "./views/LoginPortal/LoginPortal"; -import SignOut from "./views/LoginPortal/SignOut/SignOut"; -import ResetPasswordStep1 from "./views/ResetPassword/ResetPasswordStep1"; -import ResetPasswordStep2 from "./views/ResetPassword/ResetPasswordStep2"; +} from "@constants/Routes"; +import NotificationsContext from "@hooks/NotificationsContext"; +import { Notification } from "@models/Notifications"; +import * as themes from "@themes/index"; +import { getBasePath } from "@utils/BasePath"; +import { getRememberMe, getResetPassword, getTheme } from "@utils/Configuration"; +import RegisterOneTimePassword from "@views/DeviceRegistration/RegisterOneTimePassword"; +import RegisterSecurityKey from "@views/DeviceRegistration/RegisterSecurityKey"; +import ConsentView from "@views/LoginPortal/ConsentView/ConsentView"; +import LoginPortal from "@views/LoginPortal/LoginPortal"; +import SignOut from "@views/LoginPortal/SignOut/SignOut"; +import ResetPasswordStep1 from "@views/ResetPassword/ResetPasswordStep1"; +import ResetPasswordStep2 from "@views/ResetPassword/ResetPasswordStep2"; import "@fortawesome/fontawesome-svg-core/styles.css"; diff --git a/web/src/components/AppStoreBadges.test.tsx b/web/src/components/AppStoreBadges.test.tsx index 54fa554d..71c5dbd7 100644 --- a/web/src/components/AppStoreBadges.test.tsx +++ b/web/src/components/AppStoreBadges.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import ReactDOM from "react-dom"; -import AppStoreBadges from "./AppStoreBadges"; +import AppStoreBadges from "@components/AppStoreBadges"; it("renders without crashing", () => { const div = document.createElement("div"); diff --git a/web/src/components/AppStoreBadges.tsx b/web/src/components/AppStoreBadges.tsx index 66417dc5..048c7068 100644 --- a/web/src/components/AppStoreBadges.tsx +++ b/web/src/components/AppStoreBadges.tsx @@ -2,8 +2,8 @@ import React from "react"; import { Link } from "@material-ui/core"; -import AppleStore from "../assets/images/applestore-badge.svg"; -import GooglePlay from "../assets/images/googleplay-badge.svg"; +import AppleStore from "@assets/images/applestore-badge.svg"; +import GooglePlay from "@assets/images/googleplay-badge.svg"; export interface Props { iconSize: number; diff --git a/web/src/components/ColoredSnackbarContent.test.tsx b/web/src/components/ColoredSnackbarContent.test.tsx index 3ffbe4e2..bf39739c 100644 --- a/web/src/components/ColoredSnackbarContent.test.tsx +++ b/web/src/components/ColoredSnackbarContent.test.tsx @@ -5,7 +5,7 @@ import { expect } from "chai"; import { mount, shallow } from "enzyme"; import ReactDOM from "react-dom"; -import ColoredSnackbarContent from "./ColoredSnackbarContent"; +import ColoredSnackbarContent from "@components/ColoredSnackbarContent"; it("renders without crashing", () => { const div = document.createElement("div"); diff --git a/web/src/components/FailureIcon.test.tsx b/web/src/components/FailureIcon.test.tsx index e0169817..64ca3cf1 100644 --- a/web/src/components/FailureIcon.test.tsx +++ b/web/src/components/FailureIcon.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { mount } from "enzyme"; -import FailureIcon from "./FailureIcon"; +import FailureIcon from "@components/FailureIcon"; it("renders without crashing", () => { mount(); diff --git a/web/src/components/FingerTouchIcon.test.tsx b/web/src/components/FingerTouchIcon.test.tsx index 31446e02..224d020b 100644 --- a/web/src/components/FingerTouchIcon.test.tsx +++ b/web/src/components/FingerTouchIcon.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { mount } from "enzyme"; -import FingerTouchIcon from "./FingerTouchIcon"; +import FingerTouchIcon from "@components/FingerTouchIcon"; it("renders without crashing", () => { mount(); diff --git a/web/src/components/FingerTouchIcon.tsx b/web/src/components/FingerTouchIcon.tsx index d7c9ad5a..c4f2d096 100644 --- a/web/src/components/FingerTouchIcon.tsx +++ b/web/src/components/FingerTouchIcon.tsx @@ -2,7 +2,7 @@ import React from "react"; import classnames from "classnames"; -import style from "./FingerTouchIcon.module.css"; +import style from "@components/FingerTouchIcon.module.css"; export interface Props { size: number; diff --git a/web/src/components/FixedTextField.test.tsx b/web/src/components/FixedTextField.test.tsx index af6b8a4a..e9bd64ce 100644 --- a/web/src/components/FixedTextField.test.tsx +++ b/web/src/components/FixedTextField.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { mount } from "enzyme"; -import FixedTextField from "./FixedTextField"; +import FixedTextField from "@components/FixedTextField"; it("renders without crashing", () => { mount(); diff --git a/web/src/components/InformationIcon.test.tsx b/web/src/components/InformationIcon.test.tsx index 8bd2ca55..166dacf6 100644 --- a/web/src/components/InformationIcon.test.tsx +++ b/web/src/components/InformationIcon.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { mount } from "enzyme"; -import InformationIcon from "./InformationIcon"; +import InformationIcon from "@components/InformationIcon"; it("renders without crashing", () => { mount(); diff --git a/web/src/components/LinearProgressBar.test.tsx b/web/src/components/LinearProgressBar.test.tsx index e436bc5b..aacc5750 100644 --- a/web/src/components/LinearProgressBar.test.tsx +++ b/web/src/components/LinearProgressBar.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { mount } from "enzyme"; -import LinearProgressBar from "./LinearProgressBar"; +import LinearProgressBar from "@components/LinearProgressBar"; it("renders without crashing", () => { mount(); diff --git a/web/src/components/NotificationBar.test.tsx b/web/src/components/NotificationBar.test.tsx index 26fc81f4..8c8dae20 100644 --- a/web/src/components/NotificationBar.test.tsx +++ b/web/src/components/NotificationBar.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { mount } from "enzyme"; -import NotificationBar from "./NotificationBar"; +import NotificationBar from "@components/NotificationBar"; it("renders without crashing", () => { mount( {}} />); diff --git a/web/src/components/NotificationBar.tsx b/web/src/components/NotificationBar.tsx index b58e2c90..eec12db2 100644 --- a/web/src/components/NotificationBar.tsx +++ b/web/src/components/NotificationBar.tsx @@ -2,9 +2,9 @@ import React, { useState, useEffect } from "react"; import { Snackbar } from "@material-ui/core"; -import { useNotifications } from "../hooks/NotificationsContext"; -import { Notification } from "../models/Notifications"; -import ColoredSnackbarContent from "./ColoredSnackbarContent"; +import ColoredSnackbarContent from "@components/ColoredSnackbarContent"; +import { useNotifications } from "@hooks/NotificationsContext"; +import { Notification } from "@models/Notifications"; export interface Props { onClose: () => void; diff --git a/web/src/components/PieChartIcon.test.tsx b/web/src/components/PieChartIcon.test.tsx index 2a59a6c7..5f863847 100644 --- a/web/src/components/PieChartIcon.test.tsx +++ b/web/src/components/PieChartIcon.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { mount } from "enzyme"; -import PieChartIcon from "./PieChartIcon"; +import PieChartIcon from "@components/PieChartIcon"; it("renders without crashing", () => { mount(); diff --git a/web/src/components/PushNotificationIcon.test.tsx b/web/src/components/PushNotificationIcon.test.tsx index e11dad58..a842114b 100644 --- a/web/src/components/PushNotificationIcon.test.tsx +++ b/web/src/components/PushNotificationIcon.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { mount } from "enzyme"; -import PushNotificationIcon from "./PushNotificationIcon"; +import PushNotificationIcon from "@components/PushNotificationIcon"; it("renders without crashing", () => { mount(); diff --git a/web/src/components/PushNotificationIcon.tsx b/web/src/components/PushNotificationIcon.tsx index 9842b7ec..590bb1d0 100644 --- a/web/src/components/PushNotificationIcon.tsx +++ b/web/src/components/PushNotificationIcon.tsx @@ -1,7 +1,7 @@ import React from "react"; -import { useIntermittentClass } from "../hooks/IntermittentClass"; -import style from "./PushNotificationIcon.module.css"; +import style from "@components/PushNotificationIcon.module.css"; +import { useIntermittentClass } from "@hooks/IntermittentClass"; export interface Props { width: number; diff --git a/web/src/components/SuccessIcon.test.tsx b/web/src/components/SuccessIcon.test.tsx index b7e46093..a5f2069c 100644 --- a/web/src/components/SuccessIcon.test.tsx +++ b/web/src/components/SuccessIcon.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { mount } from "enzyme"; -import SuccessIcon from "./SuccessIcon"; +import SuccessIcon from "@components/SuccessIcon"; it("renders without crashing", () => { mount(); diff --git a/web/src/components/TimerIcon.test.tsx b/web/src/components/TimerIcon.test.tsx index 9c2a8a36..8a6d426a 100644 --- a/web/src/components/TimerIcon.test.tsx +++ b/web/src/components/TimerIcon.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { mount } from "enzyme"; -import TimerIcon from "./TimerIcon"; +import TimerIcon from "@components/TimerIcon"; it("renders without crashing", () => { mount(); diff --git a/web/src/components/TimerIcon.tsx b/web/src/components/TimerIcon.tsx index 48d3510e..dec5548a 100644 --- a/web/src/components/TimerIcon.tsx +++ b/web/src/components/TimerIcon.tsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from "react"; -import PieChartIcon from "./PieChartIcon"; +import PieChartIcon from "@components/PieChartIcon"; export interface Props { width: number; diff --git a/web/src/Routes.ts b/web/src/constants/Routes.ts similarity index 100% rename from web/src/Routes.ts rename to web/src/constants/Routes.ts diff --git a/web/src/constants.ts b/web/src/constants/constants.ts similarity index 100% rename from web/src/constants.ts rename to web/src/constants/constants.ts diff --git a/web/src/hooks/Configuration.ts b/web/src/hooks/Configuration.ts index bc3f6a3e..97e7d6ba 100644 --- a/web/src/hooks/Configuration.ts +++ b/web/src/hooks/Configuration.ts @@ -1,5 +1,5 @@ -import { getConfiguration } from "../services/Configuration"; -import { useRemoteCall } from "./RemoteCall"; +import { useRemoteCall } from "@hooks/RemoteCall"; +import { getConfiguration } from "@services/Configuration"; export function useConfiguration() { return useRemoteCall(getConfiguration, []); diff --git a/web/src/hooks/Consent.ts b/web/src/hooks/Consent.ts index 9a7023b2..4c7c7fed 100644 --- a/web/src/hooks/Consent.ts +++ b/web/src/hooks/Consent.ts @@ -1,5 +1,5 @@ -import { getRequestedScopes } from "../services/Consent"; -import { useRemoteCall } from "./RemoteCall"; +import { useRemoteCall } from "@hooks/RemoteCall"; +import { getRequestedScopes } from "@services/Consent"; export function useRequestedScopes() { return useRemoteCall(getRequestedScopes, []); diff --git a/web/src/hooks/NotificationsContext.ts b/web/src/hooks/NotificationsContext.ts index 0cacc3c5..4a2d5ec5 100644 --- a/web/src/hooks/NotificationsContext.ts +++ b/web/src/hooks/NotificationsContext.ts @@ -1,7 +1,7 @@ import { useCallback, createContext, useContext } from "react"; -import { Level } from "../components/ColoredSnackbarContent"; -import { Notification } from "../models/Notifications"; +import { Level } from "@components/ColoredSnackbarContent"; +import { Notification } from "@models/Notifications"; const defaultOptions = { timeout: 5, diff --git a/web/src/hooks/State.ts b/web/src/hooks/State.ts index f3c16e8b..7d30b0ca 100644 --- a/web/src/hooks/State.ts +++ b/web/src/hooks/State.ts @@ -1,5 +1,5 @@ -import { getState } from "../services/State"; -import { useRemoteCall } from "./RemoteCall"; +import { useRemoteCall } from "@hooks/RemoteCall"; +import { getState } from "@services/State"; export function useAutheliaState() { return useRemoteCall(getState, []); diff --git a/web/src/hooks/UserInfo.ts b/web/src/hooks/UserInfo.ts index 96e34f44..b59ede4d 100644 --- a/web/src/hooks/UserInfo.ts +++ b/web/src/hooks/UserInfo.ts @@ -1,5 +1,5 @@ -import { getUserPreferences } from "../services/UserPreferences"; -import { useRemoteCall } from "./RemoteCall"; +import { useRemoteCall } from "@hooks/RemoteCall"; +import { getUserPreferences } from "@services/UserPreferences"; export function useUserPreferences() { return useRemoteCall(getUserPreferences, []); diff --git a/web/src/index.tsx b/web/src/index.tsx index c77f5cf3..04d408f3 100644 --- a/web/src/index.tsx +++ b/web/src/index.tsx @@ -1,12 +1,12 @@ -import "./utils/AssetPath"; +import "@utils/AssetPath"; import React from "react"; import ReactDOM from "react-dom"; -import "./index.css"; -import App from "./App"; -import * as serviceWorker from "./serviceWorker"; +import "@root/index.css"; +import App from "@root/App"; +import * as serviceWorker from "@root/serviceWorker"; ReactDOM.render(, document.getElementById("root")); diff --git a/web/src/layouts/LoginLayout.tsx b/web/src/layouts/LoginLayout.tsx index 81a6106d..8d743a08 100644 --- a/web/src/layouts/LoginLayout.tsx +++ b/web/src/layouts/LoginLayout.tsx @@ -3,7 +3,7 @@ import React, { ReactNode } from "react"; import { Grid, makeStyles, Container, Typography, Link } from "@material-ui/core"; import { grey } from "@material-ui/core/colors"; -import { ReactComponent as UserSvg } from "../assets/images/user.svg"; +import { ReactComponent as UserSvg } from "@assets/images/user.svg"; export interface Props { id?: string; diff --git a/web/src/models/Configuration.ts b/web/src/models/Configuration.ts index 01bd10ef..fa0c2751 100644 --- a/web/src/models/Configuration.ts +++ b/web/src/models/Configuration.ts @@ -1,4 +1,4 @@ -import { SecondFactorMethod } from "./Methods"; +import { SecondFactorMethod } from "@models/Methods"; export interface Configuration { available_methods: Set; diff --git a/web/src/models/Notifications.ts b/web/src/models/Notifications.ts index 321a0c08..b97e1f1f 100644 --- a/web/src/models/Notifications.ts +++ b/web/src/models/Notifications.ts @@ -1,4 +1,4 @@ -import { Level } from "../components/ColoredSnackbarContent"; +import { Level } from "@components/ColoredSnackbarContent"; export interface Notification { message: string; diff --git a/web/src/models/UserInfo.ts b/web/src/models/UserInfo.ts index ead0752d..85059f54 100644 --- a/web/src/models/UserInfo.ts +++ b/web/src/models/UserInfo.ts @@ -1,4 +1,4 @@ -import { SecondFactorMethod } from "./Methods"; +import { SecondFactorMethod } from "@models/Methods"; export interface UserInfo { display_name: string; diff --git a/web/src/services/Api.ts b/web/src/services/Api.ts index a298723d..8c90d166 100644 --- a/web/src/services/Api.ts +++ b/web/src/services/Api.ts @@ -1,6 +1,6 @@ import { AxiosResponse } from "axios"; -import { getBasePath } from "../utils/BasePath"; +import { getBasePath } from "@utils/BasePath"; const basePath = getBasePath(); diff --git a/web/src/services/Client.ts b/web/src/services/Client.ts index 3c65d9a1..d63459dd 100644 --- a/web/src/services/Client.ts +++ b/web/src/services/Client.ts @@ -1,6 +1,6 @@ import axios from "axios"; -import { ServiceResponse, hasServiceError, toData } from "./Api"; +import { ServiceResponse, hasServiceError, toData } from "@services/Api"; export async function PostWithOptionalResponse(path: string, body?: any): Promise { const res = await axios.post>(path, body); diff --git a/web/src/services/Configuration.ts b/web/src/services/Configuration.ts index 0d6bcdd3..0bbb4349 100644 --- a/web/src/services/Configuration.ts +++ b/web/src/services/Configuration.ts @@ -1,7 +1,7 @@ -import { Configuration } from "../models/Configuration"; -import { ConfigurationPath } from "./Api"; -import { Get } from "./Client"; -import { toEnum, Method2FA } from "./UserPreferences"; +import { Configuration } from "@models/Configuration"; +import { ConfigurationPath } from "@services/Api"; +import { Get } from "@services/Client"; +import { toEnum, Method2FA } from "@services/UserPreferences"; interface ConfigurationPayload { available_methods: Method2FA[]; diff --git a/web/src/services/Consent.ts b/web/src/services/Consent.ts index da38e11c..e3a9e35a 100644 --- a/web/src/services/Consent.ts +++ b/web/src/services/Consent.ts @@ -1,5 +1,5 @@ -import { ConsentPath } from "./Api"; -import { Post, Get } from "./Client"; +import { ConsentPath } from "@services/Api"; +import { Post, Get } from "@services/Client"; interface ConsentPostRequestBody { client_id: string; diff --git a/web/src/services/FirstFactor.ts b/web/src/services/FirstFactor.ts index 708dd82c..120e9d54 100644 --- a/web/src/services/FirstFactor.ts +++ b/web/src/services/FirstFactor.ts @@ -1,6 +1,6 @@ -import { FirstFactorPath } from "./Api"; -import { PostWithOptionalResponse } from "./Client"; -import { SignInResponse } from "./SignIn"; +import { FirstFactorPath } from "@services/Api"; +import { PostWithOptionalResponse } from "@services/Client"; +import { SignInResponse } from "@services/SignIn"; interface PostFirstFactorBody { username: string; diff --git a/web/src/services/OneTimePassword.ts b/web/src/services/OneTimePassword.ts index 687a6a86..72707ded 100644 --- a/web/src/services/OneTimePassword.ts +++ b/web/src/services/OneTimePassword.ts @@ -1,6 +1,6 @@ -import { CompleteTOTPSignInPath } from "./Api"; -import { PostWithOptionalResponse } from "./Client"; -import { SignInResponse } from "./SignIn"; +import { CompleteTOTPSignInPath } from "@services/Api"; +import { PostWithOptionalResponse } from "@services/Client"; +import { SignInResponse } from "@services/SignIn"; interface CompleteU2FSigninBody { token: string; diff --git a/web/src/services/PushNotification.ts b/web/src/services/PushNotification.ts index 66bfefca..ec3db5b8 100644 --- a/web/src/services/PushNotification.ts +++ b/web/src/services/PushNotification.ts @@ -1,6 +1,6 @@ -import { CompletePushNotificationSignInPath } from "./Api"; -import { PostWithOptionalResponse } from "./Client"; -import { SignInResponse } from "./SignIn"; +import { CompletePushNotificationSignInPath } from "@services/Api"; +import { PostWithOptionalResponse } from "@services/Client"; +import { SignInResponse } from "@services/SignIn"; interface CompleteU2FSigninBody { targetURL?: string; diff --git a/web/src/services/RegisterDevice.ts b/web/src/services/RegisterDevice.ts index ce4cb761..82e9c9b2 100644 --- a/web/src/services/RegisterDevice.ts +++ b/web/src/services/RegisterDevice.ts @@ -6,8 +6,8 @@ import { InitiateU2FRegistrationPath, CompleteU2FRegistrationStep1Path, CompleteU2FRegistrationStep2Path, -} from "./Api"; -import { Post, PostWithOptionalResponse } from "./Client"; +} from "@services/Api"; +import { Post, PostWithOptionalResponse } from "@services/Client"; export async function initiateTOTPRegistrationProcess() { await PostWithOptionalResponse(InitiateTOTPRegistrationPath); diff --git a/web/src/services/ResetPassword.ts b/web/src/services/ResetPassword.ts index 48612a89..02cdb918 100644 --- a/web/src/services/ResetPassword.ts +++ b/web/src/services/ResetPassword.ts @@ -1,5 +1,5 @@ -import { InitiateResetPasswordPath, CompleteResetPasswordPath, ResetPasswordPath } from "./Api"; -import { PostWithOptionalResponse } from "./Client"; +import { InitiateResetPasswordPath, CompleteResetPasswordPath, ResetPasswordPath } from "@services/Api"; +import { PostWithOptionalResponse } from "@services/Client"; export async function initiateResetPasswordProcess(username: string) { return PostWithOptionalResponse(InitiateResetPasswordPath, { username }); diff --git a/web/src/services/SecurityKey.ts b/web/src/services/SecurityKey.ts index 7db823b5..4cab3f1f 100644 --- a/web/src/services/SecurityKey.ts +++ b/web/src/services/SecurityKey.ts @@ -1,8 +1,8 @@ import u2fApi from "u2f-api"; -import { InitiateU2FSignInPath, CompleteU2FSignInPath } from "./Api"; -import { Post, PostWithOptionalResponse } from "./Client"; -import { SignInResponse } from "./SignIn"; +import { InitiateU2FSignInPath, CompleteU2FSignInPath } from "@services/Api"; +import { Post, PostWithOptionalResponse } from "@services/Client"; +import { SignInResponse } from "@services/SignIn"; interface InitiateU2FSigninResponse { appId: string; diff --git a/web/src/services/SignOut.ts b/web/src/services/SignOut.ts index db5ea971..bba444f5 100644 --- a/web/src/services/SignOut.ts +++ b/web/src/services/SignOut.ts @@ -1,5 +1,5 @@ -import { LogoutPath } from "./Api"; -import { PostWithOptionalResponse } from "./Client"; +import { LogoutPath } from "@services/Api"; +import { PostWithOptionalResponse } from "@services/Client"; export type SignOutResponse = { safeTargetURL: boolean } | undefined; diff --git a/web/src/services/State.ts b/web/src/services/State.ts index b653952e..e603cb04 100644 --- a/web/src/services/State.ts +++ b/web/src/services/State.ts @@ -1,5 +1,5 @@ -import { StatePath } from "./Api"; -import { Get } from "./Client"; +import { StatePath } from "@services/Api"; +import { Get } from "@services/Client"; export enum AuthenticationLevel { Unauthenticated = 0, diff --git a/web/src/services/UserPreferences.ts b/web/src/services/UserPreferences.ts index 9fbb2a81..683dce71 100644 --- a/web/src/services/UserPreferences.ts +++ b/web/src/services/UserPreferences.ts @@ -1,7 +1,7 @@ -import { SecondFactorMethod } from "../models/Methods"; -import { UserInfo } from "../models/UserInfo"; -import { UserInfoPath, UserInfo2FAMethodPath } from "./Api"; -import { Get, PostWithOptionalResponse } from "./Client"; +import { SecondFactorMethod } from "@models/Methods"; +import { UserInfo } from "@models/UserInfo"; +import { UserInfoPath, UserInfo2FAMethodPath } from "@services/Api"; +import { Get, PostWithOptionalResponse } from "@services/Client"; export type Method2FA = "u2f" | "totp" | "mobile_push"; diff --git a/web/src/themes/index.ts b/web/src/themes/index.ts index 0e2da1e6..808905c0 100644 --- a/web/src/themes/index.ts +++ b/web/src/themes/index.ts @@ -13,6 +13,6 @@ declare module "@material-ui/core/styles/createMuiTheme" { } } -export { default as Light } from "./Light"; -export { default as Dark } from "./Dark"; -export { default as Grey } from "./Grey"; +export { default as Light } from "@themes/Light"; +export { default as Dark } from "@themes/Dark"; +export { default as Grey } from "@themes/Grey"; diff --git a/web/src/utils/AssetPath.ts b/web/src/utils/AssetPath.ts index 8ff5e9f4..73fec7a8 100644 --- a/web/src/utils/AssetPath.ts +++ b/web/src/utils/AssetPath.ts @@ -1,4 +1,4 @@ -import { getBasePath } from "./BasePath"; +import { getBasePath } from "@utils/BasePath"; __webpack_public_path__ = "/"; diff --git a/web/src/utils/BasePath.ts b/web/src/utils/BasePath.ts index f09d231e..ea2078d2 100644 --- a/web/src/utils/BasePath.ts +++ b/web/src/utils/BasePath.ts @@ -1,4 +1,4 @@ -import { getEmbeddedVariable } from "./Configuration"; +import { getEmbeddedVariable } from "@utils/Configuration"; export function getBasePath() { return getEmbeddedVariable("basepath"); diff --git a/web/src/views/DeviceRegistration/RegisterOneTimePassword.tsx b/web/src/views/DeviceRegistration/RegisterOneTimePassword.tsx index 04101107..31c47cd6 100644 --- a/web/src/views/DeviceRegistration/RegisterOneTimePassword.tsx +++ b/web/src/views/DeviceRegistration/RegisterOneTimePassword.tsx @@ -8,13 +8,13 @@ import classnames from "classnames"; import QRCode from "qrcode.react"; import { useHistory, useLocation } from "react-router"; -import AppStoreBadges from "../../components/AppStoreBadges"; -import { GoogleAuthenticator } from "../../constants"; -import { useNotifications } from "../../hooks/NotificationsContext"; -import LoginLayout from "../../layouts/LoginLayout"; -import { FirstFactorRoute } from "../../Routes"; -import { completeTOTPRegistrationProcess } from "../../services/RegisterDevice"; -import { extractIdentityToken } from "../../utils/IdentityToken"; +import AppStoreBadges from "@components/AppStoreBadges"; +import { GoogleAuthenticator } from "@constants/constants"; +import { FirstFactorRoute } from "@constants/Routes"; +import { useNotifications } from "@hooks/NotificationsContext"; +import LoginLayout from "@layouts/LoginLayout"; +import { completeTOTPRegistrationProcess } from "@services/RegisterDevice"; +import { extractIdentityToken } from "@utils/IdentityToken"; const RegisterOneTimePassword = function () { const style = useStyles(); diff --git a/web/src/views/DeviceRegistration/RegisterSecurityKey.tsx b/web/src/views/DeviceRegistration/RegisterSecurityKey.tsx index 11cbea3b..1e1d7bb6 100644 --- a/web/src/views/DeviceRegistration/RegisterSecurityKey.tsx +++ b/web/src/views/DeviceRegistration/RegisterSecurityKey.tsx @@ -4,15 +4,12 @@ import { makeStyles, Typography, Button } from "@material-ui/core"; import { useHistory, useLocation } from "react-router"; import u2fApi from "u2f-api"; -import FingerTouchIcon from "../../components/FingerTouchIcon"; -import { useNotifications } from "../../hooks/NotificationsContext"; -import LoginLayout from "../../layouts/LoginLayout"; -import { FirstFactorPath } from "../../services/Api"; -import { - completeU2FRegistrationProcessStep1, - completeU2FRegistrationProcessStep2, -} from "../../services/RegisterDevice"; -import { extractIdentityToken } from "../../utils/IdentityToken"; +import FingerTouchIcon from "@components/FingerTouchIcon"; +import { useNotifications } from "@hooks/NotificationsContext"; +import LoginLayout from "@layouts/LoginLayout"; +import { FirstFactorPath } from "@services/Api"; +import { completeU2FRegistrationProcessStep1, completeU2FRegistrationProcessStep2 } from "@services/RegisterDevice"; +import { extractIdentityToken } from "@utils/IdentityToken"; const RegisterSecurityKey = function () { const style = useStyles(); diff --git a/web/src/views/LoginPortal/Authenticated.tsx b/web/src/views/LoginPortal/Authenticated.tsx index b7a246c4..1f99807b 100644 --- a/web/src/views/LoginPortal/Authenticated.tsx +++ b/web/src/views/LoginPortal/Authenticated.tsx @@ -2,7 +2,7 @@ import React from "react"; import { Typography, makeStyles } from "@material-ui/core"; -import SuccessIcon from "../../components/SuccessIcon"; +import SuccessIcon from "@components/SuccessIcon"; const Authenticated = function () { const classes = useStyles(); diff --git a/web/src/views/LoginPortal/AuthenticatedView/AuthenticatedView.tsx b/web/src/views/LoginPortal/AuthenticatedView/AuthenticatedView.tsx index 2c4a91bb..a82885b9 100644 --- a/web/src/views/LoginPortal/AuthenticatedView/AuthenticatedView.tsx +++ b/web/src/views/LoginPortal/AuthenticatedView/AuthenticatedView.tsx @@ -3,9 +3,9 @@ import React from "react"; import { Grid, makeStyles, Button } from "@material-ui/core"; import { useHistory } from "react-router"; -import LoginLayout from "../../../layouts/LoginLayout"; -import { LogoutRoute as SignOutRoute } from "../../../Routes"; -import Authenticated from "../Authenticated"; +import { LogoutRoute as SignOutRoute } from "@constants/Routes"; +import LoginLayout from "@layouts/LoginLayout"; +import Authenticated from "@views/LoginPortal/Authenticated"; export interface Props { name: string; diff --git a/web/src/views/LoginPortal/ConsentView/ConsentView.tsx b/web/src/views/LoginPortal/ConsentView/ConsentView.tsx index 62437b25..0442a796 100644 --- a/web/src/views/LoginPortal/ConsentView/ConsentView.tsx +++ b/web/src/views/LoginPortal/ConsentView/ConsentView.tsx @@ -4,12 +4,12 @@ import { Button, Grid, List, ListItem, ListItemIcon, ListItemText, Tooltip, make import { AccountBox, CheckBox, Contacts, Drafts, Group } from "@material-ui/icons"; import { useHistory } from "react-router-dom"; -import { useRequestedScopes } from "../../../hooks/Consent"; -import { useNotifications } from "../../../hooks/NotificationsContext"; -import { useRedirector } from "../../../hooks/Redirector"; -import LoginLayout from "../../../layouts/LoginLayout"; -import { acceptConsent, rejectConsent } from "../../../services/Consent"; -import LoadingPage from "../../LoadingPage/LoadingPage"; +import { useRequestedScopes } from "@hooks/Consent"; +import { useNotifications } from "@hooks/NotificationsContext"; +import { useRedirector } from "@hooks/Redirector"; +import LoginLayout from "@layouts/LoginLayout"; +import { acceptConsent, rejectConsent } from "@services/Consent"; +import LoadingPage from "@views/LoadingPage/LoadingPage"; export interface Props {} diff --git a/web/src/views/LoginPortal/FirstFactor/FirstFactorForm.tsx b/web/src/views/LoginPortal/FirstFactor/FirstFactorForm.tsx index 346310ac..a9a34fc6 100644 --- a/web/src/views/LoginPortal/FirstFactor/FirstFactorForm.tsx +++ b/web/src/views/LoginPortal/FirstFactor/FirstFactorForm.tsx @@ -4,13 +4,13 @@ import { makeStyles, Grid, Button, FormControlLabel, Checkbox, Link } from "@mat import classnames from "classnames"; import { useHistory } from "react-router"; -import FixedTextField from "../../../components/FixedTextField"; -import { useNotifications } from "../../../hooks/NotificationsContext"; -import { useRedirectionURL } from "../../../hooks/RedirectionURL"; -import { useRequestMethod } from "../../../hooks/RequestMethod"; -import LoginLayout from "../../../layouts/LoginLayout"; -import { ResetPasswordStep1Route } from "../../../Routes"; -import { postFirstFactor } from "../../../services/FirstFactor"; +import FixedTextField from "@components/FixedTextField"; +import { ResetPasswordStep1Route } from "@constants/Routes"; +import { useNotifications } from "@hooks/NotificationsContext"; +import { useRedirectionURL } from "@hooks/RedirectionURL"; +import { useRequestMethod } from "@hooks/RequestMethod"; +import LoginLayout from "@layouts/LoginLayout"; +import { postFirstFactor } from "@services/FirstFactor"; export interface Props { disabled: boolean; diff --git a/web/src/views/LoginPortal/LoginPortal.tsx b/web/src/views/LoginPortal/LoginPortal.tsx index a53cf8f2..a84d4074 100644 --- a/web/src/views/LoginPortal/LoginPortal.tsx +++ b/web/src/views/LoginPortal/LoginPortal.tsx @@ -2,14 +2,6 @@ import React, { useEffect, Fragment, ReactNode, useState, useCallback } from "re import { Switch, Route, Redirect, useHistory, useLocation } from "react-router"; -import { useConfiguration } from "../../hooks/Configuration"; -import { useNotifications } from "../../hooks/NotificationsContext"; -import { useRedirectionURL } from "../../hooks/RedirectionURL"; -import { useRedirector } from "../../hooks/Redirector"; -import { useRequestMethod } from "../../hooks/RequestMethod"; -import { useAutheliaState } from "../../hooks/State"; -import { useUserPreferences as userUserInfo } from "../../hooks/UserInfo"; -import { SecondFactorMethod } from "../../models/Methods"; import { FirstFactorRoute, SecondFactorRoute, @@ -17,12 +9,20 @@ import { SecondFactorPushRoute, SecondFactorU2FRoute, AuthenticatedRoute, -} from "../../Routes"; -import { AuthenticationLevel } from "../../services/State"; -import LoadingPage from "../LoadingPage/LoadingPage"; -import AuthenticatedView from "./AuthenticatedView/AuthenticatedView"; -import FirstFactorForm from "./FirstFactor/FirstFactorForm"; -import SecondFactorForm from "./SecondFactor/SecondFactorForm"; +} from "@constants/Routes"; +import { useConfiguration } from "@hooks/Configuration"; +import { useNotifications } from "@hooks/NotificationsContext"; +import { useRedirectionURL } from "@hooks/RedirectionURL"; +import { useRedirector } from "@hooks/Redirector"; +import { useRequestMethod } from "@hooks/RequestMethod"; +import { useAutheliaState } from "@hooks/State"; +import { useUserPreferences as userUserInfo } from "@hooks/UserInfo"; +import { SecondFactorMethod } from "@models/Methods"; +import { AuthenticationLevel } from "@services/State"; +import LoadingPage from "@views/LoadingPage/LoadingPage"; +import AuthenticatedView from "@views/LoginPortal/AuthenticatedView/AuthenticatedView"; +import FirstFactorForm from "@views/LoginPortal/FirstFactor/FirstFactorForm"; +import SecondFactorForm from "@views/LoginPortal/SecondFactor/SecondFactorForm"; export interface Props { rememberMe: boolean; diff --git a/web/src/views/LoginPortal/SecondFactor/MethodContainer.tsx b/web/src/views/LoginPortal/SecondFactor/MethodContainer.tsx index eb3db926..e91cd0a6 100644 --- a/web/src/views/LoginPortal/SecondFactor/MethodContainer.tsx +++ b/web/src/views/LoginPortal/SecondFactor/MethodContainer.tsx @@ -3,8 +3,8 @@ import React, { ReactNode, Fragment } from "react"; import { makeStyles, Typography, Link, useTheme } from "@material-ui/core"; import classnames from "classnames"; -import InformationIcon from "../../../components/InformationIcon"; -import Authenticated from "../Authenticated"; +import InformationIcon from "@components/InformationIcon"; +import Authenticated from "@views/LoginPortal/Authenticated"; export enum State { ALREADY_AUTHENTICATED = 1, diff --git a/web/src/views/LoginPortal/SecondFactor/MethodSelectionDialog.tsx b/web/src/views/LoginPortal/SecondFactor/MethodSelectionDialog.tsx index 172a2d27..9c82cc26 100644 --- a/web/src/views/LoginPortal/SecondFactor/MethodSelectionDialog.tsx +++ b/web/src/views/LoginPortal/SecondFactor/MethodSelectionDialog.tsx @@ -11,10 +11,10 @@ import { useTheme, } from "@material-ui/core"; -import FingerTouchIcon from "../../../components/FingerTouchIcon"; -import PushNotificationIcon from "../../../components/PushNotificationIcon"; -import TimerIcon from "../../../components/TimerIcon"; -import { SecondFactorMethod } from "../../../models/Methods"; +import FingerTouchIcon from "@components/FingerTouchIcon"; +import PushNotificationIcon from "@components/PushNotificationIcon"; +import TimerIcon from "@components/TimerIcon"; +import { SecondFactorMethod } from "@models/Methods"; export interface Props { open: boolean; diff --git a/web/src/views/LoginPortal/SecondFactor/OTPDial.tsx b/web/src/views/LoginPortal/SecondFactor/OTPDial.tsx index 923d4189..73c9d0e5 100644 --- a/web/src/views/LoginPortal/SecondFactor/OTPDial.tsx +++ b/web/src/views/LoginPortal/SecondFactor/OTPDial.tsx @@ -4,10 +4,10 @@ import { makeStyles } from "@material-ui/core"; import classnames from "classnames"; import OtpInput from "react-otp-input"; -import SuccessIcon from "../../../components/SuccessIcon"; -import TimerIcon from "../../../components/TimerIcon"; -import IconWithContext from "./IconWithContext"; -import { State } from "./OneTimePasswordMethod"; +import SuccessIcon from "@components/SuccessIcon"; +import TimerIcon from "@components/TimerIcon"; +import IconWithContext from "@views/LoginPortal/SecondFactor/IconWithContext"; +import { State } from "@views/LoginPortal/SecondFactor/OneTimePasswordMethod"; export interface Props { passcode: string; diff --git a/web/src/views/LoginPortal/SecondFactor/OneTimePasswordMethod.tsx b/web/src/views/LoginPortal/SecondFactor/OneTimePasswordMethod.tsx index 128d8800..6a75d387 100644 --- a/web/src/views/LoginPortal/SecondFactor/OneTimePasswordMethod.tsx +++ b/web/src/views/LoginPortal/SecondFactor/OneTimePasswordMethod.tsx @@ -1,10 +1,10 @@ import React, { useState, useEffect, useCallback } from "react"; -import { useRedirectionURL } from "../../../hooks/RedirectionURL"; -import { completeTOTPSignIn } from "../../../services/OneTimePassword"; -import { AuthenticationLevel } from "../../../services/State"; -import MethodContainer, { State as MethodContainerState } from "./MethodContainer"; -import OTPDial from "./OTPDial"; +import { useRedirectionURL } from "@hooks/RedirectionURL"; +import { completeTOTPSignIn } from "@services/OneTimePassword"; +import { AuthenticationLevel } from "@services/State"; +import MethodContainer, { State as MethodContainerState } from "@views/LoginPortal/SecondFactor/MethodContainer"; +import OTPDial from "@views/LoginPortal/SecondFactor/OTPDial"; export enum State { Idle = 1, diff --git a/web/src/views/LoginPortal/SecondFactor/PushNotificationMethod.tsx b/web/src/views/LoginPortal/SecondFactor/PushNotificationMethod.tsx index 14b7a487..e4a789e2 100644 --- a/web/src/views/LoginPortal/SecondFactor/PushNotificationMethod.tsx +++ b/web/src/views/LoginPortal/SecondFactor/PushNotificationMethod.tsx @@ -2,14 +2,14 @@ import React, { useEffect, useCallback, useState, ReactNode } from "react"; import { Button, makeStyles } from "@material-ui/core"; -import FailureIcon from "../../../components/FailureIcon"; -import PushNotificationIcon from "../../../components/PushNotificationIcon"; -import SuccessIcon from "../../../components/SuccessIcon"; -import { useIsMountedRef } from "../../../hooks/Mounted"; -import { useRedirectionURL } from "../../../hooks/RedirectionURL"; -import { completePushNotificationSignIn } from "../../../services/PushNotification"; -import { AuthenticationLevel } from "../../../services/State"; -import MethodContainer, { State as MethodContainerState } from "./MethodContainer"; +import FailureIcon from "@components/FailureIcon"; +import PushNotificationIcon from "@components/PushNotificationIcon"; +import SuccessIcon from "@components/SuccessIcon"; +import { useIsMountedRef } from "@hooks/Mounted"; +import { useRedirectionURL } from "@hooks/RedirectionURL"; +import { completePushNotificationSignIn } from "@services/PushNotification"; +import { AuthenticationLevel } from "@services/State"; +import MethodContainer, { State as MethodContainerState } from "@views/LoginPortal/SecondFactor/MethodContainer"; export enum State { SignInInProgress = 1, diff --git a/web/src/views/LoginPortal/SecondFactor/SecondFactorForm.tsx b/web/src/views/LoginPortal/SecondFactor/SecondFactorForm.tsx index 212a3dcc..896395e4 100644 --- a/web/src/views/LoginPortal/SecondFactor/SecondFactorForm.tsx +++ b/web/src/views/LoginPortal/SecondFactor/SecondFactorForm.tsx @@ -4,25 +4,25 @@ import { Grid, makeStyles, Button } from "@material-ui/core"; import { useHistory, Switch, Route, Redirect } from "react-router"; import u2fApi from "u2f-api"; -import { useNotifications } from "../../../hooks/NotificationsContext"; -import LoginLayout from "../../../layouts/LoginLayout"; -import { Configuration } from "../../../models/Configuration"; -import { SecondFactorMethod } from "../../../models/Methods"; -import { UserInfo } from "../../../models/UserInfo"; import { LogoutRoute as SignOutRoute, SecondFactorTOTPRoute, SecondFactorPushRoute, SecondFactorU2FRoute, SecondFactorRoute, -} from "../../../Routes"; -import { initiateTOTPRegistrationProcess, initiateU2FRegistrationProcess } from "../../../services/RegisterDevice"; -import { AuthenticationLevel } from "../../../services/State"; -import { setPreferred2FAMethod } from "../../../services/UserPreferences"; -import MethodSelectionDialog from "./MethodSelectionDialog"; -import OneTimePasswordMethod from "./OneTimePasswordMethod"; -import PushNotificationMethod from "./PushNotificationMethod"; -import SecurityKeyMethod from "./SecurityKeyMethod"; +} from "@constants/Routes"; +import { useNotifications } from "@hooks/NotificationsContext"; +import LoginLayout from "@layouts/LoginLayout"; +import { Configuration } from "@models/Configuration"; +import { SecondFactorMethod } from "@models/Methods"; +import { UserInfo } from "@models/UserInfo"; +import { initiateTOTPRegistrationProcess, initiateU2FRegistrationProcess } from "@services/RegisterDevice"; +import { AuthenticationLevel } from "@services/State"; +import { setPreferred2FAMethod } from "@services/UserPreferences"; +import MethodSelectionDialog from "@views/LoginPortal/SecondFactor/MethodSelectionDialog"; +import OneTimePasswordMethod from "@views/LoginPortal/SecondFactor/OneTimePasswordMethod"; +import PushNotificationMethod from "@views/LoginPortal/SecondFactor/PushNotificationMethod"; +import SecurityKeyMethod from "@views/LoginPortal/SecondFactor/SecurityKeyMethod"; const EMAIL_SENT_NOTIFICATION = "An email has been sent to your address to complete the process."; diff --git a/web/src/views/LoginPortal/SecondFactor/SecurityKeyMethod.tsx b/web/src/views/LoginPortal/SecondFactor/SecurityKeyMethod.tsx index 737abfea..dad2284e 100644 --- a/web/src/views/LoginPortal/SecondFactor/SecurityKeyMethod.tsx +++ b/web/src/views/LoginPortal/SecondFactor/SecurityKeyMethod.tsx @@ -4,16 +4,16 @@ import { makeStyles, Button, useTheme } from "@material-ui/core"; import { CSSProperties } from "@material-ui/styles"; import u2fApi from "u2f-api"; -import FailureIcon from "../../../components/FailureIcon"; -import FingerTouchIcon from "../../../components/FingerTouchIcon"; -import LinearProgressBar from "../../../components/LinearProgressBar"; -import { useIsMountedRef } from "../../../hooks/Mounted"; -import { useRedirectionURL } from "../../../hooks/RedirectionURL"; -import { useTimer } from "../../../hooks/Timer"; -import { initiateU2FSignin, completeU2FSignin } from "../../../services/SecurityKey"; -import { AuthenticationLevel } from "../../../services/State"; -import IconWithContext from "./IconWithContext"; -import MethodContainer, { State as MethodContainerState } from "./MethodContainer"; +import FailureIcon from "@components/FailureIcon"; +import FingerTouchIcon from "@components/FingerTouchIcon"; +import LinearProgressBar from "@components/LinearProgressBar"; +import { useIsMountedRef } from "@hooks/Mounted"; +import { useRedirectionURL } from "@hooks/RedirectionURL"; +import { useTimer } from "@hooks/Timer"; +import { initiateU2FSignin, completeU2FSignin } from "@services/SecurityKey"; +import { AuthenticationLevel } from "@services/State"; +import IconWithContext from "@views/LoginPortal/SecondFactor/IconWithContext"; +import MethodContainer, { State as MethodContainerState } from "@views/LoginPortal/SecondFactor/MethodContainer"; export enum State { WaitTouch = 1, diff --git a/web/src/views/LoginPortal/SignOut/SignOut.tsx b/web/src/views/LoginPortal/SignOut/SignOut.tsx index dd9e6b6b..304adcd3 100644 --- a/web/src/views/LoginPortal/SignOut/SignOut.tsx +++ b/web/src/views/LoginPortal/SignOut/SignOut.tsx @@ -3,13 +3,13 @@ import React, { useEffect, useCallback, useState } from "react"; import { Typography, makeStyles } from "@material-ui/core"; import { Redirect } from "react-router"; -import { useIsMountedRef } from "../../../hooks/Mounted"; -import { useNotifications } from "../../../hooks/NotificationsContext"; -import { useRedirectionURL } from "../../../hooks/RedirectionURL"; -import { useRedirector } from "../../../hooks/Redirector"; -import LoginLayout from "../../../layouts/LoginLayout"; -import { FirstFactorRoute } from "../../../Routes"; -import { signOut } from "../../../services/SignOut"; +import { FirstFactorRoute } from "@constants/Routes"; +import { useIsMountedRef } from "@hooks/Mounted"; +import { useNotifications } from "@hooks/NotificationsContext"; +import { useRedirectionURL } from "@hooks/RedirectionURL"; +import { useRedirector } from "@hooks/Redirector"; +import LoginLayout from "@layouts/LoginLayout"; +import { signOut } from "@services/SignOut"; export interface Props {} diff --git a/web/src/views/ResetPassword/ResetPasswordStep1.tsx b/web/src/views/ResetPassword/ResetPasswordStep1.tsx index 97e52f39..8db00202 100644 --- a/web/src/views/ResetPassword/ResetPasswordStep1.tsx +++ b/web/src/views/ResetPassword/ResetPasswordStep1.tsx @@ -3,11 +3,11 @@ import React, { useState } from "react"; import { Grid, Button, makeStyles } from "@material-ui/core"; import { useHistory } from "react-router"; -import FixedTextField from "../../components/FixedTextField"; -import { useNotifications } from "../../hooks/NotificationsContext"; -import LoginLayout from "../../layouts/LoginLayout"; -import { FirstFactorRoute } from "../../Routes"; -import { initiateResetPasswordProcess } from "../../services/ResetPassword"; +import FixedTextField from "@components/FixedTextField"; +import { FirstFactorRoute } from "@constants/Routes"; +import { useNotifications } from "@hooks/NotificationsContext"; +import LoginLayout from "@layouts/LoginLayout"; +import { initiateResetPasswordProcess } from "@services/ResetPassword"; const ResetPasswordStep1 = function () { const style = useStyles(); diff --git a/web/src/views/ResetPassword/ResetPasswordStep2.tsx b/web/src/views/ResetPassword/ResetPasswordStep2.tsx index af3dc5b7..4bdc7706 100644 --- a/web/src/views/ResetPassword/ResetPasswordStep2.tsx +++ b/web/src/views/ResetPassword/ResetPasswordStep2.tsx @@ -4,12 +4,12 @@ import { Grid, Button, makeStyles } from "@material-ui/core"; import classnames from "classnames"; import { useHistory, useLocation } from "react-router"; -import FixedTextField from "../../components/FixedTextField"; -import { useNotifications } from "../../hooks/NotificationsContext"; -import LoginLayout from "../../layouts/LoginLayout"; -import { FirstFactorRoute } from "../../Routes"; -import { completeResetPasswordProcess, resetPassword } from "../../services/ResetPassword"; -import { extractIdentityToken } from "../../utils/IdentityToken"; +import FixedTextField from "@components/FixedTextField"; +import { FirstFactorRoute } from "@constants/Routes"; +import { useNotifications } from "@hooks/NotificationsContext"; +import LoginLayout from "@layouts/LoginLayout"; +import { completeResetPasswordProcess, resetPassword } from "@services/ResetPassword"; +import { extractIdentityToken } from "@utils/IdentityToken"; const ResetPasswordStep2 = function () { const style = useStyles(); diff --git a/web/tsconfig.aliases.json b/web/tsconfig.aliases.json new file mode 100644 index 00000000..bc8ca652 --- /dev/null +++ b/web/tsconfig.aliases.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "baseUrl": "./src", + "jsx": "preserve", + "paths": { + "@root/*": ["./*"], + "@assets/*": ["assets/*"], + "@components/*": ["components/*"], + "@constants/*": ["constants/*"], + "@hooks/*": ["hooks/*"], + "@layouts/*": ["layouts/*"], + "@models/*": ["models/*"], + "@services/*": ["services/*"], + "@themes/*": ["themes/*"], + "@utils/*": ["utils/*"], + "@views/*": ["views/*"] + } + } +} \ No newline at end of file diff --git a/web/tsconfig.json b/web/tsconfig.json index 8c812cc5..4d90f841 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -1,4 +1,5 @@ { + "extends": "./tsconfig.aliases.json", "compilerOptions": { "target": "es5", "lib": [ @@ -24,5 +25,10 @@ ".*.js", "src", "types" + ], + "exclude": [ + "node_modules", + "build", + "coverage" ] } diff --git a/web/yarn.lock b/web/yarn.lock index 1e09ca85..3106b705 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -1876,7 +1876,7 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@craco/craco@6.1.2": +"@craco/craco@^6.1.2": version "6.1.2" resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-6.1.2.tgz#30e45288e4609ac6b8cf828085b34acebdc60e69" integrity sha512-GlQZn+g+yNlaDvIL5m6mcCoBGyFDwO4kkNx3fNFf98wuldkdWyBFoQbtOFOIb4gvkTh4VntOOxtJEoZfKs7XXw== @@ -4563,6 +4563,11 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +craco-alias@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/craco-alias/-/craco-alias-3.0.1.tgz#45e5cb338b222a7f62d17e398b54aff7cf1572af" + integrity sha512-N+Qaf/Gr/f3o5ZH2TQjMu5NhR9PnT1ZYsfejpNvZPpB0ujdrhsSr4Ct6GVjnV5ostCVquhTKJpIVBKyL9qDQYA== + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"