feature/get-places-api #2

Merged
behnam merged 26 commits from feature/get-places-api into develop 2023-05-23 09:23:56 +00:00
67 changed files with 915 additions and 464 deletions
Showing only changes of commit eddc7ac1ea - Show all commits

17
.babelrc Normal file
View File

@ -0,0 +1,17 @@
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current",
},
},
],
["@babel/preset-react", {
"runtime": "automatic"
}],
"@babel/preset-typescript"
],
"plugins": ["babel-plugin-transform-import-meta"]
}

11
.eslintignore Normal file
View File

@ -0,0 +1,11 @@
/node_modules
/public
/dist
vite.config.ts
.eslintrc.js
/build
/src/vite-env.d.ts
tailwind.config.cjs
postcss.config.cjs
fileMock.js
jest.config.js

81
.eslintrc.json Normal file
View File

@ -0,0 +1,81 @@
{
"env": {
"browser": true,
"es2021": true
},
"settings": {
"react": {
"version": "detect"
},
"import/resolver": {
"alias": {
"map": [["~", "./src"]],
"extensions": [".js",".ts",".tsx", ".d.ts", ".json"]
}
}
},
"extends": [
"airbnb",
"eslint:recommended",
"plugin:react/recommended",
"plugin:react/recommended",
"plugin:jest/recommended",
"plugin:prettier/recommended",
"plugin:@typescript-eslint/recommended"
],
"overrides": [],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": ["react", "@typescript-eslint", "jest", "prettier"],
"rules": {
"object-curly-spacing": ["error", "always"],
"import/extensions": [
"error",
"ignorePackages",
{
"js": "never",
"jsx": "never",
"ts": "never",
"tsx": "never"
}
],
"import/no-extraneous-dependencies": ["error", { "devDependencies": true }],
"class-methods-use-this": "off",
"import/no-import-module-exports": "off",
"react/require-default-props": "off",
"import/prefer-default-export": "off",
"jsx-a11y/click-events-have-key-events": "off",
"jsx-a11y/no-static-element-interactions": "off",
"@typescript-eslint/no-unused-vars": "error",
"@typescript-eslint/no-shadow": "error",
"no-shadow": "off",
"no-return-await": "off",
"import/order": [
"error",
{
"pathGroups": [
{
"pattern": "~/**",
"group": "external"
}
]
}
],
"prettier/prettier": [
"error",
{},
{
"usePrettierrc": true,
"endOfLine": "auto"
}
],
"jest/valid-title": "off",
"react/button-has-type": "off",
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx", ".ts", ".tsx"] }],
"react/react-in-jsx-scope": "off",
"@typescript-eslint/no-namespace": "off"
}
}

5
.husky/pre-push Executable file
View File

@ -0,0 +1,5 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm run test && npm run lint
npm run test && npm run lint

View File

@ -8,5 +8,7 @@ export default {
"\\.(css|less)$": "identity-obj-proxy",
"^~(.*)$": "<rootDir>/src$1"
},
transformIgnorePatterns: ['<rootDir>/node_modules/'],
transformIgnorePatterns: [
"node_modules/(?!(spacetime)/)"
]
}

8
package-lock.json generated
View File

@ -7704,6 +7704,14 @@
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
"swr": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/swr/-/swr-2.1.5.tgz",
"integrity": "sha512-/OhfZMcEpuz77KavXST5q6XE9nrOBOVcBLWjMT+oAE/kQHyE3PASrevXCtQDZ8aamntOfFkbVJp7Il9tNBQWrw==",
"requires": {
"use-sync-external-store": "^1.2.0"
}
},
"symbol-tree": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",

View File

