From fba85946e5fb095fe8ae0c12d20ede7c2d058e31 Mon Sep 17 00:00:00 2001 From: Jonas Braathen Date: Mon, 27 Jul 2026 02:09:29 +0200 Subject: [PATCH] Add import aliases for src/ and assets/ --- jest.config.js | 6 +++--- src/App.test.tsx | 2 +- src/Navigation.tsx | 22 +++++++++++----------- src/components/Button.tsx | 2 +- src/components/FormErrors.tsx | 4 ++-- src/components/FormInput.tsx | 4 ++-- src/components/PrivacyButton.tsx | 2 +- src/components/RadioButton.tsx | 2 +- src/components/Toast.tsx | 2 +- src/modules/about/About.test.tsx | 4 ++-- src/modules/about/About.tsx | 20 ++++++++++---------- src/modules/events/EventList.test.tsx | 10 +++++----- src/modules/events/EventList.tsx | 6 +++--- src/modules/events/useEventList.tsx | 4 ++-- src/modules/login/Login.test.tsx | 4 ++-- src/modules/login/Login.tsx | 8 ++++---- src/modules/login/useLogin.tsx | 4 ++-- src/modules/membership/Membership.test.tsx | 4 ++-- src/modules/membership/Membership.tsx | 4 ++-- src/modules/membership/MembershipInfo.tsx | 4 ++-- src/modules/membership/Proof.tsx | 12 ++++++------ src/modules/membership/UserDelete.test.tsx | 4 ++-- src/modules/membership/UserDelete.tsx | 8 ++++---- src/modules/membership/useMembership.tsx | 6 +++--- src/modules/membership/useProof.tsx | 8 ++++---- src/modules/membership/useUserDelete.tsx | 4 ++-- src/modules/register/UserRegister.test.tsx | 4 ++-- src/modules/register/UserRegister.tsx | 12 ++++++------ src/modules/register/useUserRegister.tsx | 6 +++--- src/testUtils.tsx | 4 ++-- tsconfig.json | 4 ++++ 31 files changed, 97 insertions(+), 93 deletions(-) diff --git a/jest.config.js b/jest.config.js index dcca8c7..278b53a 100644 --- a/jest.config.js +++ b/jest.config.js @@ -5,9 +5,9 @@ module.exports = { moduleNameMapper: { // Metro resolves SVGs to components via react-native-svg-transformer; Jest gets a stub instead '\\.svg$': '/__mocks__/svgMock.js', - // Absolute imports relative to the repo root (tsconfig baseUrl) - '^src/(.*)$': '/src/$1', - '^assets/(.*)$': '/assets/$1', + // `@` and `@assets` are aliases for `src` and `assets` (see tsconfig paths) + '^@/(.*)$': '/src/$1', + '^@assets/(.*)$': '/assets/$1', }, transformIgnorePatterns: [ // jest-expo's default list, extended with untranspiled libraries this app uses diff --git a/src/App.test.tsx b/src/App.test.tsx index 974fd0d..b3f5714 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -1,7 +1,7 @@ import { render, waitFor } from '@testing-library/react-native'; import React from 'react'; -import App from 'src/App'; +import App from '@/App'; it('renders the whole app without crashing', async () => { const view = render(); diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 0a6a375..cd49344 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -3,17 +3,17 @@ import { NavigationContainer } from '@react-navigation/native'; import { createNativeStackNavigator } from '@react-navigation/native-stack'; import React from 'react'; -import IconEvent from 'assets/icons/event.svg'; -import IconInfo from 'assets/icons/information-circle.svg'; -import IconPerson from 'assets/icons/person.svg'; -import About from 'src/modules/about/About'; -import EventList from 'src/modules/events/EventList'; -import Login from 'src/modules/login/Login'; -import Membership from 'src/modules/membership/Membership'; -import UserDelete from 'src/modules/membership/UserDelete'; -import UserRegister from 'src/modules/register/UserRegister'; -import theme from 'src/theme'; -import type { EventStackParamList, HomeTabParamList, UserStackParamList } from 'src/types/navigation'; +import About from '@/modules/about/About'; +import EventList from '@/modules/events/EventList'; +import Login from '@/modules/login/Login'; +import Membership from '@/modules/membership/Membership'; +import UserDelete from '@/modules/membership/UserDelete'; +import UserRegister from '@/modules/register/UserRegister'; +import theme from '@/theme'; +import type { EventStackParamList, HomeTabParamList, UserStackParamList } from '@/types/navigation'; +import IconEvent from '@assets/icons/event.svg'; +import IconInfo from '@assets/icons/information-circle.svg'; +import IconPerson from '@assets/icons/person.svg'; // This looks ugly, even though it's a recommended style from the branding profile. // TODO: Change this diff --git a/src/components/Button.tsx b/src/components/Button.tsx index f02ea58..fc39d81 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Pressable, PressableProps, StyleProp, StyleSheet, ViewStyle } from 'react-native'; -import theme from 'src/theme'; +import theme from '@/theme'; export type ButtonProps = Omit & { style?: StyleProp; diff --git a/src/components/FormErrors.tsx b/src/components/FormErrors.tsx index 66ffc19..1468cec 100644 --- a/src/components/FormErrors.tsx +++ b/src/components/FormErrors.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { Text, StyleSheet, View } from 'react-native'; -import IconExclamationTriangle from 'assets/icons/exclamation-triangle.svg'; -import theme from 'src/theme'; +import theme from '@/theme'; +import IconExclamationTriangle from '@assets/icons/exclamation-triangle.svg'; // eslint-disable-next-line @typescript-eslint/no-explicit-any const FormErrors = ({ errors }: { errors: Record }) => { diff --git a/src/components/FormInput.tsx b/src/components/FormInput.tsx index f85072d..1587f0f 100644 --- a/src/components/FormInput.tsx +++ b/src/components/FormInput.tsx @@ -2,8 +2,8 @@ import React from 'react'; import { Controller, UseControllerProps } from 'react-hook-form'; import { ReturnKeyTypeOptions, Text, StyleSheet } from 'react-native'; -import TextField, { TextFieldProps } from 'src/components/TextField'; -import theme from 'src/theme'; +import TextField, { TextFieldProps } from '@/components/TextField'; +import theme from '@/theme'; type FormInputProps = { // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/components/PrivacyButton.tsx b/src/components/PrivacyButton.tsx index 6eb8ef0..a3d190a 100644 --- a/src/components/PrivacyButton.tsx +++ b/src/components/PrivacyButton.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Linking, StyleSheet, Text, TouchableOpacity } from 'react-native'; -import theme from 'src/theme'; +import theme from '@/theme'; const PrivacyButton = () => ( { const { getByText } = renderWithProviders(); diff --git a/src/modules/about/About.tsx b/src/modules/about/About.tsx index 71894fe..13f65e9 100644 --- a/src/modules/about/About.tsx +++ b/src/modules/about/About.tsx @@ -11,16 +11,16 @@ import { Dimensions, } from 'react-native'; -import logo from 'assets/DNS-logo-svart.png'; -import IconClock from 'assets/icons/clock.svg'; -import IconFacebook from 'assets/icons/facebook.svg'; -import IconInstagram from 'assets/icons/instagram.svg'; -import IconMail from 'assets/icons/mail.svg'; -import IconMap from 'assets/icons/map.svg'; -import IconPhone from 'assets/icons/phone.svg'; -import IconTiktok from 'assets/icons/tiktok.svg'; -import Button from 'src/components/Button'; -import theme from 'src/theme'; +import Button from '@/components/Button'; +import theme from '@/theme'; +import logo from '@assets/DNS-logo-svart.png'; +import IconClock from '@assets/icons/clock.svg'; +import IconFacebook from '@assets/icons/facebook.svg'; +import IconInstagram from '@assets/icons/instagram.svg'; +import IconMail from '@assets/icons/mail.svg'; +import IconMap from '@assets/icons/map.svg'; +import IconPhone from '@assets/icons/phone.svg'; +import IconTiktok from '@assets/icons/tiktok.svg'; const CHATEAU_NEUF_ADDRESS = 'Det Norske Studentersamfund, Slemdalsveien 15, 0369 Oslo'; diff --git a/src/modules/events/EventList.test.tsx b/src/modules/events/EventList.test.tsx index 3397c1f..474e109 100644 --- a/src/modules/events/EventList.test.tsx +++ b/src/modules/events/EventList.test.tsx @@ -1,11 +1,11 @@ import React from 'react'; -import EventList from 'src/modules/events/EventList'; -import { renderWithProviders } from 'src/testUtils'; -import { fetchWithTimeout } from 'src/utils'; +import EventList from '@/modules/events/EventList'; +import { renderWithProviders } from '@/testUtils'; +import { fetchWithTimeout } from '@/utils'; -jest.mock('src/utils', () => ({ - ...jest.requireActual('src/utils'), +jest.mock('@/utils', () => ({ + ...jest.requireActual('@/utils'), fetchWithTimeout: jest.fn(), })); diff --git a/src/modules/events/EventList.tsx b/src/modules/events/EventList.tsx index 04b2a4d..cc3a431 100644 --- a/src/modules/events/EventList.tsx +++ b/src/modules/events/EventList.tsx @@ -4,9 +4,9 @@ import React from 'react'; import { StyleSheet, View, Platform, FlatList, TouchableOpacity, Text, Linking } from 'react-native'; import 'moment/locale/nb'; -import Button from 'src/components/Button'; -import theme from 'src/theme'; -import { EventType } from 'src/types/data'; +import Button from '@/components/Button'; +import theme from '@/theme'; +import { EventType } from '@/types/data'; import useEventList from './useEventList'; diff --git a/src/modules/events/useEventList.tsx b/src/modules/events/useEventList.tsx index 63e730b..a29db85 100644 --- a/src/modules/events/useEventList.tsx +++ b/src/modules/events/useEventList.tsx @@ -2,8 +2,8 @@ import moment from 'moment'; import { useEffect, useState } from 'react'; import 'moment/locale/nb'; -import type { EventType } from 'src/types/data'; -import { fetchWithTimeout } from 'src/utils'; +import type { EventType } from '@/types/data'; +import { fetchWithTimeout } from '@/utils'; moment.locale('nb'); diff --git a/src/modules/login/Login.test.tsx b/src/modules/login/Login.test.tsx index 4839707..5ffc968 100644 --- a/src/modules/login/Login.test.tsx +++ b/src/modules/login/Login.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import Login from 'src/modules/login/Login'; -import { renderWithProviders } from 'src/testUtils'; +import Login from '@/modules/login/Login'; +import { renderWithProviders } from '@/testUtils'; it('renders the login form', () => { const { getByText } = renderWithProviders(); diff --git a/src/modules/login/Login.tsx b/src/modules/login/Login.tsx index d5b4115..4770c7c 100644 --- a/src/modules/login/Login.tsx +++ b/src/modules/login/Login.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { ActivityIndicator, Linking, StyleSheet, View, Text, ScrollView } from 'react-native'; -import Button from 'src/components/Button'; -import FormErrors from 'src/components/FormErrors'; -import FormInput from 'src/components/FormInput'; -import theme from 'src/theme'; +import Button from '@/components/Button'; +import FormErrors from '@/components/FormErrors'; +import FormInput from '@/components/FormInput'; +import theme from '@/theme'; import useLogin from './useLogin'; diff --git a/src/modules/login/useLogin.tsx b/src/modules/login/useLogin.tsx index 7064011..2ac01eb 100644 --- a/src/modules/login/useLogin.tsx +++ b/src/modules/login/useLogin.tsx @@ -2,8 +2,8 @@ import { useNavigation } from '@react-navigation/native'; import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; -import { requestLogin } from 'src/api'; -import { useAppDispatch, useAppSelector } from 'src/hooks'; +import { requestLogin } from '@/api'; +import { useAppDispatch, useAppSelector } from '@/hooks'; interface LoginFormValues { email: string; diff --git a/src/modules/membership/Membership.test.tsx b/src/modules/membership/Membership.test.tsx index 0f47ccf..92ffddd 100644 --- a/src/modules/membership/Membership.test.tsx +++ b/src/modules/membership/Membership.test.tsx @@ -1,8 +1,8 @@ import { gql } from '@apollo/client'; import React from 'react'; -import Membership from 'src/modules/membership/Membership'; -import { renderWithProviders, testUser } from 'src/testUtils'; +import Membership from '@/modules/membership/Membership'; +import { renderWithProviders, testUser } from '@/testUtils'; // Must match PROOF_QUERY in useProof.tsx const PROOF_QUERY = gql` diff --git a/src/modules/membership/Membership.tsx b/src/modules/membership/Membership.tsx index b534a99..18c5109 100644 --- a/src/modules/membership/Membership.tsx +++ b/src/modules/membership/Membership.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { View, ActivityIndicator } from 'react-native'; -import PrivacyButton from 'src/components/PrivacyButton'; -import theme from 'src/theme'; +import PrivacyButton from '@/components/PrivacyButton'; +import theme from '@/theme'; import MembershipInfo from './MembershipInfo'; import Proof from './Proof'; diff --git a/src/modules/membership/MembershipInfo.tsx b/src/modules/membership/MembershipInfo.tsx index c204c16..f8028b9 100644 --- a/src/modules/membership/MembershipInfo.tsx +++ b/src/modules/membership/MembershipInfo.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { ScrollView, Text, View, StyleSheet } from 'react-native'; -import Button from 'src/components/Button'; -import theme from 'src/theme'; +import Button from '@/components/Button'; +import theme from '@/theme'; interface MembershipInfoProps { onRegister: () => void; diff --git a/src/modules/membership/Proof.tsx b/src/modules/membership/Proof.tsx index 2f15858..b6dfcad 100644 --- a/src/modules/membership/Proof.tsx +++ b/src/modules/membership/Proof.tsx @@ -15,12 +15,12 @@ import { } from 'react-native'; import Confetti from 'react-native-confetti'; -import Button from 'src/components/Button'; -import RadioButton from 'src/components/RadioButton'; -import Toast from 'src/components/Toast'; -import { useNotifications } from 'src/hooks/useNotifications'; -import theme from 'src/theme'; -import type { UserType } from 'src/types/data'; +import Button from '@/components/Button'; +import RadioButton from '@/components/RadioButton'; +import Toast from '@/components/Toast'; +import { useNotifications } from '@/hooks/useNotifications'; +import theme from '@/theme'; +import type { UserType } from '@/types/data'; import useProof from './useProof'; import logo from '../../../assets/DNS-logo-svart.png'; diff --git a/src/modules/membership/UserDelete.test.tsx b/src/modules/membership/UserDelete.test.tsx index 061f89a..2cfd69a 100644 --- a/src/modules/membership/UserDelete.test.tsx +++ b/src/modules/membership/UserDelete.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import UserDelete from 'src/modules/membership/UserDelete'; -import { renderWithProviders, testUser } from 'src/testUtils'; +import UserDelete from '@/modules/membership/UserDelete'; +import { renderWithProviders, testUser } from '@/testUtils'; const mockNavigate = jest.fn(); jest.mock('@react-navigation/native', () => ({ diff --git a/src/modules/membership/UserDelete.tsx b/src/modules/membership/UserDelete.tsx index f6386a0..d23020d 100644 --- a/src/modules/membership/UserDelete.tsx +++ b/src/modules/membership/UserDelete.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { ActivityIndicator, ScrollView, Text, TextInput, View, StyleSheet } from 'react-native'; -import Button from 'src/components/Button'; -import FormErrors from 'src/components/FormErrors'; -import { useAppSelector } from 'src/hooks'; -import theme from 'src/theme'; +import Button from '@/components/Button'; +import FormErrors from '@/components/FormErrors'; +import { useAppSelector } from '@/hooks'; +import theme from '@/theme'; import useUserDelete from './useUserDelete'; diff --git a/src/modules/membership/useMembership.tsx b/src/modules/membership/useMembership.tsx index ff2123a..d338142 100644 --- a/src/modules/membership/useMembership.tsx +++ b/src/modules/membership/useMembership.tsx @@ -1,9 +1,9 @@ import { useNavigation } from '@react-navigation/native'; import { useEffect, useCallback } from 'react'; -import { logout } from 'src/actions'; -import { requestUserData } from 'src/api'; -import { useAppDispatch, useAppSelector, usePrevious } from 'src/hooks'; +import { logout } from '@/actions'; +import { requestUserData } from '@/api'; +import { useAppDispatch, useAppSelector, usePrevious } from '@/hooks'; const useMembership = () => { const navigation = useNavigation(); diff --git a/src/modules/membership/useProof.tsx b/src/modules/membership/useProof.tsx index d6778d4..3d87f2c 100644 --- a/src/modules/membership/useProof.tsx +++ b/src/modules/membership/useProof.tsx @@ -3,10 +3,10 @@ import { useStripe } from '@stripe/stripe-react-native'; import Constants from 'expo-constants'; import { useEffect, useState } from 'react'; -import { requestStripePaymentSheet } from 'src/api'; -import { useAppSelector } from 'src/hooks'; -import { useNotifications } from 'src/hooks/useNotifications'; -import { ToastProps } from 'src/types/toast'; +import { requestStripePaymentSheet } from '@/api'; +import { useAppSelector } from '@/hooks'; +import { useNotifications } from '@/hooks/useNotifications'; +import { ToastProps } from '@/types/toast'; const PROOF_QUERY = gql` { diff --git a/src/modules/membership/useUserDelete.tsx b/src/modules/membership/useUserDelete.tsx index 4db60ad..f6e889c 100644 --- a/src/modules/membership/useUserDelete.tsx +++ b/src/modules/membership/useUserDelete.tsx @@ -1,8 +1,8 @@ import { useNavigation } from '@react-navigation/native'; import { useEffect } from 'react'; -import { requestDeleteUser } from 'src/api'; -import { useAppDispatch, useAppSelector, usePrevious } from 'src/hooks'; +import { requestDeleteUser } from '@/api'; +import { useAppDispatch, useAppSelector, usePrevious } from '@/hooks'; const useUserDelete = () => { const dispatch = useAppDispatch(); diff --git a/src/modules/register/UserRegister.test.tsx b/src/modules/register/UserRegister.test.tsx index 24c4c01..4e6e31c 100644 --- a/src/modules/register/UserRegister.test.tsx +++ b/src/modules/register/UserRegister.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import UserRegister from 'src/modules/register/UserRegister'; -import { renderWithProviders } from 'src/testUtils'; +import UserRegister from '@/modules/register/UserRegister'; +import { renderWithProviders } from '@/testUtils'; it('renders the registration form', () => { const { getByText } = renderWithProviders(); diff --git a/src/modules/register/UserRegister.tsx b/src/modules/register/UserRegister.tsx index 7cf3343..3978065 100644 --- a/src/modules/register/UserRegister.tsx +++ b/src/modules/register/UserRegister.tsx @@ -2,12 +2,12 @@ import * as EmailValidator from 'email-validator'; import React from 'react'; import { ActivityIndicator, StyleSheet, Text, ScrollView } from 'react-native'; -import Button from 'src/components/Button'; -import FormErrors from 'src/components/FormErrors'; -import FormInput from 'src/components/FormInput'; -import PrivacyButton from 'src/components/PrivacyButton'; -import Toast from 'src/components/Toast'; -import theme from 'src/theme'; +import Button from '@/components/Button'; +import FormErrors from '@/components/FormErrors'; +import FormInput from '@/components/FormInput'; +import PrivacyButton from '@/components/PrivacyButton'; +import Toast from '@/components/Toast'; +import theme from '@/theme'; import useUserRegister from './useUserRegister'; diff --git a/src/modules/register/useUserRegister.tsx b/src/modules/register/useUserRegister.tsx index edf03fc..91c2ed4 100644 --- a/src/modules/register/useUserRegister.tsx +++ b/src/modules/register/useUserRegister.tsx @@ -2,9 +2,9 @@ import { useNavigation } from '@react-navigation/native'; import { useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; -import { requestRegisterUser } from 'src/api'; -import { useAppDispatch, useAppSelector, usePrevious } from 'src/hooks'; -import { ToastProps } from 'src/types/toast'; +import { requestRegisterUser } from '@/api'; +import { useAppDispatch, useAppSelector, usePrevious } from '@/hooks'; +import { ToastProps } from '@/types/toast'; export interface UserRegisterFormValues { first_name: string; diff --git a/src/testUtils.tsx b/src/testUtils.tsx index eba85e0..d5aa630 100644 --- a/src/testUtils.tsx +++ b/src/testUtils.tsx @@ -9,8 +9,8 @@ import { Provider } from 'react-redux'; import { applyMiddleware, legacy_createStore as createStore } from 'redux'; import { thunk } from 'redux-thunk'; -import rootReducer from 'src/reducers'; -import type { UserType } from 'src/types/data'; +import rootReducer from '@/reducers'; +import type { UserType } from '@/types/data'; type AppState = ReturnType; diff --git a/tsconfig.json b/tsconfig.json index 195eb8f..3afc243 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,10 @@ "compilerOptions": { "jsx": "react", "baseUrl": "./", + "paths": { + "@/*": ["src/*"], + "@assets/*": ["assets/*"] + }, "strict": true }, "extends": "expo/tsconfig.base",