diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..9e61337
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,9 @@
+FROM node:18-alpine
+WORKDIR /app
+COPY yarn.lock ./
+RUN yarn
+COPY . .
+RUN yarn build
+ENV NODE_ENV=production
+CMD ["yarn", "start"]
+EXPOSE 3000
diff --git a/app/(auth)/login/page.tsx b/app/(auth)/login/page.tsx
index 218e576..3013d52 100644
--- a/app/(auth)/login/page.tsx
+++ b/app/(auth)/login/page.tsx
@@ -1,80 +1,7 @@
-'use client'
+import Template from '@/components/Templates'
-import Atom from '@/components/atoms'
-import { useAuthForm } from '@/hooks/useAuthForm'
-import { useFormField } from '@/hooks/useFormField'
-import styles from '@/styles/(auth)/Auth.module.css'
-
-const Login = () => {
- const emailField = useFormField('')
- const passwordField = useFormField('')
-
- const formValues = {
- email: emailField.value,
- password: passwordField.value,
- }
-
- const {
- isFormValid,
- isSubmitting,
- submissionError,
- handleSubmit,
- emailError,
- passwordError,
- } = useAuthForm('login', formValues)
-
- const handleFormSubmit = async (e: React.FormEvent) => {
- e.preventDefault()
- await handleSubmit(e)
- }
-
- return (
-
-
-
Вход
-
Войдите в свой аккаунт
-
-
-
- )
+const LoginPage = () => {
+ return
}
-export default Login
+export default LoginPage
diff --git a/app/(auth)/register/page.tsx b/app/(auth)/register/page.tsx
index 820226d..1e8996c 100644
--- a/app/(auth)/register/page.tsx
+++ b/app/(auth)/register/page.tsx
@@ -1,107 +1,7 @@
-'use client'
+import Template from '@/components/Templates'
-import Atom from '@/components/atoms/index'
-import { useAuthForm } from '@/hooks/useAuthForm'
-import { useFormField } from '@/hooks/useFormField'
-import styles from '@/styles/(auth)/Auth.module.css'
-
-const Register = () => {
- const fullNameField = useFormField('')
- const emailField = useFormField('')
- const passwordField = useFormField('')
- const confirmPasswordField = useFormField('')
-
- const formValues = {
- fullName: fullNameField.value,
- email: emailField.value,
- password: passwordField.value,
- confirmPassword: confirmPasswordField.value,
- }
-
- const {
- isFormValid,
- isSubmitting,
- submissionError,
- handleSubmit,
- emailError,
- passwordError,
- fullNameError,
- confirmPasswordError,
- } = useAuthForm('register', formValues)
-
- const handleFormSubmit = (e: React.FormEvent) => {
- handleSubmit(e)
- }
-
- return (
-
-
-
Регистрация
-
Создайте аккаунт
-
-
-
- )
+const RegisterPage = () => {
+ return
}
-export default Register
+export default RegisterPage
diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx
index 56ecfec..1640070 100644
--- a/app/dashboard/page.tsx
+++ b/app/dashboard/page.tsx
@@ -1,5 +1,5 @@
-const Dashboard = () => {
+const DashboardPage = () => {
return Главная страница
}
-export default Dashboard
+export default DashboardPage
diff --git a/app/modules/page.tsx b/app/modules/page.tsx
index b34fe9e..f98c875 100644
--- a/app/modules/page.tsx
+++ b/app/modules/page.tsx
@@ -1,48 +1,79 @@
+'use client'
+
import Atom from '@/components/atoms'
import { Bell } from 'lucide-react'
+import { useState } from 'react'
+
+const ModulesPage = () => {
+ const [inputValue, setInputValue] = useState('')
+ const [touched, setTouched] = useState(false)
+
+ const handleInputChange = (e: React.ChangeEvent) => {
+ setInputValue(e.target.value)
+ }
+
+ const handleInputBlur = () => {
+ setTouched(true)
+ }
-const Modules = () => {
return (
-
Размеры кнопок
-
- Small Primary
-
-
- Medium Primary
-
-
- Large Primary
-
-
-
Варианты кнопок
-
- Primary
-
-
- Secondary
-
-
- Danger
-
-
-
Кнопки с иконками
-
-
-
-
-
Заблокированная кнопка
-
- ТЕКСТ БЛЯТЬ
-
+
+ Размеры кнопок
+
+ Small Primary
+
+
+ Medium Primary
+
+
+ Large Primary
+
+
+ Варианты кнопок
+
+ Primary
+
+
+ Secondary
+
+
+ Danger
+
+
+ Кнопки с иконками
+
+
+
+
+ Заблокированная кнопка
+
+ Disabled Button
+
+
+
+ Текстовые поля
+
+ handleInputChange(e as React.ChangeEvent)
+ }
+ onBlur={handleInputBlur}
+ error={touched && inputValue === '' ? 'This field is required' : null}
+ touched={touched}
+ />
+
)
}
-export default Modules
+export default ModulesPage
diff --git a/app/page.tsx b/app/page.tsx
index 265161c..063b9eb 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,5 +1,5 @@
const Home = () => {
- return Page component
+ return Page component
}
export default Home
diff --git a/app/profile/page.tsx b/app/profile/page.tsx
index b5b9631..67cbbfb 100644
--- a/app/profile/page.tsx
+++ b/app/profile/page.tsx
@@ -1,7 +1,14 @@
+'use server'
+
import Profile from '@/components/Templates/Profile/Profile'
+import { getProfile } from '@/services/profileService'
+import { cookies } from 'next/headers'
+
+const ProfilePage = async () => {
+ const token = cookies().get('token')?.value || ''
+ const name = await getProfile(token)
-const App = () => {
- return
+ return
}
-export default App
+export default ProfilePage
diff --git a/middleware.ts b/middleware.ts
index 6a3e910..7455ff9 100644
--- a/middleware.ts
+++ b/middleware.ts
@@ -39,5 +39,5 @@ export async function middleware(request: NextRequest) {
}
export const config = {
- matcher: ['/modules/:path*'],
+ matcher: ['/modules/:path*', '/profile/:path*'],
}
diff --git a/next.config.mjs b/next.config.mjs
index 1d61478..0ba6325 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -1,4 +1,6 @@
/** @type {import('next').NextConfig} */
-const nextConfig = {}
+const nextConfig = {
+ distDir: 'build',
+}
export default nextConfig
diff --git a/package.json b/package.json
index 22df30d..14e64e0 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"private": true,
"type": "module",
"scripts": {
- "dev": "next dev",
+ "dev": "next dev --turbo",
"build": "next build",
"start": "next start",
"lint": "next lint",
@@ -30,11 +30,11 @@
},
"dependencies": {
"@reduxjs/toolkit": "^2.2.7",
+ "axios": "^1.7.5",
"jose": "^5.7.0",
"js-cookie": "^3.0.5",
"lucide-react": "^0.427.0",
"next": "14.2.5",
- "playwright": "^1.46.1",
"react": "^18",
"react-dom": "^18",
"react-loading-skeleton": "^3.4.0",
@@ -66,7 +66,6 @@
"husky": "^9.1.4",
"jest": "^29.7.0",
"lint-staged": "^15.2.9",
- "postcss": "^8",
"prettier": "3.3.3",
"storybook": "^8.2.9",
"stylelint": "^16.8.1",
diff --git a/shell.nix b/shell.nix
index 344a5bd..5c5b022 100644
--- a/shell.nix
+++ b/shell.nix
@@ -14,8 +14,8 @@ pkgs.mkShell {
# Автоматическая установка зависимостей при запуске nix-shell
if [ ! -d node_modules ]; then
echo "Installing npm dependencies..."
- npm install
- fi
+ yarn
+ fi
# Автоматический запуск проекта в режиме разработки
echo "Starting development server..."
diff --git a/src/components/Templates/Login/Login.tsx b/src/components/Templates/Login/Login.tsx
new file mode 100644
index 0000000..da89370
--- /dev/null
+++ b/src/components/Templates/Login/Login.tsx
@@ -0,0 +1,96 @@
+'use client'
+
+import Atom from '@/components/atoms'
+import { useAuthForm } from '@/hooks/useAuthForm'
+import { useFormField } from '@/hooks/useFormField'
+import styles from '@/styles/(auth)/Auth.module.css'
+
+const Login = () => {
+ const emailField = useFormField('')
+ const passwordField = useFormField('')
+
+ const formValues = {
+ email: emailField.value,
+ password: passwordField.value,
+ }
+
+ const {
+ isFormValid,
+ isSubmitting,
+ submissionError,
+ handleSubmit,
+ emailError,
+ passwordError,
+ } = useAuthForm('login', formValues)
+
+ const handleFormSubmit = async (e: React.FormEvent) => {
+ e.preventDefault()
+ await handleSubmit(e)
+ }
+
+ return (
+
+
+
Вход
+
Войдите в свой аккаунт
+
+
+
+ )
+}
+
+export default Login
diff --git a/src/components/Templates/Profile/Profile.tsx b/src/components/Templates/Profile/Profile.tsx
index 9e0e4ff..a3e132b 100644
--- a/src/components/Templates/Profile/Profile.tsx
+++ b/src/components/Templates/Profile/Profile.tsx
@@ -12,7 +12,7 @@ const Profile: React.FC = ({ name }) => {
- Preview ITB Profile
+ Просмотреть профиль
diff --git a/src/components/Templates/Register/Register.tsx b/src/components/Templates/Register/Register.tsx
new file mode 100644
index 0000000..392d357
--- /dev/null
+++ b/src/components/Templates/Register/Register.tsx
@@ -0,0 +1,148 @@
+'use client'
+
+import Atom from '@/components/atoms/index'
+import { useAuthForm } from '@/hooks/useAuthForm'
+import { useFormField } from '@/hooks/useFormField'
+import styles from '@/styles/(auth)/Auth.module.css'
+
+const Register = () => {
+ const fullNameField = useFormField('')
+ const emailField = useFormField('')
+ const passwordField = useFormField('')
+ const confirmPasswordField = useFormField('')
+
+ const formValues = {
+ fullName: fullNameField.value,
+ email: emailField.value,
+ password: passwordField.value,
+ confirmPassword: confirmPasswordField.value,
+ }
+
+ const {
+ isFormValid,
+ isSubmitting,
+ submissionError,
+ handleSubmit,
+ emailError,
+ passwordError,
+ fullNameError,
+ confirmPasswordError,
+ } = useAuthForm('register', formValues)
+
+ const handleFormSubmit = (e: React.FormEvent) => {
+ handleSubmit(e)
+ }
+
+ return (
+
+
+
Регистрация
+
Создайте аккаунт
+
+
+
+ )
+}
+
+export default Register
diff --git a/src/components/Templates/index.ts b/src/components/Templates/index.ts
index db5fee8..47ccfb7 100644
--- a/src/components/Templates/index.ts
+++ b/src/components/Templates/index.ts
@@ -1,7 +1,11 @@
+import Login from './Login/Login'
import Profile from './Profile/Profile'
+import Register from './Register/Register'
export const Template = {
Profile,
+ Login,
+ Register,
}
export default Template
diff --git a/src/components/atoms/Input/InputField.css b/src/components/atoms/Input/InputField.css
new file mode 100644
index 0000000..10e2637
--- /dev/null
+++ b/src/components/atoms/Input/InputField.css
@@ -0,0 +1,25 @@
+.field label {
+ display: block;
+ margin-bottom: 0.5rem;
+ font-weight: 500;
+}
+
+.field input {
+ width: 100%;
+ padding: 0.5rem 0.75rem;
+ border: 1px solid #d1d5db;
+ border-radius: 0.375rem;
+ font-size: 1rem;
+ outline: none;
+ transition: border-color 0.3s;
+}
+
+.field input:focus {
+ border-color: #2563eb;
+}
+
+.field__error {
+ color: #f87171;
+ font-size: 0.875rem;
+ margin-top: 0.5rem;
+}
diff --git a/src/components/atoms/Input/InputField.tsx b/src/components/atoms/Input/InputField.tsx
index fe18a9d..ec6e8f4 100644
--- a/src/components/atoms/Input/InputField.tsx
+++ b/src/components/atoms/Input/InputField.tsx
@@ -1,38 +1,79 @@
-import styles from '@/styles/(auth)/Auth.module.css'
-import {
- DEFAULT_AUTO_COMPLETE,
- DEFAULT_REQUIRED,
- DEFAULT_TYPE,
-} from './constants'
+import './InputField.css'
import { InputFieldProps } from './interfaces'
const InputField: React.FC = ({
id,
label,
- type = DEFAULT_TYPE,
placeholder,
value,
- error,
- touched,
onChange,
onBlur,
- required = DEFAULT_REQUIRED,
- autoComplete = DEFAULT_AUTO_COMPLETE,
-}) => (
-
-
-
- {touched && error && {error}}
-
-)
+ error,
+ touched,
+ type = 'text',
+ options = [],
+ autoComplete,
+}) => {
+ const handleChange = (
+ e:
+ | React.ChangeEvent
+ | React.ChangeEvent,
+ ) => {
+ if (type === 'select' && e.target instanceof HTMLSelectElement) {
+ onChange(e as React.ChangeEvent)
+ } else if (type !== 'select' && e.target instanceof HTMLInputElement) {
+ onChange(e as React.ChangeEvent)
+ }
+ }
+
+ const handleBlur = (
+ e: React.FocusEvent | React.FocusEvent,
+ ) => {
+ if (type === 'select' && e.target instanceof HTMLSelectElement) {
+ onBlur(e as React.FocusEvent)
+ } else if (type !== 'select' && e.target instanceof HTMLInputElement) {
+ onBlur(e as React.FocusEvent)
+ }
+ }
+
+ if (type === 'select') {
+ return (
+
+
+
+ {error && touched && {error}}
+
+ )
+ }
+
+ return (
+
+
+
+ {error && touched && {error}}
+
+ )
+}
export default InputField
diff --git a/src/components/atoms/Input/interfaces.ts b/src/components/atoms/Input/interfaces.ts
index cc7b32c..6076386 100644
--- a/src/components/atoms/Input/interfaces.ts
+++ b/src/components/atoms/Input/interfaces.ts
@@ -1,13 +1,19 @@
+import { ChangeEvent, FocusEvent } from 'react'
+
export interface InputFieldProps {
id: string
label: string
- type?: string
placeholder?: string
value: string
- error: string | null
+ onChange: (
+ e: ChangeEvent | ChangeEvent,
+ ) => void
+ onBlur: (
+ e: FocusEvent | FocusEvent,
+ ) => void
+ error?: string | null
touched: boolean
- onChange: (e: React.ChangeEvent) => void
- onBlur: () => void
- required?: boolean
+ type?: 'text' | 'password' | 'email' | 'select' | 'number'
+ options?: string[]
autoComplete?: string
}
diff --git a/src/components/molecules/Profile/EditSection.tsx b/src/components/molecules/Profile/EditSection.tsx
new file mode 100644
index 0000000..827633a
--- /dev/null
+++ b/src/components/molecules/Profile/EditSection.tsx
@@ -0,0 +1,104 @@
+import Atom from '@/components/atoms'
+import { handleFormKeyDown } from '@/utils/handleFormKeyDown'
+import React from 'react'
+import styles from './ProfileSegmentation.module.css'
+import { EditSectionProps } from './interfaces'
+
+const languageLevels = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2']
+
+const EditSection: React.FC = ({
+ label,
+ items,
+ fieldNames,
+ fieldLabels,
+ stateSetter,
+ isEditMode,
+ onSave,
+ toggleEdit,
+}) => {
+ const handleInputChange = (
+ e: React.ChangeEvent,
+ index: number,
+ field: string,
+ ) => {
+ const value = e.target.value
+ stateSetter((prev) => {
+ const newState = [...prev]
+ newState[index] = { ...newState[index], [field]: value }
+ return newState
+ })
+ }
+
+ const renderInputFields = () => (
+
+ )
+
+ const renderDisplayFields = () => {
+ const allFieldsFilled = items.every((item) =>
+ fieldNames.every((field) => item[field] !== '' && item[field] !== 0),
+ )
+
+ return (
+
+ {allFieldsFilled ? (
+ <>
+ {items.map((item, index) => (
+
+ {fieldNames
+ .map((field) => item[field])
+ .filter((value) => value !== '' && value !== 0)
+ .join(' - ')}
+
+ ))}
+
+ Редактировать
+
+ >
+ ) : (
+ <>
+
Добавьте ваши {label.toLowerCase()}.
+
+ Добавить
+
+ >
+ )}
+
+ )
+ }
+
+ return (
+
+
{label}
+ {isEditMode ? renderInputFields() : renderDisplayFields()}
+
+ )
+}
+
+export default EditSection
diff --git a/src/components/molecules/Profile/ProfileHeader.tsx b/src/components/molecules/Profile/ProfileHeader.tsx
index 8bad995..63f32df 100644
--- a/src/components/molecules/Profile/ProfileHeader.tsx
+++ b/src/components/molecules/Profile/ProfileHeader.tsx
@@ -12,7 +12,7 @@ export const ProfileHeader: React.FC = ({ name }) => {
{firstLetter}
{name}
-
NEW
+
Новичок
@daniil_smith
)
diff --git a/src/components/molecules/Profile/ProfileInfoSection.tsx b/src/components/molecules/Profile/ProfileInfoSection.tsx
index ae1624e..3ff98b7 100644
--- a/src/components/molecules/Profile/ProfileInfoSection.tsx
+++ b/src/components/molecules/Profile/ProfileInfoSection.tsx
@@ -4,12 +4,12 @@ export const ProfileInfoSection: React.FC = () => {
return (
- From
- Romania
+ Страна
+ Румыния
- Member since
- Aug 2024
+ Дата регистрации
+ Авг 2024
)
diff --git a/src/components/molecules/Profile/ProfileSegmentation.tsx b/src/components/molecules/Profile/ProfileSegmentation.tsx
index d14705e..9d0447b 100644
--- a/src/components/molecules/Profile/ProfileSegmentation.tsx
+++ b/src/components/molecules/Profile/ProfileSegmentation.tsx
@@ -1,11 +1,14 @@
'use client'
import Atom from '@/components/atoms'
-import { useState } from 'react'
+import React, { useState } from 'react'
+import EditSection from './EditSection'
import { Certification, Education, Language, Skill } from './interfaces'
import styles from './ProfileSegmentation.module.css'
export const ProfileSegmentation: React.FC = () => {
+ const currentYear = new Date().getFullYear()
+
const [isEditing, setIsEditing] = useState({
description: false,
languages: false,
@@ -16,172 +19,119 @@ export const ProfileSegmentation: React.FC = () => {
const [description, setDescription] = useState('')
const [languages, setLanguages] = useState([
- { name: 'English', level: 'Basic' },
+ { name: '', level: '' },
+ ])
+ const [skills, setSkills] = useState([{ name: '', experience: '' }])
+ const [education, setEducation] = useState([
+ { country: '', university: '', title: '', major: '', year: currentYear },
+ ])
+ const [certification, setCertification] = useState([
+ { certificate: '', certifiedFrom: '', year: currentYear },
])
- const [skills, setSkills] = useState([])
- const [education, setEducation] = useState([])
- const [certification, setCertification] = useState([])
const toggleEdit = (field: keyof typeof isEditing) => {
setIsEditing((prev) => ({ ...prev, [field]: !prev[field] }))
}
- const updateDescription = (e: React.ChangeEvent) => {
- setDescription(e.target.value)
- }
+ const saveDescription = () => toggleEdit('description')
+ const saveLanguages = () => toggleEdit('languages')
+ const saveSkills = () => toggleEdit('skills')
+ const saveEducation = () => toggleEdit('education')
+ const saveCertification = () => toggleEdit('certification')
return (
<>
-
Description
+
Описание
{isEditing.description ? (
-
+
) : (
-
{description || 'Add your description.'}
+
{description || 'Добавьте ваше описание.'}
toggleEdit('description')}
type="button"
>
- Edit Description
-
-
- )}
-
-
-
-
Languages
- {isEditing.languages ? (
-
- ) : (
-
- {languages.map((language, index) => (
-
- {language.name} - {language.level}
-
- ))}
-
toggleEdit('languages')}
- type="button"
- >
- Add New
-
-
- )}
-
-
-
-
Skills
- {isEditing.skills ? (
-
- ) : (
-
-
Add your Skills.
-
toggleEdit('skills')}
- type="button"
- >
- Add New
+ {description ? 'Редактировать описание' : 'Добавить описание'}
)}
-
-
Education
- {isEditing.education ? (
-
- ) : (
-
-
Add your Education.
-
toggleEdit('education')}
- type="button"
- >
- Add New
-
-
- )}
-
-
-
-
Certification
- {isEditing.certification ? (
-
- ) : (
-
-
Add your Certification.
-
toggleEdit('certification')}
- type="button"
- >
- Add New
-
-
- )}
-
+ toggleEdit('languages')}
+ />
+ toggleEdit('skills')}
+ />
+ toggleEdit('education')}
+ />
+ toggleEdit('certification')}
+ />
>
)
}
diff --git a/src/components/molecules/Profile/interfaces.ts b/src/components/molecules/Profile/interfaces.ts
index eb99ba9..801932f 100644
--- a/src/components/molecules/Profile/interfaces.ts
+++ b/src/components/molecules/Profile/interfaces.ts
@@ -1,3 +1,14 @@
+export interface EditSectionProps {
+ label: string
+ items: any[]
+ fieldNames: string[]
+ fieldLabels: string[]
+ stateSetter: React.Dispatch>
+ isEditMode: boolean
+ onSave: () => void
+ toggleEdit: () => void
+}
+
export interface Language {
name: string
level: string
diff --git a/src/hooks/useFormField.ts b/src/hooks/useFormField.ts
index 6320229..214b756 100644
--- a/src/hooks/useFormField.ts
+++ b/src/hooks/useFormField.ts
@@ -11,7 +11,7 @@ export const useFormField = (initialValue: string) => {
setTouched(true)
}
- const handleBlur = () => {
+ const handleBlur = (e: React.FocusEvent) => {
setTouched(true)
}
diff --git a/src/services/api/apiClient.ts b/src/services/api/apiClient.ts
new file mode 100644
index 0000000..dab432b
--- /dev/null
+++ b/src/services/api/apiClient.ts
@@ -0,0 +1,31 @@
+import config from '@/config'
+import axios from 'axios'
+import Cookies from 'js-cookie'
+
+export const apiClient = axios.create({
+ baseURL: config.apiUrl,
+ timeout: 10000,
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+})
+
+export const setAuthToken = (token: string) => {
+ if (token) {
+ apiClient.defaults.headers.common['Authorization'] = `Bearer ${token}`
+ Cookies.set('token', token, {
+ expires: 90,
+ secure: true,
+ sameSite: 'strict',
+ })
+ } else {
+ delete apiClient.defaults.headers.common['Authorization']
+ Cookies.remove('token')
+ }
+}
+
+export const handleApiError = (error: any) => {
+ const message =
+ error.response?.data?.message || 'Произошла ошибка. Попробуйте снова.'
+ throw new Error(message)
+}
diff --git a/src/services/api/profileApi.ts b/src/services/api/profileApi.ts
new file mode 100644
index 0000000..0e4d716
--- /dev/null
+++ b/src/services/api/profileApi.ts
@@ -0,0 +1,12 @@
+import { apiClient, handleApiError } from './apiClient'
+
+export const fetchProfileData = async (token: string) => {
+ try {
+ apiClient.defaults.headers.common['Authorization'] = `Bearer ${token}`
+
+ const response = await apiClient.get('/auth/me')
+ return response.data
+ } catch (error) {
+ handleApiError(error)
+ }
+}
diff --git a/src/services/authService.ts b/src/services/authService.ts
index bac1168..1f9fa3e 100644
--- a/src/services/authService.ts
+++ b/src/services/authService.ts
@@ -1,5 +1,4 @@
-import config from '@/config'
-import Cookies from 'js-cookie'
+import { apiClient, handleApiError, setAuthToken } from './api/apiClient'
export type AuthType = 'login' | 'register'
@@ -7,27 +6,15 @@ export const authService = async (
authType: AuthType,
values: Record,
) => {
- const endpoint = authType === 'login' ? 'login' : 'register'
- const response = await fetch(`${config.apiUrl}/auth/${endpoint}`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(values),
- })
+ try {
+ const endpoint = authType === 'login' ? '/auth/login' : '/auth/register'
+ const response = await apiClient.post(endpoint, values)
- if (!response.ok) {
- const errorData = await response.json()
- throw new Error(errorData.message || 'Произошла ошибка. Попробуйте снова.')
- }
-
- const data = await response.json()
- Cookies.set('token', data.token, {
- expires: 90,
- secure: true,
- sameSite: 'strict',
- httpOnly: true,
- })
+ const { token } = response.data
+ setAuthToken(token)
- return data
+ return response.data
+ } catch (error) {
+ handleApiError(error)
+ }
}
diff --git a/src/services/profileService.ts b/src/services/profileService.ts
new file mode 100644
index 0000000..c891f21
--- /dev/null
+++ b/src/services/profileService.ts
@@ -0,0 +1,11 @@
+import { fetchProfileData } from './api/profileApi'
+
+export const getProfile = async (token: string): Promise => {
+ try {
+ const data = await fetchProfileData(token)
+ return data.fullName || ''
+ } catch (error) {
+ console.error('Failed to fetch profile data', error)
+ return ''
+ }
+}
diff --git a/src/styles/(auth)/Auth.module.css b/src/styles/(auth)/Auth.module.css
index 98e0cd7..3572771 100644
--- a/src/styles/(auth)/Auth.module.css
+++ b/src/styles/(auth)/Auth.module.css
@@ -25,34 +25,8 @@
gap: 1rem;
}
-.field label {
- display: block;
- margin-bottom: 0.5rem;
- font-weight: 500;
-}
-
-.field input {
- width: 100%;
- padding: 0.5rem 0.75rem;
- border: 1px solid #d1d5db;
- border-radius: 0.375rem;
- font-size: 1rem;
- outline: none;
- transition: border-color 0.3s;
-}
-
-.field input:focus {
- border-color: #2563eb;
-}
-
.error {
color: #f87171;
font-size: 0.875rem;
margin-top: 0.5rem;
}
-
-.success {
- color: #34d399;
- font-size: 0.875rem;
- margin-top: 0.5rem;
-}
diff --git a/src/test/utils/handleFormKeyDown.test.ts b/src/test/utils/handleFormKeyDown.test.ts
new file mode 100644
index 0000000..6958bb3
--- /dev/null
+++ b/src/test/utils/handleFormKeyDown.test.ts
@@ -0,0 +1,29 @@
+import { handleFormKeyDown } from '../../utils/handleFormKeyDown'
+
+describe('handleFormKeyDown', () => {
+ it('should call onSave when Enter key is pressed', () => {
+ const onSave = jest.fn()
+ const event = {
+ key: 'Enter',
+ preventDefault: jest.fn(),
+ } as unknown as React.KeyboardEvent
+
+ handleFormKeyDown(event, onSave)
+
+ expect(event.preventDefault).toHaveBeenCalled()
+ expect(onSave).toHaveBeenCalled()
+ })
+
+ it('should not call onSave when other keys are pressed', () => {
+ const onSave = jest.fn()
+ const event = {
+ key: 'Escape',
+ preventDefault: jest.fn(),
+ } as unknown as React.KeyboardEvent
+
+ handleFormKeyDown(event, onSave)
+
+ expect(event.preventDefault).not.toHaveBeenCalled()
+ expect(onSave).not.toHaveBeenCalled()
+ })
+})
diff --git a/src/utils/handleFormKeyDown.ts b/src/utils/handleFormKeyDown.ts
new file mode 100644
index 0000000..28b6a98
--- /dev/null
+++ b/src/utils/handleFormKeyDown.ts
@@ -0,0 +1,9 @@
+export const handleFormKeyDown = (
+ e: React.KeyboardEvent,
+ onSave: () => void,
+) => {
+ if (e.key === 'Enter') {
+ e.preventDefault()
+ onSave()
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
index ce78d62..b953166 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -26,7 +26,8 @@
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
- "tools/generate-sitemap.js"
+ "tools/generate-sitemap.js",
+ "build/types/**/*.ts"
],
"exclude": ["node_modules"]
}
diff --git a/yarn.lock b/yarn.lock
index 8009278..b6b426d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -49,12 +49,12 @@
json5 "^2.2.3"
semver "^6.3.1"
-"@babel/generator@^7.25.0", "@babel/generator@^7.25.4", "@babel/generator@^7.7.2":
- version "7.25.5"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.5.tgz#b31cf05b3fe8c32d206b6dad03bb0aacbde73450"
- integrity sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==
+"@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c"
+ integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==
dependencies:
- "@babel/types" "^7.25.4"
+ "@babel/types" "^7.25.6"
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25"
jsesc "^2.5.1"
@@ -215,12 +215,12 @@
"@babel/types" "^7.25.0"
"@babel/helpers@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a"
- integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60"
+ integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==
dependencies:
"@babel/template" "^7.25.0"
- "@babel/types" "^7.25.0"
+ "@babel/types" "^7.25.6"
"@babel/highlight@^7.24.7":
version "7.24.7"
@@ -232,12 +232,12 @@
js-tokens "^4.0.0"
picocolors "^1.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.4":
- version "7.25.4"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.4.tgz#af4f2df7d02440286b7de57b1c21acfb2a6f257a"
- integrity sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f"
+ integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==
dependencies:
- "@babel/types" "^7.25.4"
+ "@babel/types" "^7.25.6"
"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3":
version "7.25.3"
@@ -333,18 +333,18 @@
"@babel/helper-plugin-utils" "^7.24.7"
"@babel/plugin-syntax-import-assertions@^7.24.1", "@babel/plugin-syntax-import-assertions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778"
- integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz#bb918905c58711b86f9710d74a3744b6c56573b5"
+ integrity sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.8"
"@babel/plugin-syntax-import-attributes@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca"
- integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde"
+ integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.8"
"@babel/plugin-syntax-import-meta@^7.10.4":
version "7.10.4"
@@ -1042,9 +1042,9 @@
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
"@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.24.4", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
- version "7.25.4"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.4.tgz#6ef37d678428306e7d75f054d5b1bdb8cf8aa8ee"
- integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2"
+ integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==
dependencies:
regenerator-runtime "^0.14.0"
@@ -1058,22 +1058,22 @@
"@babel/types" "^7.25.0"
"@babel/traverse@^7.18.9", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.4":
- version "7.25.4"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.4.tgz#648678046990f2957407e3086e97044f13c3e18e"
- integrity sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41"
+ integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==
dependencies:
"@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.25.4"
- "@babel/parser" "^7.25.4"
+ "@babel/generator" "^7.25.6"
+ "@babel/parser" "^7.25.6"
"@babel/template" "^7.25.0"
- "@babel/types" "^7.25.4"
+ "@babel/types" "^7.25.6"
debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.24.0", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
- version "7.25.4"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.4.tgz#6bcb46c72fdf1012a209d016c07f769e10adcb5f"
- integrity sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==
+"@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.24.0", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+ version "7.25.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6"
+ integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==
dependencies:
"@babel/helper-string-parser" "^7.24.8"
"@babel/helper-validator-identifier" "^7.24.7"
@@ -1090,9 +1090,9 @@
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@chromatic-com/storybook@^1.6.1":
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/@chromatic-com/storybook/-/storybook-1.7.0.tgz#456c614c9bde63240d8d565c4a8cd74bcc2fd719"
- integrity sha512-0aAkSaNsHaJL37/r+TIbpKjCouIysvoJno61LzUSs1xW4fpxF7gdr8xwIOONQjEsz2Fa0uFHXmzkFYcH6o8kmA==
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@chromatic-com/storybook/-/storybook-1.8.0.tgz#4ade5482c8abd404734300bcdfd88f471b56e040"
+ integrity sha512-vkB9dPVmM2Yvqc/0DJ4MYwOGY1MOjd/KbB9TXTMGN+qshaEyiZtSOgbz9u0ExFALEgDKLmtUnWyUtoGb0pCzUg==
dependencies:
chromatic "^11.4.0"
filesize "^10.0.12"
@@ -1107,17 +1107,17 @@
dependencies:
"@jridgewell/trace-mapping" "0.3.9"
-"@csstools/css-parser-algorithms@^3.0.0":
+"@csstools/css-parser-algorithms@^3.0.1":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz#f14ade63bae5f6025ac85c7d03fe47a7ca0e58af"
integrity sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==
-"@csstools/css-tokenizer@^3.0.0":
+"@csstools/css-tokenizer@^3.0.1":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz#9dd9b10084f3011290f96789598091e5bcb3c29a"
integrity sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==
-"@csstools/media-query-list-parser@^3.0.0":
+"@csstools/media-query-list-parser@^3.0.1":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz#9474e08e6d7767cf68c56bf1581b59d203360cb0"
integrity sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==
@@ -1771,6 +1771,11 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
+"@nolyfill/is-core-module@1.0.39":
+ version "1.0.39"
+ resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e"
+ integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==
+
"@pkgjs/parseargs@^0.11.0":
version "0.11.0"
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
@@ -2496,9 +2501,9 @@
integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==
"@types/node@*", "@types/node@^22.2.0":
- version "22.5.0"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.0.tgz#10f01fe9465166b4cab72e75f60d8b99d019f958"
- integrity sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==
+ version "22.5.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.1.tgz#de01dce265f6b99ed32b295962045d10b5b99560"
+ integrity sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==
dependencies:
undici-types "~6.19.2"
@@ -2508,9 +2513,9 @@
integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==
"@types/node@^18.0.0":
- version "18.19.45"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.45.tgz#a9ebfe4c316a356be7ca11f753ecb2feda6d6bdf"
- integrity sha512-VZxPKNNhjKmaC1SUYowuXSRSMGyQGmQjvvA1xE4QZ0xce2kLtEhPDS+kqpCPBZYgqblCLQ2DAjSzmgCM5auvhA==
+ version "18.19.47"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.47.tgz#18076201ad7dd3445046df6ce9ead5fe5abd9387"
+ integrity sha512-1f7dB3BL/bpd9tnDJrrHb66Y+cVrhxSOTGorRNdHwYTUlTay3HuTDPKo9a/4vX9pMQkhYBcAbL4jQdNlhCFP9A==
dependencies:
undici-types "~5.26.4"
@@ -2542,9 +2547,9 @@
"@types/react" "*"
"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^18.3.3":
- version "18.3.4"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.4.tgz#dfdd534a1d081307144c00e325c06e00312c93a3"
- integrity sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==
+ version "18.3.5"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.5.tgz#5f524c2ad2089c0ff372bbdabc77ca2c4dbadf8f"
+ integrity sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==
dependencies:
"@types/prop-types" "*"
csstype "^3.0.2"
@@ -3229,6 +3234,11 @@ async@^3.2.3:
resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
available-typed-arrays@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
@@ -3241,6 +3251,15 @@ axe-core@^4.9.1:
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59"
integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==
+axios@^1.7.5:
+ version "1.7.6"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.6.tgz#34f338182f6802fd3824a6511d6ddf99dd5ae0b5"
+ integrity sha512-Ekur6XDwhnJ5RgOCaxFnXyqlPALI3rVeukZMwOdfghW7/wGz784BYKiQq+QD8NPcr91KRo30KfHOchyijwWw7g==
+ dependencies:
+ follow-redirects "^1.15.6"
+ form-data "^4.0.0"
+ proxy-from-env "^1.1.0"
+
axobject-query@~3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1"
@@ -3611,9 +3630,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646:
- version "1.0.30001653"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz#b8af452f8f33b1c77f122780a4aecebea0caca56"
- integrity sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==
+ version "1.0.30001655"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f"
+ integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==
case-sensitive-paths-webpack-plugin@^2.4.0:
version "2.4.0"
@@ -3852,6 +3871,13 @@ colorette@^2.0.10, colorette@^2.0.20:
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -4163,7 +4189,7 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
-debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.6, debug@~4.3.6:
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6, debug@~4.3.6:
version "4.3.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b"
integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==
@@ -4251,6 +4277,11 @@ defu@^6.1.4:
resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479"
integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
depd@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
@@ -4430,9 +4461,9 @@ emittery@^0.13.1:
integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==
emoji-regex@^10.3.0:
- version "10.3.0"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23"
- integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==
+ version "10.4.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4"
+ integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==
emoji-regex@^8.0.0:
version "8.0.0"
@@ -4463,7 +4494,7 @@ endent@^2.0.1:
fast-json-parse "^1.0.3"
objectorarray "^1.0.5"
-enhanced-resolve@^5.12.0, enhanced-resolve@^5.17.1, enhanced-resolve@^5.7.0:
+enhanced-resolve@^5.15.0, enhanced-resolve@^5.17.1, enhanced-resolve@^5.7.0:
version "5.17.1"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15"
integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==
@@ -4678,9 +4709,9 @@ esbuild-register@^3.5.0:
"@esbuild/win32-x64" "0.21.5"
escalade@^3.1.1, escalade@^3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
- integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
escape-html@~1.0.3:
version "1.0.3"
@@ -4738,22 +4769,23 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9:
resolve "^1.22.4"
eslint-import-resolver-typescript@^3.5.2:
- version "3.6.1"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa"
- integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==
- dependencies:
- debug "^4.3.4"
- enhanced-resolve "^5.12.0"
- eslint-module-utils "^2.7.4"
- fast-glob "^3.3.1"
- get-tsconfig "^4.5.0"
- is-core-module "^2.11.0"
+ version "3.6.3"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e"
+ integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==
+ dependencies:
+ "@nolyfill/is-core-module" "1.0.39"
+ debug "^4.3.5"
+ enhanced-resolve "^5.15.0"
+ eslint-module-utils "^2.8.1"
+ fast-glob "^3.3.2"
+ get-tsconfig "^4.7.5"
+ is-bun-module "^1.0.2"
is-glob "^4.0.3"
-eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34"
- integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==
+eslint-module-utils@^2.8.0, eslint-module-utils@^2.8.1:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz#2ecad69d71e1fa81f17f7f24d5d3e46b168de663"
+ integrity sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==
dependencies:
debug "^3.2.7"
@@ -5072,7 +5104,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.2.9, fast-glob@^3.3.1, fast-glob@^3.3.2:
+fast-glob@^3.2.9, fast-glob@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
@@ -5137,9 +5169,9 @@ file-entry-cache@^6.0.1:
flat-cache "^3.0.4"
file-entry-cache@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-9.0.0.tgz#4478e7ceaa5191fa9676a2daa7030211c31b1e7e"
- integrity sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-9.1.0.tgz#2e66ad98ce93f49aed1b178c57b0b5741591e075"
+ integrity sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==
dependencies:
flat-cache "^5.0.0"
@@ -5260,9 +5292,14 @@ flatted@^3.2.9, flatted@^3.3.1:
integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
flow-parser@0.*:
- version "0.244.0"
- resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.244.0.tgz#dc75ef468959ca72ad5fd89a6a9b0503c141ea8a"
- integrity sha512-Dkc88m5k8bx1VvHTO9HEJ7tvMcSb3Zvcv1PY4OHK7pHdtdY2aUjhmPy6vpjVJ2uUUOIybRlb91sXE8g4doChtA==
+ version "0.245.0"
+ resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.245.0.tgz#d8ad7e706d280ce6d4189a206768c32f552b5099"
+ integrity sha512-xUBkkpIDfDZHAebnDEX65FCVitJUctab82KFmtP5SY4cGly1vbuYNe6Muyp0NLXrgmBChVdoC2T+3/RUHi4Mww==
+
+follow-redirects@^1.15.6:
+ version "1.15.6"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+ integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
for-each@^0.3.3:
version "0.3.3"
@@ -5297,6 +5334,15 @@ fork-ts-checker-webpack-plugin@^8.0.0:
semver "^7.3.5"
tapable "^2.2.1"
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@@ -5427,10 +5473,10 @@ get-symbol-description@^1.0.2:
es-errors "^1.3.0"
get-intrinsic "^1.2.4"
-get-tsconfig@^4.5.0:
- version "4.7.6"
- resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.6.tgz#118fd5b7b9bae234cc7705a00cd771d7eb65d62a"
- integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==
+get-tsconfig@^4.7.5:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.0.tgz#125dc13a316f61650a12b20c97c11b8fd996fedd"
+ integrity sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==
dependencies:
resolve-pkg-maps "^1.0.0"
@@ -5915,12 +5961,19 @@ is-boolean-object@^1.1.0:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
+is-bun-module@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.1.0.tgz#a66b9830869437f6cdad440ba49ab6e4dc837269"
+ integrity sha512-4mTAVPlrXpaN3jtF0lsnPCMGnq4+qZjVIKq0HCpfcqf8OC1SM5oATCIAPM5V5FN05qp2NNnFndphmdZS9CV3hA==
+ dependencies:
+ semver "^7.6.3"
+
is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
-is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1:
+is-core-module@^2.13.0, is-core-module@^2.13.1:
version "2.15.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
@@ -6593,9 +6646,9 @@ jiti@^1.20.0:
integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==
jose@^5.7.0:
- version "5.7.0"
- resolved "https://registry.yarnpkg.com/jose/-/jose-5.7.0.tgz#5c3a6eb811235e692e1af4891904b7b91b204f57"
- integrity sha512-3P9qfTYDVnNn642LCAqIKbTGb9a1TBxZ9ti5zEVEr48aDdflgRjhspWFb6WM4PzAfFbGMJYC4+803v8riCRAKw==
+ version "5.8.0"
+ resolved "https://registry.yarnpkg.com/jose/-/jose-5.8.0.tgz#0165cee08d89a6546d7eeeb9524dc42f458a56de"
+ integrity sha512-E7CqYpL/t7MMnfGnK/eg416OsFCVUrU/Y3Vwe7QjKhu/BkS1Ms455+2xsqZQVN57/U2MHMBvEb5SrmAZWAIntA==
js-cookie@^3.0.5:
version "3.0.5"
@@ -7053,7 +7106,7 @@ methods@~1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
-micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.7, micromatch@~4.0.7:
+micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.8, micromatch@~4.0.7:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
@@ -7074,7 +7127,7 @@ mime-db@1.52.0:
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34:
+mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
@@ -7751,7 +7804,7 @@ playwright-core@1.46.1:
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.46.1.tgz#28f3ab35312135dda75b0c92a3e5c0e7edb9cc8b"
integrity sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==
-playwright@1.46.1, playwright@^1.46.1:
+playwright@1.46.1:
version "1.46.1"
resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.46.1.tgz#ea562bc48373648e10420a10c16842f0b227c218"
integrity sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==
@@ -7848,7 +7901,7 @@ postcss@8.4.31:
picocolors "^1.0.0"
source-map-js "^1.0.2"
-postcss@^8, postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.41:
+postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.41:
version "8.4.41"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681"
integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==
@@ -7928,6 +7981,11 @@ proxy-addr@~2.0.7:
forwarded "0.2.0"
ipaddr.js "1.9.1"
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
public-encrypt@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
@@ -9042,13 +9100,13 @@ stylelint-config-standard@^36.0.0:
stylelint-config-recommended "^14.0.1"
stylelint@^16.8.1:
- version "16.8.2"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.8.2.tgz#7fda18b919a36e206e897417d4720baceb3af122"
- integrity sha512-fInKATippQhcSm7AB+T32GpI+626yohrg33GkFT/5jzliUw5qhlwZq2UQQwgl3HsHrf09oeARi0ZwgY/UWEv9A==
+ version "16.9.0"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.9.0.tgz#81615c0608b9dc645486e08e35c6c9206e1ba132"
+ integrity sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==
dependencies:
- "@csstools/css-parser-algorithms" "^3.0.0"
- "@csstools/css-tokenizer" "^3.0.0"
- "@csstools/media-query-list-parser" "^3.0.0"
+ "@csstools/css-parser-algorithms" "^3.0.1"
+ "@csstools/css-tokenizer" "^3.0.1"
+ "@csstools/media-query-list-parser" "^3.0.1"
"@csstools/selector-specificity" "^4.0.0"
"@dual-bundle/import-meta-resolve" "^4.1.0"
balanced-match "^2.0.0"
@@ -9070,7 +9128,7 @@ stylelint@^16.8.1:
known-css-properties "^0.34.0"
mathml-tag-names "^2.1.3"
meow "^13.2.0"
- micromatch "^4.0.7"
+ micromatch "^4.0.8"
normalize-path "^3.0.0"
picocolors "^1.0.1"
postcss "^8.4.41"
@@ -9081,7 +9139,7 @@ stylelint@^16.8.1:
resolve-from "^5.0.0"
string-width "^4.2.3"
strip-ansi "^7.1.0"
- supports-hyperlinks "^3.0.0"
+ supports-hyperlinks "^3.1.0"
svg-tags "^1.0.0"
table "^6.8.2"
write-file-atomic "^5.0.1"
@@ -9107,7 +9165,7 @@ supports-color@^8.0.0:
dependencies:
has-flag "^4.0.0"
-supports-hyperlinks@^3.0.0:
+supports-hyperlinks@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz#b56150ff0173baacc15f21956450b61f2b18d3ac"
integrity sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==