@ -8,7 +8,7 @@
"build": "tsc && vite build",
"preview": "vite preview",
"lint": "eslint --fix --ignore-path .eslintignore --ignore-pattern \"!**/.*\" .",
"prepare": "husky install",
"prepare": "husky install && husky add .husky/pre-push \"npm run test && npm run lint\"",
"test": "jest",
"tsc": "tsc"
},
@ -18,16 +18,17 @@
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-redux": "^8.0.5",
"react-router-dom": "^6.9.0"
"react-router-dom": "^6.9.0",
"swr": "^2.1.5"
},
"devDependencies": {
"@babel/preset-env": "^7.20.2",
"@babel/preset-env": "^7.21.5",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.21.0",
"@babel/preset-typescript": "^7.21.5",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^14.0.0",
"@testing-library/user-event": "^14.4.3",
"@types/jest": "^29.4.0",
"@types/jest": "^29.5.1",
"@types/react": "^18.0.27",
"@types/react-dom": "^18.0.10",
"@typescript-eslint/eslint-plugin": "^5.54.1",

13
prettierrc.json Normal file
View File

@ -0,0 +1,13 @@
{
"printWidth": 120,
"tabWidth": 2,
"endOfLine":"auto",
"useTabs": false,
"semi": true,
"singleQuote": true,
"quoteProps": "as-needed",
"jsxSingleQuote": true,
"trailingComma": "all",
"bracketSpacing": true,
"arrowParens": "always"
}

View File

@ -1 +1 @@
import '@testing-library/jest-dom';
import "@testing-library/jest-dom";

View File

@ -0,0 +1,4 @@
type Place = {
placeType: string;
name: string;
};

View File

@ -0,0 +1,5 @@
import { GetPlacesRO } from "../response-object/protocols";
type IGetPlacesRepo = () => Promise<GetPlacesRO>;
export default IGetPlacesRepo;

View File

@ -0,0 +1,13 @@
import { GetPlacesRO, GetPlacesResponse } from "./protocols";
const getPlacesRO = (placeResponse: GetPlacesResponse): GetPlacesRO => ({
id: placeResponse._id,
placeType: placeResponse.place_type,
name: placeResponse.name,
parentId: placeResponse.place_type,
availableServices: placeResponse.available_services,
createdAt: placeResponse.createdAt,
updatedAt: placeResponse.updatedAt,
})
export default getPlacesRO;

View File

@ -0,0 +1,19 @@
export type GetPlacesResponse = {
_id: string;
place_type: string;
name: string;
parent_id: string | null;
createdAt: string;
updatedAt: string;
available_services: string[];
};
export type GetPlacesRO = {
id: string;
placeType: string;
name: string;
parentId: string | null;
availableServices: string[];
createdAt: string;
updatedAt: string;
};

View File

@ -0,0 +1,25 @@
import IGetPlacesRepo from "../../data/repository/IGetPlacesRepo";
import { GetPlacesRO } from "../../data/response-object/protocols";
import GettingPlacesUsecase from "../getPlaceUsecase";
const mockedRO: GetPlacesRO = {
availableServices: [""],
createdAt: "createdAt",
id: "id",
name: "name",
parentId: null,
placeType: "continent",
updatedAt: "updatedTime",
};
const mockedRepo: IGetPlacesRepo = jest
.fn()
.mockImplementation(async () => mockedRO);
describe("getting places usecase tests", () => {
it("call repository on execute usecase", async () => {
const usecase = new GettingPlacesUsecase(mockedRepo);
await usecase.execute();
expect(mockedRepo).toHaveBeenCalledTimes(1);
});
});

View File

@ -0,0 +1,19 @@
import IGetPlacesRepo from "../data/repository/IGetPlacesRepo";
import { GetPlacesRO } from "../data/response-object/protocols";
/**
* this usecase is responsible for calling the repo and returning the places data from the repository
*/
class GettingPlacesUsecase {
private repository: IGetPlacesRepo;
constructor(repository: IGetPlacesRepo) {
this.repository = repository;
}
async execute(): Promise<GetPlacesRO> {
// call usecase and return the repo
}
}
export default GettingPlacesUsecase;

View File

@ -1,8 +1,15 @@
import axios, { AxiosRequestConfig } from 'axios';
import { staticMessages } from '~/driven/utils/constants/staticMessages';
import axios, { AxiosRequestConfig } from "axios";
import { staticMessages } from "~/driven/utils/constants/staticMessages";
export class HTTPBoundary {
async request<R>(options: AxiosRequestConfig) {
async request<R>(customOptions: AxiosRequestConfig) {
const options: AxiosRequestConfig = {
...customOptions,
headers: {
...customOptions.headers,
Authorization: `Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI4NXh0WnA5eThxVDBXVDkwUFpuUkRja3N4LWw0clVyM0tHQW5JSU9DckJNIn0.eyJleHAiOjE2ODQ1NzUyNDksImlhdCI6MTY4NDQ4ODg0OSwianRpIjoiYjI3MDUwMzYtMzMwZi00MTRkLWE2Y2QtNWRiYWUzOTRkMjczIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy9kaXBhbF9kZXYiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiY2RmYzY3YzQtZGJkOC00NGVhLWI0OWEtYjQ3MjZhMzNmOTAxIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiY29tZm9ydGVjaCIsInNlc3Npb25fc3RhdGUiOiJmMzBhYzJlOS04ZTAxLTQxYjItYmI2OS0yYmMyNGEwOGRjNGUiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiZGVmYXVsdC1yb2xlcy1tYXN0ZXIiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiY29tZm9ydGVjaCI6eyJyb2xlcyI6WyJ1c2VyIiwib3BlcmF0b3IiXX0sImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6ImYzMGFjMmU5LThlMDEtNDFiMi1iYjY5LTJiYzI0YTA4ZGM0ZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiKzc3Nzc3Nzc3Nzc3In0.tzM7W8szzcN1AK3XOtgUCGbHkmWd4bnqr-jvcwBICtNbl5Dty8RxK_ONFp6g5X8wI0pVPKx4qLvWkE7jXQcg1XDZW_H1V-ucZZ_a9POffDRZ5xSNcREnjfKhw3gvjK9YSSBeMf08abDexbVSJW4rbPxtmcO9WGdZN8C1k7O-_9VHz-3NBCq7vRYBNID--xVTga_MMv3mCORzHtUdx2D7B2d7YxBAjQs5x9JCl_eXuN_IHODc2HMww-s5akquzdEKGFSfASu30NpNZucbO9XyTMkAWuV-H9Xd73eq5o-tSd0jMOfY9G1it9xLAM2Gk4xmIuUA16aLnjY7_rmm3rOypw`,
},
};
const response = await axios<R>(options);
if (!response) throw new Error(staticMessages.service.errors[500]);

View File

@ -1,4 +1,9 @@
import { NavigateFunction, Outlet, useLocation, useNavigate } from 'react-router-dom';
import {
NavigateFunction,
Outlet,
useLocation,
useNavigate,
} from "react-router-dom";
class RouterBoundary {
outletRoute = () => <Outlet />;

View File

@ -1,6 +1,6 @@
import store from '../store/store';
import userSlice from '../slices/userSlice';
import { UserState } from '../slices/protocols/userSliceProtocols';
import store from "../store/store";
import userSlice from "../slices/userSlice";
import { UserState } from "../slices/protocols/userSliceProtocols";
export const userAdapter = {
get: store.getState().user,

View File

@ -1 +1 @@
export { userAdapter } from './adapters/adapter';
export { userAdapter } from "./adapters/adapter";

View File

@ -1,3 +1,3 @@
import { UserModel } from '~/business-logic/generic/user/common/domain/model/userModel';
import { UserModel } from "~/business-logic/generic/user/common/domain/model/userModel";
export type UserState = UserModel;

View File

@ -1,7 +1,7 @@
import { createSlice, SliceCaseReducers } from '@reduxjs/toolkit';
import { UserState } from './protocols/userSliceProtocols';
import { createSlice, SliceCaseReducers } from "@reduxjs/toolkit";
import { UserState } from "./protocols/userSliceProtocols";
export const userStateName = 'user';
export const userStateName = "user";
const userSlice = createSlice<UserState, SliceCaseReducers<UserState>>({
name: userStateName,
initialState: null,

View File

@ -1,5 +1,5 @@
import { combineReducers, configureStore } from '@reduxjs/toolkit';
import userSlice, { userStateName } from '../slices/userSlice';
import { combineReducers, configureStore } from "@reduxjs/toolkit";
import userSlice, { userStateName } from "../slices/userSlice";
const combinedReducers = combineReducers({
[userStateName]: userSlice.reducer,

View File

@ -1,4 +1,4 @@
import React from 'react'
import React from "react";
interface IPrimaryButtonProps {
title: string;
@ -9,6 +9,11 @@ interface IPrimaryButtonProps {
export default function PrimaryButton(props: IPrimaryButtonProps) {
const { onClick, title, className } = props;
return (
<button onClick={onClick} className={`py-1 px-5 transition-all hover:bg-primary-300 bg-primary-main rounded-lg text-white text-center ${className}`}>{ title }</button>
)
<button
onClick={onClick}
className={`py-1 px-5 transition-all hover:bg-primary-300 bg-primary-main rounded-lg text-white text-center ${className}`}
>
{title}
</button>
);
}

View File

@ -1,4 +1,4 @@
import React from 'react'
import React from "react";
interface ISimpleInput {
title: string;
@ -9,8 +9,13 @@ export default function SimpleInput(props: ISimpleInput) {
const { title, className } = props;
return (
<div className={`flex flex-col ${className}`}>
<label className='mb-1 text-txt-second text-xs' htmlFor={title}>{ title }</label>
<input className='bg-bg-gray h-11 rounded-lg focus:outline-0 px-2 text-txt-medium' id={title} />
<label className="mb-1 text-txt-second text-xs" htmlFor={title}>
{title}
</label>
<input
className="bg-bg-gray h-11 rounded-lg focus:outline-0 px-2 text-txt-medium"
id={title}
/>
</div>
)
);
}

View File

@ -1,13 +1,17 @@
import React from 'react'
import React from "react";
interface IPageTitleProps {
title: string;
className?: string;
title: string;
className?: string;
}
export default function PageTitle(props: IPageTitleProps) {
const { title, className } = props;
const { title, className } = props;
return (
<div className={`w-full shadow-sm shadow-txt-light font-semibold ${className}`}>{title}</div>
)
<div
className={`w-full shadow-sm shadow-txt-light font-semibold ${className}`}
>
{title}
</div>
);
}

View File

@ -4,24 +4,22 @@ import { staticMessages } from "../constants/staticMessages";
export const appConfig = {};
export const routes = {
usersList: '/',
createUser: '/create-user'
usersList: "/",
createUser: "/create-user",
};
export const routesData = {
usersList: {
path: routes.usersList,
icon: icons.users,
title: staticMessages.global.users
title: staticMessages.global.users,
},
createUser: {
path: routes.createUser,
icon: icons.createUser,
title: staticMessages.global.createUser
}
}
title: staticMessages.global.createUser,
},
};
const baseApiUrl = import.meta.env.BASE_API_URL;
export const apiUrls = {
};
export const apiUrls = {};

View File

@ -1,7 +1,7 @@
const baseAssetsUrl = 'assets/';
const baseIconsUrl = baseAssetsUrl + 'icons/';
const baseAssetsUrl = "assets/";
const baseIconsUrl = `${baseAssetsUrl}icons/`;
export const icons = {
logo: baseIconsUrl + 'logo.svg',
users: baseIconsUrl + 'users.svg',
createUser: baseIconsUrl + 'createuser.svg'
}
logo: `${baseIconsUrl}logo.svg`,
users: `${baseIconsUrl}users.svg`,
createUser: `${baseIconsUrl}createuser.svg`,
};

View File

@ -1,24 +1,24 @@
export const staticMessages = {
global: {
errors: {
input: 'please fill all inputs correctly',
input: "please fill all inputs correctly",
},
users: 'Users',
submit: 'Submit',
fistname: 'Firstname',
lastname: 'Lastname',
place_id: 'Place id',
title: 'title',
status: 'Status',
address: 'Address',
qrCode: 'qrCode',
createUser: 'Create user',
phoneNumber: 'Phone Number'
users: "Users",
submit: "Submit",
fistname: "Firstname",
lastname: "Lastname",
place_id: "Place id",
title: "title",
status: "Status",
address: "Address",
qrCode: "qrCode",
createUser: "Create user",
phoneNumber: "Phone Number",
},
service: {
errors: {
500: 'server not respond please try again later!',
401: 'Authentication error!',
500: "server not respond please try again later!",
401: "Authentication error!",
},
},
};

View File

@ -1,4 +1,7 @@
import { errorHandlingStateTypes, UIErrorHandling } from './protocols/globalHelpersProtocols';
import {
errorHandlingStateTypes,
UIErrorHandling,
} from "./protocols/globalHelpersProtocols";
export const UIErrorHandlingFactory = <DATA_RESPONSE>({
state,

View File

@ -1,7 +1,7 @@
export enum errorHandlingStateTypes {
error = 'error',
warning = 'warning',
success = 'success',
error = "error",
warning = "warning",
success = "success",
}
export type UIErrorHandling<DATA_RESPONSE> = {

View File

@ -1,9 +1,9 @@
export type RequestMethods = 'get' | 'post' | 'put' | 'delete';
export type RequestMethods = "get" | "post" | "put" | "delete";
export type apiGlobalResponseObject<DataType> = {
type: 'Success' | 'client Error' | string;
type: "Success" | "client Error" | string;
status: 200 | 400 | 401 | 500 | number;
message: string;
description: string;
data: DataType;
}
};

View File

@ -1,3 +1,3 @@
import TableRow from "./infra/TableRowInfra";
export default TableRow;
export default TableRow;

View File

@ -1,13 +1,19 @@
import React from 'react'
import { ITableRowInfra } from './protocols'
import useTableRowVM from '../viewmodel/tableRowVM';
import TableRowView from '../view/TableRow';
import React from "react";
import useTableRowVM from "../viewmodel/tableRowVM";
import TableRowView from "../view/TableRow";
import { ITableRowInfra } from "./protocols";
export default function TableRow(props: ITableRowInfra) {
const { rowData, selectedRowId, setSelectedRowId } = props;
const { rowId } = rowData;
const { isRowSelected } = useTableRowVM({selectedRowId, rowId});
const { isRowSelected } = useTableRowVM({ selectedRowId, rowId });
return <TableRowView isSelected={isRowSelected} rowData={rowData} setSelectedRowId={setSelectedRowId}/>
return (
<TableRowView
isSelected={isRowSelected}
rowData={rowData}
setSelectedRowId={setSelectedRowId}
/>
);
}

View File

@ -3,6 +3,6 @@ export interface ITableRowInfra {
rowData: {
rowItemsTitle: string[];
rowId: string;
}
setSelectedRowId: React.Dispatch<React.SetStateAction<string>>
}
};
setSelectedRowId: React.Dispatch<React.SetStateAction<string>>;
}

View File

@ -1,15 +1,20 @@
import React from 'react'
import RowItem from './table-row-item/view/RowItem';
import { ITableRowProps } from './protocols';
import React from "react";
import RowItem from "./table-row-item/view/RowItem";
import { ITableRowProps } from "./protocols";
export default function TableRowView(props: ITableRowProps) {
const { isSelected, setSelectedRowId, rowData } = props;
const { rowId, rowItemsTitle } = rowData;
const columns = rowItemsTitle.map((rowItemTitle, index) => {
return <RowItem key={rowItemTitle} hasCheckbox={index === 0} isSelected={isSelected} title={rowItemTitle} />
})
return (
<RowItem
key={rowItemTitle}
hasCheckbox={index === 0}
isSelected={isSelected}
title={rowItemTitle}
/>
);
});
return (
<tr onClick={() => setSelectedRowId(rowId)}>{ columns }</tr>
)
return <tr onClick={() => setSelectedRowId(rowId)}>{columns}</tr>;
}

View File

@ -3,6 +3,6 @@ export interface ITableRowProps {
rowData: {
rowItemsTitle: string[];
rowId: string;
}
setSelectedRowId: React.Dispatch<React.SetStateAction<string>>
}
};
setSelectedRowId: React.Dispatch<React.SetStateAction<string>>;
}

View File

@ -1,24 +1,31 @@
import React, { useState } from 'react'
import React, { useState } from "react";
interface IRowItemProp {
title: string;
hasCheckbox: boolean;
isSelected: boolean;
isSelected: boolean;
}
export default function RowItem(props: IRowItemProp) {
const { title, hasCheckbox, isSelected } = props;
return (
<td className={`px-1 py-2 ${isSelected ? 'bg-primary-100' : ''}`}>
<div className='w-full flex'>
{
hasCheckbox &&
<span className={`checkmak-container flex justify-center items-center mr-2 transition-all ${isSelected ? 'opacity-100' : 'opacity-0'}`}>
<span className={`${isSelected ? 'visible' : 'hidden'} transition-all`}>&#10003;</span>
</span>
}
{ title }
<td className={`px-1 py-2 ${isSelected ? "bg-primary-100" : ""}`}>
<div className="w-full flex">
{hasCheckbox && (
<span
className={`checkmak-container flex justify-center items-center mr-2 transition-all ${
isSelected ? "opacity-100" : "opacity-0"
}`}
>
<span
className={`${isSelected ? "visible" : "hidden"} transition-all`}
>
&#10003;
</span>
</span>
)}
{title}
</div>
</td>
)
);
}

View File

@ -5,4 +5,4 @@ export interface IUserTableRowVM {
export type tableRowVMReturnType = {
isRowSelected: boolean;
}
};

View File

@ -3,8 +3,8 @@ import { IUserTableRowVM, tableRowVMReturnType } from "./protocols";
const useTableRowVM = (dependencies: IUserTableRowVM): tableRowVMReturnType => {
const { rowId, selectedRowId } = dependencies;
return {
isRowSelected: rowId === selectedRowId
}
}
isRowSelected: rowId === selectedRowId,
};
};
export default useTableRowVM;
export default useTableRowVM;

View File

@ -1,3 +1,3 @@
import CreateUser from "./infra/CreateUser";
export default CreateUser;
export default CreateUser;

View File

@ -1,6 +1,6 @@
import React from 'react'
import CreateUserView from '../view/CreateUserView'
import React from "react";
import CreateUserView from "../view/CreateUserView";
export default function CreateUser() {
return <CreateUserView />
return <CreateUserView />;
}

View File

@ -1,19 +1,31 @@
import React from 'react'
import PrimaryButton from '~/driven/utils/components/buttons/primary-button/PrimaryButton'
import SimpleInput from '~/driven/utils/components/inputs/simple-input/SimpleInput'
import { staticMessages } from '~/driven/utils/constants/staticMessages'
import React from "react";
import PrimaryButton from "~/driven/utils/components/buttons/primary-button/PrimaryButton";
import SimpleInput from "~/driven/utils/components/inputs/simple-input/SimpleInput";
import { staticMessages } from "~/driven/utils/constants/staticMessages";
export default function CreateUserView() {
return (
<div className='px-4 my-8'>
<div className='flex flex-wrap w-full gap-4'>
<SimpleInput title={staticMessages.global.fistname} className='mb-4 w-[48%]' />
<SimpleInput title={staticMessages.global.lastname} className='mb-4 w-[48%]'/>
<SimpleInput title={staticMessages.global.phoneNumber} className='mb-4 w-[48%]'/>
<div className="px-4 my-8">
<div className="flex flex-wrap w-full gap-4">
<SimpleInput
title={staticMessages.global.fistname}
className="mb-4 w-[48%]"
/>
<SimpleInput
title={staticMessages.global.lastname}
className="mb-4 w-[48%]"
/>
<SimpleInput
title={staticMessages.global.phoneNumber}
className="mb-4 w-[48%]"
/>
</div>
<div className='flex'>
<PrimaryButton onClick={() => {}} title={staticMessages.global.submit} />
<div className="flex">
<PrimaryButton
onClick={() => {}}
title={staticMessages.global.submit}
/>
</div>
</div>
)
);
}

View File

@ -1,3 +1,3 @@
import PlacesList from "./infra/PlacesList";
export default PlacesList;
export default PlacesList;

View File

@ -1,8 +1,13 @@
import React from 'react'
import PlacesListView from '../view/PlacesListView'
import usePlacesListVM from '../viewmodel/placesListVM'
import React from "react";
import PlacesListView from "../view/PlacesListView";
import usePlacesListVM from "../viewmodel/placesListVM";
export default function PlacessList() {
const { selectedRowId, setSelectedRowId } = usePlacesListVM()
return <PlacesListView selectedRowId={selectedRowId} setSelectedRowId={setSelectedRowId} />
const { selectedRowId, setSelectedRowId } = usePlacesListVM();
return (
<PlacesListView
selectedRowId={selectedRowId}
setSelectedRowId={setSelectedRowId}
/>
);
}

View File

@ -1,3 +1 @@
export interface IPlacesListInfraProps {
}
export interface IPlacesListInfraProps {}

View File

@ -1,72 +1,71 @@
import React from 'react'
import RowItem from '../../common/table-row/view/table-row-item/view/RowItem'
import TableRow from '../../common/table-row'
import { IPlacesListProps } from './protocols'
import { staticMessages } from '~/driven/utils/constants/staticMessages';
import React from "react";
import { staticMessages } from "~/driven/utils/constants/staticMessages";
import RowItem from "../../common/table-row/view/table-row-item/view/RowItem";
import TableRow from "../../common/table-row";
import { IPlacesListProps } from "./protocols";
export default function UsersListView(props: IPlacesListProps) {
const { selectedRowId, setSelectedRowId } = props;
const { selectedRowId, setSelectedRowId } = props;
const rows = () => {
const placesdata = [
{
id: '1',
place_id: '6440020b89366fdcaf15a8c2',
title: 'flat demoplace ',
status: 'demo',
address: 'demoplace'
},
{
id: '2',
place_id: '6440020b89366fdcaf15asdfa',
title: 'flat demoplace second ',
status: 'demo second',
address: 'demoplace second'
}
]
const rows = () => {
const placesdata = [
{
id: "1",
place_id: "6440020b89366fdcaf15a8c2",
title: "flat demoplace ",
status: "demo",
address: "demoplace",
},
{
id: "2",
place_id: "6440020b89366fdcaf15asdfa",
title: "flat demoplace second ",
status: "demo second",
address: "demoplace second",
},
];
const rowData = {
rowItemsTitle: placesdata.map(places => {
return [
places.id,
places.title,
places.status,
places.address,
]
}),
rowId: placesdata[0].id
}
const rowData = {
rowItemsTitle: placesdata.map((places) => {
return [places.id, places.title, places.status, places.address];
}),
rowId: placesdata[0].id,
};
return placesdata.map(places => {
const rowData = {
rowItemsTitle: [
places.id,
places.title,
places.status,
places.address,
''
],
rowId: places.id,
}
return <TableRow key={rowData.rowId} rowData={rowData} selectedRowId={selectedRowId} setSelectedRowId={setSelectedRowId} />
})
}
return placesdata.map((places) => {
const rowData = {
rowItemsTitle: [
places.id,
places.title,
places.status,
places.address,
"",
],
rowId: places.id,
};
return (
<TableRow
key={rowData.rowId}
rowData={rowData}
selectedRowId={selectedRowId}
setSelectedRowId={setSelectedRowId}
/>
);
});
};
return (
<table className='table-auto rounded-md w-full text-sm'>
<thead className='text-txt-medium font-bold'>
<tr>
<th className='py-3'>{staticMessages.global.place_id}</th>
<th className='py-3'>{staticMessages.global.title}</th>
<th className='py-3'>{staticMessages.global.status}</th>
<th className='py-3'>{staticMessages.global.address}</th>
<th className='py-3'>{staticMessages.global.qrCode}</th>
</tr>
</thead>
<tbody>
{ rows() }
</tbody>
<table className="table-auto rounded-md w-full text-sm">
<thead className="text-txt-medium font-bold">
<tr>
<th className="py-3">{staticMessages.global.place_id}</th>
<th className="py-3">{staticMessages.global.title}</th>
<th className="py-3">{staticMessages.global.status}</th>
<th className="py-3">{staticMessages.global.address}</th>
<th className="py-3">{staticMessages.global.qrCode}</th>
</tr>
</thead>
<tbody>{rows()}</tbody>
</table>
)
);
}

View File

@ -1,4 +1,4 @@
export interface IPlacesListProps {
selectedRowId: string;
setSelectedRowId: React.Dispatch<React.SetStateAction<string>>;
}
}

View File

@ -2,12 +2,12 @@ import { useState } from "react";
import { placesListReturnType } from "./protocols";
const usePlacesListVM = (): placesListReturnType => {
const [ selectedRowId, setSelectedRowId ] = useState<string>('');
const [selectedRowId, setSelectedRowId] = useState<string>("");
return {
selectedRowId,
setSelectedRowId,
}
}
};
};
export default usePlacesListVM;
export default usePlacesListVM;

View File

@ -1,9 +1,8 @@
import React from "react";
export interface IPlacesListVM {
}
export interface IPlacesListVM {}
export type placesListReturnType = {
selectedRowId: string;
setSelectedRowId: React.Dispatch<React.SetStateAction<string>>;
}
};

View File

@ -1,3 +1,3 @@
import UsersList from "./infra/UsersList";
export default UsersList;
export default UsersList;

View File

@ -1,8 +1,13 @@
import React from 'react'
import useUsersListVM from '../viewmodel/usersListVM'
import UsersListView from '../view/UsersListView'
import React from "react";
import useUsersListVM from "../viewmodel/usersListVM";
import UsersListView from "../view/UsersListView";
export default function UsersList() {
const { selectedRowId, setSelectedRowId } = useUsersListVM()
return <UsersListView selectedRowId={selectedRowId} setSelectedRowId={setSelectedRowId} />
const { selectedRowId, setSelectedRowId } = useUsersListVM();
return (
<UsersListView
selectedRowId={selectedRowId}
setSelectedRowId={setSelectedRowId}
/>
);
}

View File

@ -1,3 +1 @@
export interface IUsersListInfraProps {
}
export interface IUsersListInfraProps {}

View File

@ -1,60 +1,58 @@
import React from 'react'
import RowItem from '../../common/table-row/view/table-row-item/view/RowItem'
import TableRow from '../../common/table-row'
import { IUserListProps } from './protocols'
import { staticMessages } from '~/driven/utils/constants/staticMessages';
import React from "react";
import { staticMessages } from "~/driven/utils/constants/staticMessages";
import RowItem from "../../common/table-row/view/table-row-item/view/RowItem";
import TableRow from "../../common/table-row";
import { IUserListProps } from "./protocols";
export default function UsersListView(props: IUserListProps) {
const { selectedRowId, setSelectedRowId } = props;
const { selectedRowId, setSelectedRowId } = props;
const rows = () => {
const userdata = [
{
id: '1',
firstname: 'behnam',
lastname: 'rahimpour'
},
{
id: '2',
firstname: 'Salar',
lastname: 'Sali'
}
]
const rows = () => {
const userdata = [
{
id: "1",
firstname: "behnam",
lastname: "rahimpour",
},
{
id: "2",
firstname: "Salar",
lastname: "Sali",
},
];
const rowData = {
rowItemsTitle: userdata.map(user => {
return [
user.firstname,
user.lastname
]
}),
rowId: userdata[0].id
}
const rowData = {
rowItemsTitle: userdata.map((user) => {
return [user.firstname, user.lastname];
}),
rowId: userdata[0].id,
};
return userdata.map(user => {
const rowData = {
rowItemsTitle: [
user.firstname,
user.lastname
],
rowId: user.id,
}
return <TableRow key={rowData.rowId} rowData={rowData} selectedRowId={selectedRowId} setSelectedRowId={setSelectedRowId} />
})
}
return userdata.map((user) => {
const rowData = {
rowItemsTitle: [user.firstname, user.lastname],
rowId: user.id,
};
return (
<TableRow
key={rowData.rowId}
rowData={rowData}
selectedRowId={selectedRowId}
setSelectedRowId={setSelectedRowId}
/>
);
});
};
return (
<table className='table-auto rounded-md w-full text-sm'>
<thead className='text-txt-medium font-bold'>
<tr>
<th className='py-3'>{staticMessages.global.fistname}</th>
<th className='py-3'>{staticMessages.global.lastname}</th>
</tr>
</thead>
<tbody>
{ rows() }
</tbody>
<table className="table-auto rounded-md w-full text-sm">
<thead className="text-txt-medium font-bold">
<tr>
<th className="py-3">{staticMessages.global.fistname}</th>
<th className="py-3">{staticMessages.global.lastname}</th>
</tr>
</thead>
<tbody>{rows()}</tbody>
</table>
)
);
}

View File

@ -1,4 +1,4 @@
export interface IUserListProps {
selectedRowId: string;
setSelectedRowId: React.Dispatch<React.SetStateAction<string>>;
}
}

View File

@ -1,9 +1,8 @@
import React from "react";
export interface IUsersListVM {
}
export interface IUsersListVM {}
export type userListReturnType = {
selectedRowId: string;
setSelectedRowId: React.Dispatch<React.SetStateAction<string>>;
}
};

View File

@ -2,12 +2,12 @@ import { useState } from "react";
import { userListReturnType } from "./protocols";
const useUsersListVM = (): userListReturnType => {
const [ selectedRowId, setSelectedRowId ] = useState<string>('');
const [selectedRowId, setSelectedRowId] = useState<string>("");
return {
selectedRowId,
setSelectedRowId,
}
}
};
};
export default useUsersListVM;
export default useUsersListVM;

View File

@ -1,3 +1,3 @@
import Sidebar from "./view/Sidebar";
export default Sidebar;
export default Sidebar;

View File

@ -1,29 +1,35 @@
import React from 'react'
import { Link, useLocation } from 'react-router-dom'
import { routesData } from '~/driven/utils/configs/appConfig'
import { icons } from '~/driven/utils/constants/assertUrls'
import React from "react";
import { Link, useLocation } from "react-router-dom";
import { routesData } from "~/driven/utils/configs/appConfig";
import { icons } from "~/driven/utils/constants/assertUrls";
export default function Sidebar() {
const isCurrentPage = useLocation()
const isCurrentPage = useLocation();
const pages = Object.keys(routesData).map(routeKey => {
const key = routeKey as keyof typeof routesData
const pages = Object.keys(routesData).map((routeKey) => {
const key = routeKey as keyof typeof routesData;
return (
<Link key={key} to={routesData[key].path} className={`flex text-white mb-6 text-sm w-full py-2 pl-2 rounded-lg ${ isCurrentPage.pathname === routesData[key].path ? 'bg-primary-300' : ''}`}>
<img src={routesData[key].icon} className='mr-2'/>
<div>{routesData[key].title}</div>
</Link>
)
})
<Link
key={key}
to={routesData[key].path}
className={`flex text-white mb-6 text-sm w-full py-2 pl-2 rounded-lg ${
isCurrentPage.pathname === routesData[key].path
? "bg-primary-300"
: ""
}`}
>
<img src={routesData[key].icon} className="mr-2" />
<div>{routesData[key].title}</div>
</Link>
);
});
return (
<aside className='w-[15rem] min-w-[10rem] [background:var(--color-gradient-primary-dark)] p-4 pt-6'>
<div className='logo'>
<img src={icons.logo} alt="logo icon" />
</div>
<div className='mt-14 flex flex-col items-baseline'>
{ pages }
</div>
<aside className="w-[15rem] min-w-[10rem] [background:var(--color-gradient-primary-dark)] p-4 pt-6">
<div className="logo">
<img src={icons.logo} alt="logo icon" />
</div>
<div className="mt-14 flex flex-col items-baseline">{pages}</div>
</aside>
)
);
}

View File

@ -1,6 +1,6 @@
import { BrowserRouter as RouterWrapper } from 'react-router-dom';
import Router from './Router/Router';
import './style/App.css';
import { BrowserRouter as RouterWrapper } from "react-router-dom";
import Router from "./Router/Router";
import "./style/App.css";
function App() {
return (

View File

@ -1,19 +1,19 @@
import { Navigate, Route, Routes, useLocation } from 'react-router-dom';
import Home from '~/driving/main/pages';
import { routes } from '~/driven/utils/configs/appConfig';
import CreateUser from '../pages/CreateUser';
import MainPageLayout from '../pages/layouts/MainPageLayout';
import { Navigate, Route, Routes, useLocation } from "react-router-dom";
import Home from "~/driving/main/pages";
import { routes } from "~/driven/utils/configs/appConfig";
import CreateUser from "../pages/CreateUser";
import MainPageLayout from "../pages/layouts/MainPageLayout";
export default function Router() {
const location = useLocation();
return (
<Routes location={location} key={location.key}>
<Route element={<MainPageLayout />} >
<Route element={<MainPageLayout />}>
<Route index element={<Home />} />
<Route path={routes.createUser} element={<CreateUser />} />
</Route>
<Route path='*' element={<Navigate to={routes.usersList} replace />} />
<Route path="*" element={<Navigate to={routes.usersList} replace />} />
</Routes>
);
}

View File

@ -1,10 +1,10 @@
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import App from './App';
import store from '~/driven/boundaries/state-management-boundary/store/store';
import ReactDOM from "react-dom/client";
import { Provider } from "react-redux";
import store from "~/driven/boundaries/state-management-boundary/store/store";
import App from "./App";
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
<Provider store={store}>
<App />
</Provider>,
</Provider>
);

View File

@ -1,13 +1,16 @@
import React from 'react'
import PageTitle from '~/driven/utils/components/page-title/pageTitle'
import { staticMessages } from '~/driven/utils/constants/staticMessages'
import CreateUser from '~/driving/application/core/create-user'
import React from "react";
import PageTitle from "~/driven/utils/components/page-title/pageTitle";
import { staticMessages } from "~/driven/utils/constants/staticMessages";
import CreateUser from "~/driving/application/core/create-user";
export default function CreateUserPage() {
return (
<>
<PageTitle className='px-4 py-5' title={staticMessages.global.createUser} />
<PageTitle
className="px-4 py-5"
title={staticMessages.global.createUser}
/>
<CreateUser />
</>
)
);
}

View File

@ -1,23 +1,28 @@
import React from 'react';
import PrimaryButton from '~/driven/utils/components/buttons/primary-button/PrimaryButton';
import PageTitle from '~/driven/utils/components/page-title/pageTitle';
import { staticMessages } from '~/driven/utils/constants/staticMessages';
import PlacesList from '~/driving/application/core/places-list';
import UsersList from '~/driving/application/core/users-list';
import Sidebar from '~/driving/application/support/sidebar';
import React from "react";
import PrimaryButton from "~/driven/utils/components/buttons/primary-button/PrimaryButton";
import PageTitle from "~/driven/utils/components/page-title/pageTitle";
import { staticMessages } from "~/driven/utils/constants/staticMessages";
import PlacesList from "~/driving/application/core/places-list";
import UsersList from "~/driving/application/core/users-list";
import Sidebar from "~/driving/application/support/sidebar";
export default function index() {
return (
<>
<PageTitle className='px-4 py-5' title={staticMessages.global.users} /><div className='container mx-auto px-4'>
<div className='w-full flex flex-row-reverse items-center py-2'>
<PrimaryButton className='text-sm' title={staticMessages.global.submit} onClick={() => { } } />
<PageTitle className="px-4 py-5" title={staticMessages.global.users} />
<div className="container mx-auto px-4">
<div className="w-full flex flex-row-reverse items-center py-2">
<PrimaryButton
className="text-sm"
title={staticMessages.global.submit}
onClick={() => {}}
/>
</div>
<div className="md:grid-cols-2 gap-x-4 grid grid-cols-1 mx-auto">
<UsersList />
<PlacesList />
</div>
</div>
<div className='md:grid-cols-2 gap-x-4 grid grid-cols-1 mx-auto'>
<UsersList />
<PlacesList />
</div>
</div>
</>
</>
);
}

View File

@ -1,14 +1,14 @@
import React from 'react'
import { Outlet } from 'react-router-dom'
import Sidebar from '~/driving/application/support/sidebar'
import React from "react";
import { Outlet } from "react-router-dom";
import Sidebar from "~/driving/application/support/sidebar";
export default function MainPageLayout() {
return (
<div className='flex flex-nowrap h-screen'>
<div className="flex flex-nowrap h-screen">
<Sidebar />
<main className='dipal-panel w-full text-black bg-white h-fit'>
<main className="dipal-panel w-full text-black bg-white h-fit">
<Outlet />
</main>
</main>
</div>
)
);
}

View File

@ -3,7 +3,8 @@
"target": "esnext",
"module": "esnext",
"types": [
"node"
"node",
"jest"
],
"useDefineForClassFields": true,
"lib": ["DOM", "DOM.Iterable", "ESNext"],

View File

@ -1,16 +1,32 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import {defineConfig, loadEnv} from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'~': path.resolve(__dirname, './src'),
export default defineConfig(({mode}) => {
const env = loadEnv(mode, process.cwd())
// expose .env as process.env instead of import.meta since jest does not import meta yet
const envWithProcessPrefix = Object.entries(env).reduce(
(prev, [key, val]) => {
return {
...prev,
[ key]: `${val}`,
}
},
},
server: {
host: true,
},
})
{},
)
return {
plugins: [react()],
resolve: {
alias: {
'~': path.resolve(__dirname, './src'),
},
},
server: {
host: true,
},
define: {'process.env': {...envWithProcessPrefix}}
}
});

363
yarn.lock
View File

@ -22,11 +22,23 @@
dependencies:
"@babel/highlight" "^7.18.6"
"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5":
"@babel/code-frame@^7.21.4":
version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39"
integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==
dependencies:
"@babel/highlight" "^7.18.6"
"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz"
integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==
"@babel/compat-data@^7.21.5":
version "7.21.7"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc"
integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==
"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.12":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz"
@ -58,6 +70,16 @@
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
"@babel/generator@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f"
integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==
dependencies:
"@babel/types" "^7.21.5"
"@jridgewell/gen-mapping" "^0.3.2"
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
"@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz"
@ -73,7 +95,7 @@
"@babel/helper-explode-assignable-expression" "^7.18.6"
"@babel/types" "^7.18.9"
"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7":
"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz"
integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==
@ -84,6 +106,17 @@
lru-cache "^5.1.1"
semver "^6.3.0"
"@babel/helper-compilation-targets@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366"
integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==
dependencies:
"@babel/compat-data" "^7.21.5"
"@babel/helper-validator-option" "^7.21.0"
browserslist "^4.21.3"
lru-cache "^5.1.1"
semver "^6.3.0"
"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz"
@ -123,6 +156,11 @@
resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz"
integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
"@babel/helper-environment-visitor@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba"
integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==
"@babel/helper-explode-assignable-expression@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz"
@ -159,7 +197,14 @@
dependencies:
"@babel/types" "^7.18.6"
"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2":
"@babel/helper-module-imports@^7.21.4":
version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af"
integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==
dependencies:
"@babel/types" "^7.21.4"
"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.0":
version "7.21.2"
resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz"
integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==
@ -173,6 +218,20 @@
"@babel/traverse" "^7.21.2"
"@babel/types" "^7.21.2"
"@babel/helper-module-transforms@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420"
integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==
dependencies:
"@babel/helper-environment-visitor" "^7.21.5"
"@babel/helper-module-imports" "^7.21.4"
"@babel/helper-simple-access" "^7.21.5"
"@babel/helper-split-export-declaration" "^7.18.6"
"@babel/helper-validator-identifier" "^7.19.1"
"@babel/template" "^7.20.7"
"@babel/traverse" "^7.21.5"
"@babel/types" "^7.21.5"
"@babel/helper-optimise-call-expression@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz"
@ -185,6 +244,11 @@
resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz"
integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==
"@babel/helper-plugin-utils@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56"
integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==
"@babel/helper-remap-async-to-generator@^7.18.9":
version "7.18.9"
resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz"
@ -214,6 +278,13 @@
dependencies:
"@babel/types" "^7.20.2"
"@babel/helper-simple-access@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee"
integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==
dependencies:
"@babel/types" "^7.21.5"
"@babel/helper-skip-transparent-expression-wrappers@^7.20.0":
version "7.20.0"
resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz"
@ -233,6 +304,11 @@
resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz"
integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
"@babel/helper-string-parser@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd"
integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==
"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
version "7.19.1"
resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz"
@ -276,6 +352,11 @@
resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz"
integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==
"@babel/parser@^7.21.5":
version "7.21.8"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8"
integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz"
@ -283,18 +364,18 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9":
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1"
integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/helper-skip-transparent-expression-wrappers" "^7.20.0"
"@babel/plugin-proposal-optional-chaining" "^7.20.7"
"@babel/plugin-proposal-async-generator-functions@^7.20.1":
"@babel/plugin-proposal-async-generator-functions@^7.20.7":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326"
integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==
dependencies:
"@babel/helper-environment-visitor" "^7.18.9"
@ -310,9 +391,9 @@
"@babel/helper-create-class-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-proposal-class-static-block@^7.18.6":
"@babel/plugin-proposal-class-static-block@^7.21.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d"
integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==
dependencies:
"@babel/helper-create-class-features-plugin" "^7.21.0"
@ -343,9 +424,9 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-json-strings" "^7.8.3"
"@babel/plugin-proposal-logical-assignment-operators@^7.18.9":
"@babel/plugin-proposal-logical-assignment-operators@^7.20.7":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83"
integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
@ -367,9 +448,9 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-proposal-object-rest-spread@^7.20.2":
"@babel/plugin-proposal-object-rest-spread@^7.20.7":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a"
integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==
dependencies:
"@babel/compat-data" "^7.20.5"
@ -386,7 +467,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7":
"@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz"
integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==
@ -403,9 +484,9 @@
"@babel/helper-create-class-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-proposal-private-property-in-object@^7.18.6":
"@babel/plugin-proposal-private-property-in-object@^7.21.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc"
integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==
dependencies:
"@babel/helper-annotate-as-pure" "^7.18.6"
@ -470,7 +551,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.19.0"
"@babel/plugin-syntax-import-meta@^7.8.3":
"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3":
version "7.10.4"
resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz"
integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
@ -491,6 +572,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-jsx@^7.21.4":
version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2"
integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
version "7.10.4"
resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz"
@ -554,16 +642,16 @@
dependencies:
"@babel/helper-plugin-utils" "^7.19.0"
"@babel/plugin-transform-arrow-functions@^7.18.6":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz"
integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==
"@babel/plugin-transform-arrow-functions@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929"
integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/plugin-transform-async-to-generator@^7.18.6":
"@babel/plugin-transform-async-to-generator@^7.20.7":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354"
integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==
dependencies:
"@babel/helper-module-imports" "^7.18.6"
@ -577,16 +665,16 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-block-scoping@^7.20.2":
"@babel/plugin-transform-block-scoping@^7.21.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02"
integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/plugin-transform-classes@^7.20.2":
"@babel/plugin-transform-classes@^7.21.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665"
integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==
dependencies:
"@babel/helper-annotate-as-pure" "^7.18.6"
@ -599,18 +687,18 @@
"@babel/helper-split-export-declaration" "^7.18.6"
globals "^11.1.0"
"@babel/plugin-transform-computed-properties@^7.18.9":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz"
integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==
"@babel/plugin-transform-computed-properties@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44"
integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/template" "^7.20.7"
"@babel/plugin-transform-destructuring@^7.20.2":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz"
integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==
"@babel/plugin-transform-destructuring@^7.21.3":
version "7.21.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401"
integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
@ -637,12 +725,12 @@
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-for-of@^7.18.8":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz"
integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==
"@babel/plugin-transform-for-of@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc"
integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/plugin-transform-function-name@^7.18.9":
version "7.18.9"
@ -667,26 +755,26 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-modules-amd@^7.19.6":
"@babel/plugin-transform-modules-amd@^7.20.11":
version "7.20.11"
resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a"
integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==
dependencies:
"@babel/helper-module-transforms" "^7.20.11"
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/plugin-transform-modules-commonjs@^7.19.6":
version "7.21.2"
resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz"
integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==
"@babel/plugin-transform-modules-commonjs@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc"
integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==
dependencies:
"@babel/helper-module-transforms" "^7.21.2"
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/helper-simple-access" "^7.20.2"
"@babel/helper-module-transforms" "^7.21.5"
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/helper-simple-access" "^7.21.5"
"@babel/plugin-transform-modules-systemjs@^7.19.6":
"@babel/plugin-transform-modules-systemjs@^7.20.11":
version "7.20.11"
resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e"
integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==
dependencies:
"@babel/helper-hoist-variables" "^7.18.6"
@ -702,9 +790,9 @@
"@babel/helper-module-transforms" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1":
"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5":
version "7.20.5"
resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8"
integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.20.5"
@ -725,13 +813,20 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/helper-replace-supers" "^7.18.6"
"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7":
"@babel/plugin-transform-parameters@^7.20.7":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz"
integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/plugin-transform-parameters@^7.21.3":
version "7.21.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db"
integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/plugin-transform-property-literals@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz"
@ -786,12 +881,12 @@
"@babel/helper-annotate-as-pure" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-regenerator@^7.18.6":
version "7.20.5"
resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz"
integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==
"@babel/plugin-transform-regenerator@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e"
integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/helper-plugin-utils" "^7.21.5"
regenerator-transform "^0.15.1"
"@babel/plugin-transform-reserved-words@^7.18.6":
@ -808,9 +903,9 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-transform-spread@^7.19.0":
"@babel/plugin-transform-spread@^7.20.7":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e"
integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
@ -837,21 +932,22 @@
dependencies:
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/plugin-transform-typescript@^7.21.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz"
integrity sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==
"@babel/plugin-transform-typescript@^7.21.3":
version "7.21.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz#316c5be579856ea890a57ebc5116c5d064658f2b"
integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==
dependencies:
"@babel/helper-annotate-as-pure" "^7.18.6"
"@babel/helper-create-class-features-plugin" "^7.21.0"
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/plugin-syntax-typescript" "^7.20.0"
"@babel/plugin-transform-unicode-escapes@^7.18.10":
version "7.18.10"
resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz"
integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==
"@babel/plugin-transform-unicode-escapes@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2"
integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==
dependencies:
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/plugin-transform-unicode-regex@^7.18.6":
version "7.18.6"
@ -861,31 +957,31 @@
"@babel/helper-create-regexp-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/preset-env@^7.20.2":
version "7.20.2"
resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz"
integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==
"@babel/preset-env@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.5.tgz#db2089d99efd2297716f018aeead815ac3decffb"
integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==
dependencies:
"@babel/compat-data" "^7.20.1"
"@babel/helper-compilation-targets" "^7.20.0"
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/helper-validator-option" "^7.18.6"
"@babel/compat-data" "^7.21.5"
"@babel/helper-compilation-targets" "^7.21.5"
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/helper-validator-option" "^7.21.0"
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6"
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9"
"@babel/plugin-proposal-async-generator-functions" "^7.20.1"
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7"
"@babel/plugin-proposal-async-generator-functions" "^7.20.7"
"@babel/plugin-proposal-class-properties" "^7.18.6"
"@babel/plugin-proposal-class-static-block" "^7.18.6"
"@babel/plugin-proposal-class-static-block" "^7.21.0"
"@babel/plugin-proposal-dynamic-import" "^7.18.6"
"@babel/plugin-proposal-export-namespace-from" "^7.18.9"
"@babel/plugin-proposal-json-strings" "^7.18.6"
"@babel/plugin-proposal-logical-assignment-operators" "^7.18.9"
"@babel/plugin-proposal-logical-assignment-operators" "^7.20.7"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
"@babel/plugin-proposal-numeric-separator" "^7.18.6"
"@babel/plugin-proposal-object-rest-spread" "^7.20.2"
"@babel/plugin-proposal-object-rest-spread" "^7.20.7"
"@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
"@babel/plugin-proposal-optional-chaining" "^7.18.9"
"@babel/plugin-proposal-optional-chaining" "^7.21.0"
"@babel/plugin-proposal-private-methods" "^7.18.6"
"@babel/plugin-proposal-private-property-in-object" "^7.18.6"
"@babel/plugin-proposal-private-property-in-object" "^7.21.0"
"@babel/plugin-proposal-unicode-property-regex" "^7.18.6"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-syntax-class-properties" "^7.12.13"
@ -893,6 +989,7 @@
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
"@babel/plugin-syntax-import-assertions" "^7.20.0"
"@babel/plugin-syntax-import-meta" "^7.10.4"
"@babel/plugin-syntax-json-strings" "^7.8.3"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
@ -902,40 +999,40 @@
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
"@babel/plugin-syntax-top-level-await" "^7.14.5"
"@babel/plugin-transform-arrow-functions" "^7.18.6"
"@babel/plugin-transform-async-to-generator" "^7.18.6"
"@babel/plugin-transform-arrow-functions" "^7.21.5"
"@babel/plugin-transform-async-to-generator" "^7.20.7"
"@babel/plugin-transform-block-scoped-functions" "^7.18.6"
"@babel/plugin-transform-block-scoping" "^7.20.2"
"@babel/plugin-transform-classes" "^7.20.2"
"@babel/plugin-transform-computed-properties" "^7.18.9"
"@babel/plugin-transform-destructuring" "^7.20.2"
"@babel/plugin-transform-block-scoping" "^7.21.0"
"@babel/plugin-transform-classes" "^7.21.0"
"@babel/plugin-transform-computed-properties" "^7.21.5"
"@babel/plugin-transform-destructuring" "^7.21.3"
"@babel/plugin-transform-dotall-regex" "^7.18.6"
"@babel/plugin-transform-duplicate-keys" "^7.18.9"
"@babel/plugin-transform-exponentiation-operator" "^7.18.6"
"@babel/plugin-transform-for-of" "^7.18.8"
"@babel/plugin-transform-for-of" "^7.21.5"
"@babel/plugin-transform-function-name" "^7.18.9"
"@babel/plugin-transform-literals" "^7.18.9"
"@babel/plugin-transform-member-expression-literals" "^7.18.6"
"@babel/plugin-transform-modules-amd" "^7.19.6"
"@babel/plugin-transform-modules-commonjs" "^7.19.6"
"@babel/plugin-transform-modules-systemjs" "^7.19.6"
"@babel/plugin-transform-modules-amd" "^7.20.11"
"@babel/plugin-transform-modules-commonjs" "^7.21.5"
"@babel/plugin-transform-modules-systemjs" "^7.20.11"
"@babel/plugin-transform-modules-umd" "^7.18.6"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5"
"@babel/plugin-transform-new-target" "^7.18.6"
"@babel/plugin-transform-object-super" "^7.18.6"
"@babel/plugin-transform-parameters" "^7.20.1"
"@babel/plugin-transform-parameters" "^7.21.3"
"@babel/plugin-transform-property-literals" "^7.18.6"
"@babel/plugin-transform-regenerator" "^7.18.6"
"@babel/plugin-transform-regenerator" "^7.21.5"
"@babel/plugin-transform-reserved-words" "^7.18.6"
"@babel/plugin-transform-shorthand-properties" "^7.18.6"
"@babel/plugin-transform-spread" "^7.19.0"
"@babel/plugin-transform-spread" "^7.20.7"
"@babel/plugin-transform-sticky-regex" "^7.18.6"
"@babel/plugin-transform-template-literals" "^7.18.9"
"@babel/plugin-transform-typeof-symbol" "^7.18.9"
"@babel/plugin-transform-unicode-escapes" "^7.18.10"
"@babel/plugin-transform-unicode-escapes" "^7.21.5"
"@babel/plugin-transform-unicode-regex" "^7.18.6"
"@babel/preset-modules" "^0.1.5"
"@babel/types" "^7.20.2"
"@babel/types" "^7.21.5"
babel-plugin-polyfill-corejs2 "^0.3.3"
babel-plugin-polyfill-corejs3 "^0.6.0"
babel-plugin-polyfill-regenerator "^0.4.1"
@ -955,7 +1052,7 @@
"@babel/preset-react@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz"
resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d"
integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
@ -965,14 +1062,16 @@
"@babel/plugin-transform-react-jsx-development" "^7.18.6"
"@babel/plugin-transform-react-pure-annotations" "^7.18.6"
"@babel/preset-typescript@^7.21.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz"
integrity sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==
"@babel/preset-typescript@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f"
integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==
dependencies:
"@babel/helper-plugin-utils" "^7.20.2"
"@babel/helper-plugin-utils" "^7.21.5"
"@babel/helper-validator-option" "^7.21.0"
"@babel/plugin-transform-typescript" "^7.21.0"
"@babel/plugin-syntax-jsx" "^7.21.4"
"@babel/plugin-transform-modules-commonjs" "^7.21.5"
"@babel/plugin-transform-typescript" "^7.21.3"
"@babel/regjsgen@^0.8.0":
version "0.8.0"
@ -1011,6 +1110,22 @@
debug "^4.1.0"
globals "^11.1.0"
"@babel/traverse@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133"
integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==
dependencies:
"@babel/code-frame" "^7.21.4"
"@babel/generator" "^7.21.5"
"@babel/helper-environment-visitor" "^7.21.5"
"@babel/helper-function-name" "^7.21.0"
"@babel/helper-hoist-variables" "^7.18.6"
"@babel/helper-split-export-declaration" "^7.18.6"
"@babel/parser" "^7.21.5"
"@babel/types" "^7.21.5"
debug "^4.1.0"
globals "^11.1.0"
"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
version "7.21.2"
resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz"
@ -1020,6 +1135,15 @@
"@babel/helper-validator-identifier" "^7.19.1"
to-fast-properties "^2.0.0"
"@babel/types@^7.21.4", "@babel/types@^7.21.5":
version "7.21.5"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6"
integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==
dependencies:
"@babel/helper-string-parser" "^7.21.5"
"@babel/helper-validator-identifier" "^7.19.1"
to-fast-properties "^2.0.0"
"@bcoe/v8-coverage@^0.2.3":
version "0.2.3"
resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz"
@ -1631,7 +1755,7 @@
dependencies:
"@types/istanbul-lib-report" "*"
"@types/jest@*", "@types/jest@^29.4.0":
"@types/jest@*":
version "29.4.0"
resolved "https://registry.npmjs.org/@types/jest/-/jest-29.4.0.tgz"
integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==
@ -1639,6 +1763,14 @@
expect "^29.0.0"
pretty-format "^29.0.0"
"@types/jest@^29.5.1":
version "29.5.1"
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.1.tgz#83c818aa9a87da27d6da85d3378e5a34d2f31a47"
integrity sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==
dependencies:
expect "^29.0.0"
pretty-format "^29.0.0"
"@types/jsdom@^20.0.0":
version "20.0.1"
resolved "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz"
@ -5244,6 +5376,13 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
swr@^2.1.5:
version "2.1.5"
resolved "https://registry.yarnpkg.com/swr/-/swr-2.1.5.tgz#688effa719c03f6d35c66decbb0f8e79c7190399"
integrity sha512-/OhfZMcEpuz77KavXST5q6XE9nrOBOVcBLWjMT+oAE/kQHyE3PASrevXCtQDZ8aamntOfFkbVJp7Il9tNBQWrw==
dependencies:
use-sync-external-store "^1.2.0"
symbol-tree@^3.2.4:
version "3.2.4"
resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz"
@ -5457,7 +5596,7 @@ url-parse@^1.5.3:
querystringify "^2.1.1"
requires-port "^1.0.0"
use-sync-external-store@^1.0.0:
use-sync-external-store@^1.0.0, use-sync-external-store@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz"
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==