diff --git a/.vscode/launch.json b/.vscode/launch.json index 24eae850..3ba4463d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,28 +1,25 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Debug FastAPI Project backend: Python Debugger", - "type": "debugpy", - "request": "launch", - "module": "uvicorn", - "args": [ - "app.main:app", - "--reload" - ], - "cwd": "${workspaceFolder}/backend", - "jinja": true, - "envFile": "${workspaceFolder}/.env", - }, - { - "type": "chrome", - "request": "launch", - "name": "Debug Frontend: Launch Chrome against http://localhost:5173", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}/frontend" - }, - ] + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Debug FastAPI Project backend: Python Debugger", + "type": "debugpy", + "request": "launch", + "module": "uvicorn", + "args": ["app.main:app", "--reload"], + "cwd": "${workspaceFolder}/backend", + "jinja": true, + "envFile": "${workspaceFolder}/.env" + }, + { + "type": "chrome", + "request": "launch", + "name": "Debug Frontend: Launch Chrome against http://localhost:5173", + "url": "http://localhost:5173", + "webRoot": "${workspaceFolder}/frontend" + } + ] } diff --git a/backend/app/api/main.py b/backend/app/api/main.py index c4de0e06..3ae1778d 100644 --- a/backend/app/api/main.py +++ b/backend/app/api/main.py @@ -1,6 +1,6 @@ from fastapi import APIRouter -from app.api.routes import items, login, users, utils, teams +from app.api.routes import items, login, members, teams, users, utils api_router = APIRouter() api_router.include_router(login.router, tags=["login"]) @@ -8,3 +8,6 @@ api_router.include_router(utils.router, prefix="/utils", tags=["utils"]) api_router.include_router(items.router, prefix="/items", tags=["items"]) api_router.include_router(teams.router, prefix="/teams", tags=["teams"]) +api_router.include_router( + members.router, prefix="/teams/{team_id}/members", tags=["members"] +) diff --git a/backend/app/api/routes/members.py b/backend/app/api/routes/members.py new file mode 100644 index 00000000..ee7f5061 --- /dev/null +++ b/backend/app/api/routes/members.py @@ -0,0 +1,205 @@ +from typing import Any + +from fastapi import APIRouter, Depends, HTTPException +from sqlmodel import func, select + +from app.api.deps import CurrentUser, SessionDep +from app.models import ( + Member, + MemberCreate, + MemberOut, + MembersOut, + MemberUpdate, + Message, + Team, +) + +router = APIRouter() + + +def validate_unique_name_in_team( + session: SessionDep, team_id: int, id: int, member_in: MemberCreate | MemberUpdate +): + """Check if (name, team_id) is unique""" + if member_in.name is None: + return + statement = select(Member).where( + Member.name == member_in.name, + Member.belongs_to == team_id, + Member.id != id, + ) + member_unique = session.exec(statement).first() + if member_unique: + raise HTTPException( + status_code=400, detail="Member with this name already exists" + ) + + +@router.get("/", response_model=MembersOut) +def read_members( + session: SessionDep, + current_user: CurrentUser, + team_id: int, + skip: int = 0, + limit: int = 100, +) -> Any: + """ + Retrieve members from team. + """ + # TODO: Use new way of getting members from teams. Get team first then use team.members + if current_user.is_superuser: + count_statement = select(func.count()).select_from(Member) + count = session.exec(count_statement).one() + statement = ( + select(Member).where(Member.belongs_to == team_id).offset(skip).limit(limit) + ) + members = session.exec(statement).all() + else: + count_statement = ( + select(func.count()) + .select_from(Member) + .join(Team) + .where(Team.owner_id == current_user.id, Member.belongs_to == team_id) + ) + count = session.exec(count_statement).one() + statement = ( + select(Member) + .join(Team) + .where(Team.owner_id == current_user.id, Member.belongs_to == team_id) + .offset(skip) + .limit(limit) + ) + members = session.exec(statement).all() + + return MembersOut(data=members, count=count) + + +@router.get("/{id}", response_model=MemberOut) +def read_member( + session: SessionDep, current_user: CurrentUser, team_id: int, id: int +) -> Any: + """ + Get member by ID. + """ + if current_user.is_superuser: + statement = ( + select(Member) + .join(Team) + .where(Member.id == id, Member.belongs_to == team_id) + ) + member = session.exec(statement).first() + else: + statement = ( + select(Member) + .join(Team) + .where( + Member.id == id, + Member.belongs_to == team_id, + Team.owner_id == current_user.id, + ) + ) + member = session.exec(statement).first() + + if not member: + raise HTTPException(status_code=404, detail="Member not found") + return member + + +@router.post("/", response_model=MemberOut) +def create_member( + *, + session: SessionDep, + current_user: CurrentUser, + team_id: int, + member_in: MemberCreate, + _: bool = Depends(validate_unique_name_in_team), +) -> Any: + """ + Create new member. + """ + if not current_user.is_superuser: + team = session.get(Team, team_id) + if team.owner_id != current_user.id: + raise HTTPException(status_code=400, detail="Not enough permissions") + member = Member.model_validate(member_in, update={"belongs_to": team_id}) + session.add(member) + session.commit() + session.refresh(member) + return member + + +@router.put("/{id}", response_model=MemberOut) +def update_member( + *, + session: SessionDep, + current_user: CurrentUser, + team_id: int, + id: int, + member_in: MemberUpdate, + _: bool = Depends(validate_unique_name_in_team), +) -> Any: + """ + Update a member. + """ + if current_user.is_superuser: + statement = ( + select(Member) + .join(Team) + .where(Member.id == id, Member.belongs_to == team_id) + ) + member = session.exec(statement).first() + else: + statement = ( + select(Member) + .join(Team) + .where( + Member.id == id, + Member.belongs_to == team_id, + Team.owner_id == current_user.id, + ) + ) + member = session.exec(statement).first() + + if not member: + raise HTTPException(status_code=404, detail="Member not found") + + update_dict = member_in.model_dump(exclude_unset=True) + member.sqlmodel_update(update_dict) + session.add(member) + session.commit() + session.refresh(member) + return member + + +@router.delete("/{id}") +def delete_member( + session: SessionDep, current_user: CurrentUser, team_id: int, id: int +) -> Message: + """ + Delete a member. + """ + if current_user.is_superuser: + statement = ( + select(Member) + .join(Team) + .where(Member.id == id, Member.belongs_to == team_id) + ) + member = session.exec(statement).first() + else: + statement = ( + select(Member) + .join(Team) + .where( + Member.id == id, + Member.belongs_to == team_id, + Team.owner_id == current_user.id, + ) + ) + member = session.exec(statement).first() + + if not member: + raise HTTPException(status_code=404, detail="Member not found") + + session.delete(member) + session.commit() + return Message(message="Member deleted successfully") diff --git a/backend/app/api/routes/teams.py b/backend/app/api/routes/teams.py index 22bdcb04..234cdc49 100644 --- a/backend/app/api/routes/teams.py +++ b/backend/app/api/routes/teams.py @@ -1,11 +1,21 @@ from typing import Any -from sqlmodel import func, select -from fastapi import APIRouter, HTTPException + +from fastapi import APIRouter, Depends, HTTPException from fastapi.responses import StreamingResponse +from sqlmodel import func, select -from app.core.graph.build import generator from app.api.deps import CurrentUser, SessionDep -from app.models import TeamChat, TeamsOut, TeamCreate, TeamOut, Team, Message +from app.core.graph.build import generator +from app.models import ( + Member, + Message, + Team, + TeamChat, + TeamCreate, + TeamOut, + TeamsOut, + TeamUpdate, +) # TODO: To remove teams = { @@ -17,16 +27,16 @@ "name": "ChineseFoodExpert", "backstory": "Studied culinary school in Singapore. Well-verse in hawker to fine-dining experiences. ISFP.", "role": "Provide chinese food suggestions in Singapore", - "tools": [] + "tools": [], }, "MalayFoodExpert": { "type": "worker", "name": "MalayFoodExpert", "backstory": "Studied culinary school in Singapore. Well-verse in hawker to fine-dining experiences. INTP.", "role": "Provide malay food suggestions in Singapore", - "tools": [] + "tools": [], }, - } + }, }, "TravelExpertLeader": { "name": "TravelKakis", @@ -35,22 +45,33 @@ "type": "leader", "name": "FoodExpertLeader", "role": "Gather inputs from your team and provide a diverse food suggestions in Singapore.", - "tools": [] + "tools": [], }, "HistoryExpert": { "type": "worker", "name": "HistoryExpert", "backstory": "Studied Singapore history. Well-verse in Singapore architecture. INTJ.", "role": "Provide places to sight-see with a history/architecture angle", - "tools": [] - } - } - } + "tools": [], + }, + }, + }, } team_leader = "TravelExpertLeader" router = APIRouter() + +async def validate_unique_name(session: SessionDep, team_in: TeamCreate | TeamUpdate): + """Validate that team name is unique""" + if team_in.name is None: + return + statement = select(Team).where(Team.name == team_in.name) + team = session.exec(statement).first() + if team: + raise HTTPException(status_code=400, detail="Team name already exists") + + @router.get("/", response_model=TeamsOut) def read_teams( session: SessionDep, current_user: CurrentUser, skip: int = 0, limit: int = 100 @@ -58,7 +79,7 @@ def read_teams( """ Retrieve teams """ - + if current_user.is_superuser: count_statement = select(func.count()).select_from(Team) count = session.exec(count_statement).one() @@ -80,6 +101,7 @@ def read_teams( teams = session.exec(statement).all() return TeamsOut(data=teams, count=count) + @router.get("/{id}", response_model=TeamOut) def read_team(session: SessionDep, current_user: CurrentUser, id: int) -> Any: """ @@ -92,22 +114,48 @@ def read_team(session: SessionDep, current_user: CurrentUser, id: int) -> Any: raise HTTPException(status_code=400, detail="Not enough permissions") return team + @router.post("/", response_model=TeamOut) def create_team( - *, session: SessionDep, current_user: CurrentUser, team_in: TeamCreate + *, + session: SessionDep, + current_user: CurrentUser, + team_in: TeamCreate, + _: bool = Depends(validate_unique_name), ) -> Any: """ - Create new team. + Create new team and it's team leader """ team = Team.model_validate(team_in, update={"owner_id": current_user.id}) session.add(team) session.commit() - session.refresh(team) + + # Create team leader + member = Member( + **{ + "name": "Team Leader", + "type": "root", + "role": "Gather inputs from your team and answer the question.", + "owner_of": team.id, + "position_x": 0, + "position_y": 0, + "belongs_to": team.id, + } + ) + session.add(member) + session.commit() + return team + @router.put("/{id}", response_model=TeamOut) def update_team( - *, session: SessionDep, current_user: CurrentUser, id: int, team_in: TeamCreate + *, + session: SessionDep, + current_user: CurrentUser, + id: int, + team_in: TeamUpdate, + _: bool = Depends(validate_unique_name), ) -> Any: """ Update a team. @@ -124,6 +172,7 @@ def update_team( session.refresh(team) return team + @router.delete("/{id}") def delete_team(session: SessionDep, current_user: CurrentUser, id: int) -> Any: """ @@ -138,8 +187,11 @@ def delete_team(session: SessionDep, current_user: CurrentUser, id: int) -> Any: session.commit() return Message(message="Team deleted successfully") + @router.post("/{id}/stream") -async def stream(session: SessionDep, current_user: CurrentUser, id: int, team_chat: TeamChat): +async def stream( + session: SessionDep, current_user: CurrentUser, id: int, team_chat: TeamChat +): """ Stream a response to a user's input. """ @@ -148,5 +200,7 @@ async def stream(session: SessionDep, current_user: CurrentUser, id: int, team_c raise HTTPException(status_code=404, detail="Team not found") if not current_user.is_superuser and (team.owner_id != current_user.id): raise HTTPException(status_code=400, detail="Not enough permissions") - - return StreamingResponse(generator(teams, team_leader, team_chat.messages), media_type="text/event-stream") \ No newline at end of file + return StreamingResponse( + generator(team, team.members, team_chat.messages), + media_type="text/event-stream", + ) diff --git a/backend/app/core/graph/build.py b/backend/app/core/graph/build.py index 2896396f..4e21a0c0 100644 --- a/backend/app/core/graph/build.py +++ b/backend/app/core/graph/build.py @@ -1,28 +1,108 @@ +import json +from collections import defaultdict, deque from functools import partial -from typing import Dict, List -from app.models import ChatMessage -from langgraph.graph import StateGraph, END -from langchain_openai import ChatOpenAI -from app.core.graph.members import Leader, LeaderNode, Member, SummariserNode, TeamState, WorkerNode -from langchain_core.messages import HumanMessage, AIMessage + +from langchain_core.messages import AIMessage, HumanMessage from langchain_core.runnables import RunnableLambda +from langchain_openai import ChatOpenAI +from langgraph.graph import StateGraph + +from app.core.graph.members import ( + Leader, + LeaderNode, + Member, + SummariserNode, + TeamState, + WorkerNode, +) +from app.models import ChatMessage, Team +from app.models import Member as MemberModel model = ChatOpenAI(model="gpt-3.5-turbo") + +def convert_team_to_dict(team: Team, members: list[MemberModel]): + """Convert team and members model to teams dict + + Args: + team (Team): Team Model + members (list[Member]): list of members model + + Raises: + ValueError: Root leader not found + + Returns: + dict: Dict containing the team and members + """ + + teams = {} + + in_counts = defaultdict(int) + out_counts = defaultdict(list[int]) + members_lookup: dict[int, MemberModel] = {} + + for member in members: + if member.source: + in_counts[member.id] += 1 + out_counts[member.source].append(member.id) + else: + in_counts[member.id] = 0 + members_lookup[member.id] = member + + queue = deque() + + for member_id in in_counts: + if in_counts[member_id] == 0: + queue.append(member_id) + + while queue: + member_id = queue.popleft() + member = members_lookup[member_id] + if member.type == "root" or member.type == "leader": + leader_name = member.name + # Create the team definitions + teams[leader_name] = { + "name": team.name, + "members": {}, + } + # If member is not root team leader, add as a member + if member.type != "root": + member_name = member.name + leader = members_lookup[member.source] + leader_name = leader.name + teams[leader_name]["members"][member_name] = { + "type": member.type, + "name": member_name, + "backstory": member.backstory or "", + "role": member.role, + "tools": [], + } + + for nei_id in out_counts[member_id]: + in_counts[nei_id] -= 1 + if in_counts[nei_id] == 0: + queue.append(nei_id) + + return teams + + # Create the Member/Leader class instance in members -def format_teams(teams: Dict[str, any]): - """Update the team members to use Member/Leader""" - for team in teams: - members = teams[team]["members"] - for k,v in members.items(): - print(v) - teams[team]["members"][k] = Leader(**v) if v["type"] == "leader" else Member(**v) - return teams +def format_teams(teams: dict[str, any]): + """Update the team members to use Member/Leader""" + for team in teams: + members = teams[team]["members"] + for k, v in members.items(): + teams[team]["members"][k] = ( + Leader(**v) if v["type"] == "leader" else Member(**v) + ) + return teams + def router(state: TeamState): return state["next"] -def enter_chain(state: TeamState, team: Dict[str, str | List[Member | Leader]]): + +def enter_chain(state: TeamState, team: dict[str, str | list[Member | Leader]]): """ Initialise the sub-graph state. This makes it so that the states of each graph don't get intermixed. @@ -38,63 +118,80 @@ def enter_chain(state: TeamState, team: Dict[str, str | List[Member | Leader]]): } return results + def exit_chain(state: TeamState): - """ - Pass the final response back to the top-level graph's state. - """ - answer = state["messages"][-1] - return {"messages": [answer]} - -def create_graph(teams: Dict[str, Dict[str, str | Dict[str, Member | Leader]]], leader_name: str): - """ - Create the team's graph. - """ - build = StateGraph(TeamState) - # Add the start and end node - build.add_node(leader_name, RunnableLambda(LeaderNode(model).delegate)) - build.add_node("summariser", RunnableLambda(SummariserNode(model).summarise)) - - members = teams[leader_name]["members"] - for name, member in members.items(): - if isinstance(member, Member): - build.add_node(name, RunnableLambda(WorkerNode(model).work)) - elif isinstance(member, Leader): - subgraph = create_graph(teams, leader_name=name) - enter = partial(enter_chain, team=teams[name]) - build.add_node(name, enter | subgraph | exit_chain) - else: - continue - build.add_edge(name, leader_name) - - conditional_mapping = {v:v for v in members} - conditional_mapping["FINISH"] = "summariser" - build.add_conditional_edges(leader_name, router, conditional_mapping) - - build.set_entry_point(leader_name) - build.set_finish_point("summariser") - graph = build.compile() - return graph - - - -async def generator(teams: dict, team_leader: str, messages: List[ChatMessage]): - """Create the graph and strem the response""" + """ + Pass the final response back to the top-level graph's state. + """ + answer = state["messages"][-1] + return {"messages": [answer]} + + +def create_graph( + teams: dict[str, dict[str, str | dict[str, Member | Leader]]], leader_name: str +): + """ + Create the team's graph. + """ + build = StateGraph(TeamState) + # Add the start and end node + build.add_node(leader_name, RunnableLambda(LeaderNode(model).delegate)) + build.add_node("summariser", RunnableLambda(SummariserNode(model).summarise)) + + members = teams[leader_name]["members"] + for name, member in members.items(): + if isinstance(member, Member): + build.add_node(name, RunnableLambda(WorkerNode(model).work)) + elif isinstance(member, Leader): + subgraph = create_graph(teams, leader_name=name) + enter = partial(enter_chain, team=teams[name]) + build.add_node(name, enter | subgraph | exit_chain) + else: + continue + build.add_edge(name, leader_name) + + conditional_mapping = {v: v for v in members} + conditional_mapping["FINISH"] = "summariser" + build.add_conditional_edges(leader_name, router, conditional_mapping) + + build.set_entry_point(leader_name) + build.set_finish_point("summariser") + graph = build.compile() + return graph + + +async def generator(team: Team, members: list[Member], messages: list[ChatMessage]): + """Create the graph and stream responses as JSON.""" + teams = convert_team_to_dict(team, members) + team_leader = list(teams.keys())[0] format_teams(teams) root = create_graph(teams, leader_name=team_leader) - messages = [HumanMessage(message.content) if message.type == "human" else AIMessage(message.content) for message in messages] - - async for output in root.astream({ - "messages": messages, - "team_name": teams[team_leader]["name"], - "team_members": teams[team_leader]["members"] - }): - for key, value in output.items(): - if key != "__end__": - response = {key :value} - formatted_output = f"data: {response}\n\n" - print(formatted_output) + messages = [ + HumanMessage(message.content) + if message.type == "human" + else AIMessage(message.content) + for message in messages + ] + + async for output in root.astream( + { + "messages": messages, + "team_name": teams[team_leader]["name"], + "team_members": teams[team_leader]["members"], + } + ): + if "__end__" not in output: + for _key, value in output.items(): + if "task" in value: + value["task"] = [message.dict() for message in value["task"]] + if "messages" in value: + value["messages"] = [ + message.dict() for message in value["messages"] + ] + formatted_output = f"data: {json.dumps(output)}\n\n" yield formatted_output + # teams = { # "FoodExpertLeader": { # "name": "FoodExperts", @@ -156,7 +253,7 @@ async def generator(teams: dict, team_leader: str, messages: List[ChatMessage]): # if "__end__" not in s: # print(s) # print("----") - + # import asyncio -# asyncio.run(main()) \ No newline at end of file +# asyncio.run(main()) diff --git a/backend/app/core/graph/members.py b/backend/app/core/graph/members.py index 9790110e..99b3e02b 100644 --- a/backend/app/core/graph/members.py +++ b/backend/app/core/graph/members.py @@ -1,202 +1,238 @@ -from typing import Annotated, Dict, List, TypedDict -from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +import operator +from typing import Annotated, TypedDict + +from langchain.agents import AgentExecutor, create_openai_functions_agent from langchain_core.messages import AIMessage, BaseMessage, HumanMessage +from langchain_core.output_parsers.openai_tools import JsonOutputKeyToolsParser +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables import RunnableLambda -from langchain.agents import create_openai_functions_agent, AgentExecutor from langchain_openai import ChatOpenAI -from app.core.graph.tools import all_tools -from langchain_core.output_parsers.openai_tools import JsonOutputKeyToolsParser from pydantic import BaseModel, Field -import operator + +from app.core.graph.tools import all_tools + class Person(BaseModel): - name: str = Field(description="The name of the person") - role: str = Field(description="Role of the person") - + name: str = Field(description="The name of the person") + role: str = Field(description="Role of the person") + + class Member(Person): - backstory: str = Field(description="Description of the person's experience, motives and concerns.") - tools: List[str] = Field(description="The list of tools that the person can use.") - @property - def persona(self) -> str: - return f"Name: {self.name}\nRole: {self.role}\nBackstory: {self.backstory}\n" + backstory: str = Field( + description="Description of the person's experience, motives and concerns." + ) + tools: list[str] = Field(description="The list of tools that the person can use.") + + @property + def persona(self) -> str: + return f"Name: {self.name}\nRole: {self.role}\nBackstory: {self.backstory}\n" + # Create a Leader class so we can pass leader as a team member for team within team class Leader(Person): - pass + pass + def update_name(name: str, new_name: str): - """Update name at the onset.""" - if not name: - return new_name - return name - -def update_members(members: Dict[str, Member | Leader] | None, new_members: Dict[str, Member | Leader]): - """Update members at the onset""" - if not members: - members = {} - members.update(new_members) - return members + """Update name at the onset.""" + if not name: + return new_name + return name + + +def update_members( + members: dict[str, Member | Leader] | None, new_members: dict[str, Member | Leader] +): + """Update members at the onset""" + if not members: + members = {} + members.update(new_members) + return members + class TeamState(TypedDict): - messages: Annotated[List[BaseMessage], operator.add] - team_name: Annotated[str, update_name] - team_members: Annotated[Dict[str, Member | Leader], update_members] - next: str - task: List[BaseMessage] # This is the current task to be perform by a team member. Its a list because Worker's MessagesPlaceholder only accepts list of messages. - + messages: Annotated[list[BaseMessage], operator.add] + team_name: Annotated[str, update_name] + team_members: Annotated[dict[str, Member | Leader], update_members] + next: str + task: list[ + BaseMessage + ] # This is the current task to be perform by a team member. Its a list because Worker's MessagesPlaceholder only accepts list of messages. + + class BaseNode: - def __init__(self, model: ChatOpenAI): - self.model = model - - def tag_with_name(self, ai_message: AIMessage, name: str): - """Tag a name to the AI message""" - ai_message.name = name - return ai_message - - - + def __init__(self, model: ChatOpenAI): + self.model = model + + def tag_with_name(self, ai_message: AIMessage, name: str): + """Tag a name to the AI message""" + ai_message.name = name + return ai_message + class WorkerNode(BaseNode): - worker_prompt = ChatPromptTemplate.from_messages( - [ - ( - "system", """You are a team member of {team_name} and you are one of the following team members: {team_members}. + worker_prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + """You are a team member of {team_name} and you are one of the following team members: {team_members}. Your team members (and other teams) will collaborate with you with their own set of skills. You are chosen by one of your team member to perform this task. Try your best to perform it using your skills. Stay true to your perspective: - {persona}""" - ), - MessagesPlaceholder(variable_name="task"), - MessagesPlaceholder(variable_name="agent_scratchpad"), - ] - ) - - def convert_output_to_ai_message(self, state: TeamState): - """Convert agent executor output to ai message""" - output = state["output"] - return AIMessage(content=output) - - def create_agent(self, llm: ChatOpenAI, prompt: ChatPromptTemplate, tools: List[str]): - """Create the agent executor""" - tools = [all_tools[tool] for tool in tools] - # Tools cannot be empty, add a placeholder - if len(tools) < 1: - tools = [all_tools["nothing"]] - agent = create_openai_functions_agent(llm, tools, prompt) - executor = AgentExecutor(agent=agent, tools=tools) - return executor - - async def work(self, state: TeamState): - name = state["next"] - member = state["team_members"][name] - tools = member.tools - prompt = self.worker_prompt.partial(persona=member.persona) - agent = self.create_agent(self.model, prompt, tools) - work_chain = ( - agent - | RunnableLambda(self.convert_output_to_ai_message) - | RunnableLambda(self.tag_with_name).bind(name=member.name) + {persona}""", + ), + MessagesPlaceholder(variable_name="task"), + MessagesPlaceholder(variable_name="agent_scratchpad"), + ] ) - result = await work_chain.ainvoke(state) - return {"messages": [result]} + + def convert_output_to_ai_message(self, state: TeamState): + """Convert agent executor output to ai message""" + output = state["output"] + return AIMessage(content=output) + + def create_agent( + self, llm: ChatOpenAI, prompt: ChatPromptTemplate, tools: list[str] + ): + """Create the agent executor""" + tools = [all_tools[tool] for tool in tools] + # Tools cannot be empty, add a placeholder + if len(tools) < 1: + tools = [all_tools["nothing"]] + agent = create_openai_functions_agent(llm, tools, prompt) + executor = AgentExecutor(agent=agent, tools=tools) + return executor + + async def work(self, state: TeamState): + name = state["next"] + member = state["team_members"][name] + tools = member.tools + prompt = self.worker_prompt.partial(persona=member.persona) + agent = self.create_agent(self.model, prompt, tools) + work_chain = ( + agent + | RunnableLambda(self.convert_output_to_ai_message) + | RunnableLambda(self.tag_with_name).bind(name=member.name) + ) + result = await work_chain.ainvoke(state) + return {"messages": [result]} class LeaderNode(BaseNode): - leader_prompt = ChatPromptTemplate.from_messages([ - ( - "system", """You are the team leader of {team_name} and you have the following team members: {team_members}. + leader_prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + """You are the team leader of {team_name} and you have the following team members: {team_members}. Your team is given a task and you have to delegate the work among your team members based on their skills. Team member info: - {team_members_info}""" - ), - MessagesPlaceholder(variable_name="messages"), - ( - "system", "Given the conversation above, who should act next? Or should we FINISH? Select one of: {options}." - ) - ]) - - def get_team_members_info(self, team_members: List[Member]): - """Create a string containing team members name and role.""" - result = "" - for member in team_members.values(): - result += f"name: {member.name}\nrole: {member.role}\n\n" - return result - - def get_tool_definition(self, options: List[str]): - """Return the tool definition to choose next team member and provide the task.""" - return { - "type": "function", - "function": { - "name": "route", - "description": "Select the next role.", - "parameters": { - "title": "routeSchema", - "type": "object", - "properties": { - "next": { - "title": "Next", - "anyOf": [ - {"enum": options}, - ], - }, - "task": { - "title": "task", - "description": "Provide the task to the team member." + {team_members_info}""", + ), + MessagesPlaceholder(variable_name="messages"), + ( + "system", + "Given the conversation above, who should act next? Or should we FINISH? Select one of: {options}.", + ), + ] + ) + + def get_team_members_info(self, team_members: list[Member]): + """Create a string containing team members name and role.""" + result = "" + for member in team_members.values(): + result += f"name: {member.name}\nrole: {member.role}\n\n" + return result + + def get_tool_definition(self, options: list[str]): + """Return the tool definition to choose next team member and provide the task.""" + return { + "type": "function", + "function": { + "name": "route", + "description": "Select the next role.", + "parameters": { + "title": "routeSchema", + "type": "object", + "properties": { + "next": { + "title": "Next", + "anyOf": [ + {"enum": options}, + ], + }, + "task": { + "title": "task", + "description": "Provide the task to the team member.", + }, + }, + "required": ["next", "task"], + }, }, - }, - "required": ["next", "task"], } - } - } - - async def delegate(self, state: TeamState): - team_members = ", ".join(state["team_members"]) - team_name = state["team_name"] - team_members_info = self.get_team_members_info(state["team_members"]) - options = list(state["team_members"]) + ["FINISH"] - - delegate_chain = ( - self.leader_prompt.partial(team_name=team_name, team_members=team_members, team_members_info=team_members_info, options=str(options)) - | self.model.bind_tools([self.get_tool_definition(options)]) - | JsonOutputKeyToolsParser(key_name="route", first_tool_only=True) - ) - result = await delegate_chain.ainvoke(state) - # Convert task from string to List[HumanMessage] because Worker's MessagesPlaceholder only accepts list of messages. - result["task"] = [HumanMessage(content=result.get("task", "None"), name=team_name)] - return result + + async def delegate(self, state: TeamState): + team_members = ", ".join(state["team_members"]) + team_name = state["team_name"] + team_members_info = self.get_team_members_info(state["team_members"]) + options = list(state["team_members"]) + ["FINISH"] + + delegate_chain = ( + self.leader_prompt.partial( + team_name=team_name, + team_members=team_members, + team_members_info=team_members_info, + options=str(options), + ) + | self.model.bind_tools([self.get_tool_definition(options)]) + | JsonOutputKeyToolsParser(key_name="route", first_tool_only=True) + ) + result = await delegate_chain.ainvoke(state) + # Convert task from string to list[HumanMessage] because Worker's MessagesPlaceholder only accepts list of messages. + result["task"] = [ + HumanMessage(content=result.get("task", "None"), name=team_name) + ] + return result class SummariserNode(BaseNode): - summariser_prompt = ChatPromptTemplate.from_messages([ - ( - "system", """You are a team member of {team_name} and you have the following team members: {team_members}. + summariser_prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + """You are a team member of {team_name} and you have the following team members: {team_members}. Your team was given a task and your team members have performed their roles and returned their responses to the team leader. Your role as a Summariser is to summarise the responses by your team members and give the final answer. Here is the team's task: {team_task} - + These are the responses from your team members: - {team_responses}""" - ) - ]) - - def get_team_responses(self, messages: List[BaseMessage]): - """Create a string containing the team's responses.""" - result = "" - for message in messages: - result += f"{message.name}: {message.content}\n" - return result - - async def summarise(self, state: TeamState): - team_members = ", ".join(state["team_members"]) - team_name = state["team_name"] - team_responses = self.get_team_responses(state["messages"]) - team_task = state["messages"][0].content - - summarise_chain = ( - self.summariser_prompt.partial(team_name=team_name, team_members=team_members, team_task=team_task, team_responses=team_responses) - | self.model - | RunnableLambda(self.tag_with_name).bind(name="summariser") + {team_responses}""", + ) + ] ) - result = await summarise_chain.ainvoke(state) - return {"messages": [result]} \ No newline at end of file + + def get_team_responses(self, messages: list[BaseMessage]): + """Create a string containing the team's responses.""" + result = "" + for message in messages: + result += f"{message.name}: {message.content}\n" + return result + + async def summarise(self, state: TeamState): + team_members = ", ".join(state["team_members"]) + team_name = state["team_name"] + team_responses = self.get_team_responses(state["messages"]) + team_task = state["messages"][0].content + + summarise_chain = ( + self.summariser_prompt.partial( + team_name=team_name, + team_members=team_members, + team_task=team_task, + team_responses=team_responses, + ) + | self.model + | RunnableLambda(self.tag_with_name).bind(name="summariser") + ) + result = await summarise_chain.ainvoke(state) + return {"messages": [result]} diff --git a/backend/app/core/graph/tools.py b/backend/app/core/graph/tools.py index be754314..f1ec4f1f 100644 --- a/backend/app/core/graph/tools.py +++ b/backend/app/core/graph/tools.py @@ -7,7 +7,8 @@ def nothing(query: str) -> str: """Placeholder Tool. Does nothing""" return "" + all_tools = { "nothing": nothing, # "search": DuckDuckGoSearchRun() -} \ No newline at end of file +} diff --git a/backend/app/models.py b/backend/app/models.py index bfa13604..d13085ef 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -1,8 +1,11 @@ from enum import Enum -from typing import List + from pydantic import BaseModel +from pydantic import Field as PydanticField +from sqlalchemy import UniqueConstraint from sqlmodel import Field, Relationship, SQLModel + class Message(SQLModel): message: str @@ -23,14 +26,9 @@ class NewPassword(SQLModel): new_password: str - - - - - - # ===============USER======================== + class UserBase(SQLModel): email: str = Field(unique=True, index=True) is_active: bool = True @@ -86,14 +84,9 @@ class UsersOut(SQLModel): count: int - - - - - - # ==============ITEM========================= + # Shared properties class ItemBase(SQLModel): title: str @@ -128,41 +121,46 @@ class ItemsOut(SQLModel): count: int - - - - - - # ==============TEAM========================= + class TeamBase(SQLModel): - name: str + name: str = PydanticField(pattern=r"^[a-zA-Z0-9_-]{1,64}$") description: str | None = None + class TeamCreate(TeamBase): - name: str + pass + class TeamUpdate(TeamBase): - name: str | None = None - + name: str | None = PydanticField(pattern=r"^[a-zA-Z0-9_-]{1,64}$", default=None) + + class ChatMessageType(str, Enum): human = "human" ai = "ai" + class ChatMessage(BaseModel): type: ChatMessageType content: str - + + class TeamChat(BaseModel): - messages: List[ChatMessage] + messages: list[ChatMessage] + class Team(TeamBase, table=True): id: int | None = Field(default=None, primary_key=True) + name: str = Field(regex=r"^[a-zA-Z0-9_-]{1,64}$", unique=True) owner_id: int | None = Field(default=None, foreign_key="user.id", nullable=False) owner: User | None = Relationship(back_populates="teams") - members: list["Member"] = Relationship(back_populates="belongs") - + members: list["Member"] = Relationship( + back_populates="belongs", sa_relationship_kwargs={"cascade": "delete"} + ) + + # Properties to return via API, id is always required class TeamOut(TeamBase): id: int @@ -174,40 +172,53 @@ class TeamsOut(SQLModel): count: int - - - - - - # ==============MEMBER========================= + class MemberSkillsLink(SQLModel, table=True): - member_id: int | None = Field(default=None, foreign_key="member.id", primary_key=True) + member_id: int | None = Field( + default=None, foreign_key="member.id", primary_key=True + ) skill_id: int | None = Field(default=None, foreign_key="skill.id", primary_key=True) + class MemberBase(SQLModel): - name: str + name: str = PydanticField(pattern=r"^[a-zA-Z0-9_-]{1,64}$") backstory: str | None = None role: str type: str - owner_of: int | None = int + owner_of: int | None = None + position_x: float + position_y: float + source: int | None = None + + class MemberCreate(MemberBase): - name: str + pass + class MemberUpdate(MemberBase): - name: str | None = None + name: str | None = PydanticField(pattern=r"^[a-zA-Z0-9_-]{1,64}$", default=None) backstory: str | None = None role: str | None = None type: str | None = None belongs_to: int | None = None - + position_x: float | None = None + position_y: float | None = None + + class Member(MemberBase, table=True): + __table_args__ = ( + UniqueConstraint("name", "belongs_to", name="unique_team_and_name"), + ) id: int | None = Field(default=None, primary_key=True) belongs_to: int | None = Field(default=None, foreign_key="team.id", nullable=False) belongs: Team | None = Relationship(back_populates="members") - skills: list["Skill"] = Relationship(back_populates="members", link_model=MemberSkillsLink) - + skills: list["Skill"] = Relationship( + back_populates="members", link_model=MemberSkillsLink + ) + + class MemberOut(MemberBase): id: int belongs_to: int @@ -219,25 +230,25 @@ class MembersOut(SQLModel): count: int - - - - - - # ===============SKILL======================== + class SkillBase(SQLModel): name: str description: str | None = None + class SkillCreate(SkillBase): name: str + class SkillUpdate(SkillBase): name: str | None = None description: str | None = None + class Skill(SkillBase, table=True): id: int | None = Field(default=None, primary_key=True) - members: list["Member"] = Relationship(back_populates="skills", link_model=MemberSkillsLink) \ No newline at end of file + members: list["Member"] = Relationship( + back_populates="skills", link_model=MemberSkillsLink + ) diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..4d49b98b --- /dev/null +++ b/biome.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.6.1/schema.json", + "organizeImports": { + "enabled": true + }, + "files": { + "ignore": ["node_modules", "src/client/"] + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "suspicious": { + "noExplicitAny": "off", + "noArrayIndexKey": "off" + }, + "style": { + "noNonNullAssertion": "off" + } + } + }, + "formatter": { + "indentStyle": "space" + }, + "javascript": { + "formatter": { + "quoteStyle": "double", + "semicolons": "asNeeded" + } + } +} diff --git a/frontend/.nvmrc b/frontend/.nvmrc index 8cbe1856..5802c69c 100644 --- a/frontend/.nvmrc +++ b/frontend/.nvmrc @@ -1 +1 @@ -18.x.x \ No newline at end of file +20.12.2 \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1a59e7c4..d453f25a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14,13 +14,16 @@ "@emotion/styled": "11.11.0", "@tanstack/react-router": "1.19.1", "axios": "1.6.2", + "chakra-react-select": "^4.7.6", "form-data": "4.0.0", "framer-motion": "10.16.16", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "7.49.3", "react-icons": "5.0.1", + "react-markdown": "^9.0.1", "react-query": "3.39.3", + "reactflow": "^11.11.1", "zustand": "4.5.0" }, "devDependencies": { @@ -2072,6 +2075,28 @@ "node": ">=12" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -2087,6 +2112,102 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@reactflow/background": { + "version": "11.3.11", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.11.tgz", + "integrity": "sha512-27ahQyHuX2YTc1lABvAPpd5JWBH5P3qTHLGOO+Qfqq4mbicwQ0UGQ2bVDWDwoHOyep2EuMuphrLttaMr0hiviw==", + "dependencies": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/controls": { + "version": "11.2.11", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.11.tgz", + "integrity": "sha512-FyqQv5pWEc2ycEGgIaLPmD5ezW3chsNwqMCjBMETxRj45R4uy6j+gDNi5EgURCan7T12uvoFeQopSZ96JL8XDQ==", + "dependencies": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/core": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.1.tgz", + "integrity": "sha512-O9f/q9SZ+29am/XdoZgm/LTdkgQdypcVj9a1yZZgcS6rVDkij1yIiOT3nkGxwnNkJz0rwCn2xtL5SkK038AQ7w==", + "dependencies": { + "@types/d3": "^7.4.0", + "@types/d3-drag": "^3.0.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/minimap": { + "version": "11.7.11", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.11.tgz", + "integrity": "sha512-zXxv+IExvWuaZ+gmRIfmU09A+slG9rMKTVfjqd+ewFV4LFcCyMNMIx3gZybdLZtgUDKIOoU/hAWIY+FbU7GTKw==", + "dependencies": { + "@reactflow/core": "11.11.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-resizer": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.11.tgz", + "integrity": "sha512-g/5iLo5vPBoFozU+2WXub+mbpNkQhR+PRX9o0YvH/lYs1pS7JYFSzCOHdHpLHAImoCGrKY1XN5scYly36jWkDw==", + "dependencies": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.4", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-toolbar": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.11.tgz", + "integrity": "sha512-PKcTrtC88WZjNQz4ACnPgbNDBprsLJVDxyV1x8drGMNRePPrErkUNxsbhrr49L8ffmIavd4kxW5XVNOx8Kswmw==", + "dependencies": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.1.tgz", @@ -2552,6 +2673,262 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz", + "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2571,6 +2948,19 @@ "@types/lodash": "*" } }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { "version": "20.10.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", @@ -2588,14 +2978,12 @@ "node_modules/@types/prop-types": { "version": "15.7.11", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "devOptional": true + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { "version": "18.2.39", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.39.tgz", "integrity": "sha512-Oiw+ppED6IremMInLV4HXGbfbG6GyziY3kqAwJYOR0PNbkYDmLWQA3a95EhdSmamsvbkJN96ZNN+YD+fGjzSBA==", - "devOptional": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2611,11 +2999,28 @@ "@types/react": "*" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "devOptional": true + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.5.0", @@ -2693,6 +3098,15 @@ "npm": ">=6" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2756,6 +3170,76 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chakra-react-select": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/chakra-react-select/-/chakra-react-select-4.7.6.tgz", + "integrity": "sha512-ZL43hyXPnWf1g/HjsZDecbeJ4F2Q6tTPYJozlKWkrQ7lIX7ORP0aZYwmc5/Wly4UNzMimj2Vuosl6MmIXH+G2g==", + "dependencies": { + "react-select": "5.7.7" + }, + "peerDependencies": { + "@chakra-ui/form-control": "^2.0.0", + "@chakra-ui/icon": "^3.0.0", + "@chakra-ui/layout": "^2.0.0", + "@chakra-ui/media-query": "^3.0.0", + "@chakra-ui/menu": "^2.0.0", + "@chakra-ui/spinner": "^2.0.0", + "@chakra-ui/system": "^2.0.0", + "@emotion/react": "^11.8.1", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" + }, "node_modules/clsx": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", @@ -2781,6 +3265,15 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", @@ -2841,6 +3334,102 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -2857,6 +3446,34 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2865,6 +3482,14 @@ "node": ">=0.4.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -2875,6 +3500,27 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2931,6 +3577,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -3145,7 +3805,45 @@ "node": ">= 0.4" } }, - "node_modules/hoist-non-react-statics": { + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", @@ -3153,6 +3851,15 @@ "react-is": "^16.7.0" } }, + "node_modules/html-url-attributes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", + "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -3182,6 +3889,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -3190,6 +3902,28 @@ "loose-envify": "^1.0.0" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3206,6 +3940,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -3268,6 +4031,15 @@ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -3288,6 +4060,577 @@ "remove-accents": "0.5.0" } }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/microseconds": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", @@ -3332,6 +4675,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/nano-time": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", @@ -3412,6 +4760,30 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -3509,6 +4881,15 @@ "react-is": "^16.13.1" } }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -3604,6 +4985,31 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-markdown": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", + "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, "node_modules/react-query": { "version": "3.39.3", "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", @@ -3674,6 +5080,26 @@ } } }, + "node_modules/react-select": { + "version": "5.7.7", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.7.tgz", + "integrity": "sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-style-singleton": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", @@ -3696,11 +5122,74 @@ } } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/reactflow": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.1.tgz", + "integrity": "sha512-2GEh0bTkYR7rzAV3qdeN6C1o4qumtETZl7yQv1GVrfgr3c77nCUAOKsv5hetRejOGNnJudRwn6axeWFAY+IjNg==", + "dependencies": { + "@reactflow/background": "11.3.11", + "@reactflow/controls": "11.2.11", + "@reactflow/core": "11.11.1", + "@reactflow/minimap": "11.7.11", + "@reactflow/node-resizer": "2.2.11", + "@reactflow/node-toolbar": "1.3.11" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remove-accents": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", @@ -3798,6 +5287,36 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -3837,6 +5356,24 @@ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -3874,6 +5411,100 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -3912,6 +5543,19 @@ } } }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sidecar": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", @@ -3941,6 +5585,33 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { "version": "5.0.12", "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", @@ -4050,6 +5721,15 @@ "optional": true } } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } }, "dependencies": { @@ -5463,6 +7143,28 @@ "dev": true, "optional": true }, + "@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "requires": { + "@floating-ui/utils": "^0.2.1" + } + }, + "@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "requires": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, "@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -5474,6 +7176,78 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" }, + "@reactflow/background": { + "version": "11.3.11", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.11.tgz", + "integrity": "sha512-27ahQyHuX2YTc1lABvAPpd5JWBH5P3qTHLGOO+Qfqq4mbicwQ0UGQ2bVDWDwoHOyep2EuMuphrLttaMr0hiviw==", + "requires": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + } + }, + "@reactflow/controls": { + "version": "11.2.11", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.11.tgz", + "integrity": "sha512-FyqQv5pWEc2ycEGgIaLPmD5ezW3chsNwqMCjBMETxRj45R4uy6j+gDNi5EgURCan7T12uvoFeQopSZ96JL8XDQ==", + "requires": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + } + }, + "@reactflow/core": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.1.tgz", + "integrity": "sha512-O9f/q9SZ+29am/XdoZgm/LTdkgQdypcVj9a1yZZgcS6rVDkij1yIiOT3nkGxwnNkJz0rwCn2xtL5SkK038AQ7w==", + "requires": { + "@types/d3": "^7.4.0", + "@types/d3-drag": "^3.0.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.4.1" + } + }, + "@reactflow/minimap": { + "version": "11.7.11", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.11.tgz", + "integrity": "sha512-zXxv+IExvWuaZ+gmRIfmU09A+slG9rMKTVfjqd+ewFV4LFcCyMNMIx3gZybdLZtgUDKIOoU/hAWIY+FbU7GTKw==", + "requires": { + "@reactflow/core": "11.11.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.4.1" + } + }, + "@reactflow/node-resizer": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.11.tgz", + "integrity": "sha512-g/5iLo5vPBoFozU+2WXub+mbpNkQhR+PRX9o0YvH/lYs1pS7JYFSzCOHdHpLHAImoCGrKY1XN5scYly36jWkDw==", + "requires": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.4", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "zustand": "^4.4.1" + } + }, + "@reactflow/node-toolbar": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.11.tgz", + "integrity": "sha512-PKcTrtC88WZjNQz4ACnPgbNDBprsLJVDxyV1x8drGMNRePPrErkUNxsbhrr49L8ffmIavd4kxW5XVNOx8Kswmw==", + "requires": { + "@reactflow/core": "11.11.1", + "classcat": "^5.0.3", + "zustand": "^4.4.1" + } + }, "@rollup/rollup-android-arm-eabi": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.1.tgz", @@ -5713,6 +7487,262 @@ "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.1.3.tgz", "integrity": "sha512-GnolmC8Fr4mvsHE1fGQmR3Nm0eBO3KnZjDU0a+P3TeQNM/dDscFGxtA7p31NplQNW3KwBw4t1RVFmz0VeKLxcw==" }, + "@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "requires": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" + }, + "@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "requires": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" + }, + "@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==" + }, + "@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" + }, + "@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "requires": { + "@types/d3-dsv": "*" + } + }, + "@types/d3-force": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz", + "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==" + }, + "@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" + }, + "@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "requires": { + "@types/geojson": "*" + } + }, + "@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==" + }, + "@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "requires": { + "@types/d3-color": "*" + } + }, + "@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + }, + "@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" + }, + "@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" + }, + "@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" + }, + "@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "requires": { + "@types/d3-time": "*" + } + }, + "@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + }, + "@types/d3-selection": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + }, + "@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" + }, + "@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "@types/d3-transition": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "requires": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "requires": { + "@types/ms": "*" + } + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "requires": { + "@types/estree": "*" + } + }, + "@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "requires": { + "@types/unist": "*" + } + }, "@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -5732,6 +7762,19 @@ "@types/lodash": "*" } }, + "@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "requires": { + "@types/unist": "*" + } + }, + "@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "@types/node": { "version": "20.10.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", @@ -5749,14 +7792,12 @@ "@types/prop-types": { "version": "15.7.11", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "devOptional": true + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "@types/react": { "version": "18.2.39", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.39.tgz", "integrity": "sha512-Oiw+ppED6IremMInLV4HXGbfbG6GyziY3kqAwJYOR0PNbkYDmLWQA3a95EhdSmamsvbkJN96ZNN+YD+fGjzSBA==", - "devOptional": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5772,11 +7813,28 @@ "@types/react": "*" } }, + "@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "requires": { + "@types/react": "*" + } + }, "@types/scheduler": { "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "devOptional": true + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "@vitejs/plugin-react-swc": { "version": "3.5.0", @@ -5844,6 +7902,11 @@ "resolve": "^1.19.0" } }, + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5895,6 +7958,44 @@ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" + }, + "chakra-react-select": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/chakra-react-select/-/chakra-react-select-4.7.6.tgz", + "integrity": "sha512-ZL43hyXPnWf1g/HjsZDecbeJ4F2Q6tTPYJozlKWkrQ7lIX7ORP0aZYwmc5/Wly4UNzMimj2Vuosl6MmIXH+G2g==", + "requires": { + "react-select": "5.7.7" + } + }, + "character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" + }, + "character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" + }, + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" + }, + "character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==" + }, + "classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" + }, "clsx": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", @@ -5914,6 +8015,11 @@ "delayed-stream": "~1.0.0" } }, + "comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" + }, "commander": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", @@ -5968,6 +8074,72 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" + }, + "d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" + }, + "d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + } + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + }, + "d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "requires": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, "date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -5977,11 +8149,32 @@ "@babel/runtime": "^7.21.0" } }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "requires": { + "character-entities": "^2.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + }, "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -5992,6 +8185,23 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "requires": { + "dequal": "^2.0.0" + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -6035,6 +8245,16 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, + "estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -6184,6 +8404,36 @@ "function-bind": "^1.1.2" } }, + "hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "requires": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + } + }, + "hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "requires": { + "@types/hast": "^3.0.0" + } + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -6192,6 +8442,11 @@ "react-is": "^16.7.0" } }, + "html-url-attributes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", + "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==" + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -6215,6 +8470,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -6223,6 +8483,20 @@ "loose-envify": "^1.0.0" } }, + "is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==" + }, + "is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "requires": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -6236,6 +8510,21 @@ "hasown": "^2.0.0" } }, + "is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==" + }, + "is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==" + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + }, "js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -6289,6 +8578,11 @@ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" }, + "longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6306,6 +8600,335 @@ "remove-accents": "0.5.0" } }, + "mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "requires": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + } + }, + "mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + } + }, + "mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + } + }, + "mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + } + }, + "mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "requires": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + } + }, + "mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "requires": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "requires": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "requires": { + "@types/mdast": "^4.0.0" + } + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "requires": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "requires": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "requires": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "requires": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "requires": { + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "requires": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "requires": { + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==" + }, + "micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==" + }, + "micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "requires": { + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "requires": { + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "requires": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + }, + "micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==" + }, "microseconds": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", @@ -6338,6 +8961,11 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "nano-time": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", @@ -6397,6 +9025,28 @@ "callsites": "^3.0.0" } }, + "parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "requires": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "dependencies": { + "@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + } + } + }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -6456,6 +9106,11 @@ "react-is": "^16.13.1" } }, + "property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==" + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -6521,6 +9176,23 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-markdown": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", + "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "requires": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + } + }, "react-query": { "version": "3.39.3", "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", @@ -6552,6 +9224,22 @@ "tslib": "^2.0.0" } }, + "react-select": { + "version": "5.7.7", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.7.tgz", + "integrity": "sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + } + }, "react-style-singleton": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", @@ -6562,11 +9250,58 @@ "tslib": "^2.0.0" } }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "reactflow": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.1.tgz", + "integrity": "sha512-2GEh0bTkYR7rzAV3qdeN6C1o4qumtETZl7yQv1GVrfgr3c77nCUAOKsv5hetRejOGNnJudRwn6axeWFAY+IjNg==", + "requires": { + "@reactflow/background": "11.3.11", + "@reactflow/controls": "11.2.11", + "@reactflow/core": "11.11.1", + "@reactflow/minimap": "11.7.11", + "@reactflow/node-resizer": "2.2.11", + "@reactflow/node-toolbar": "1.3.11" + } + }, "regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + } + }, + "remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "requires": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + } + }, "remove-accents": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", @@ -6636,6 +9371,28 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, + "space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" + }, + "stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "requires": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + } + }, + "style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "requires": { + "inline-style-parser": "0.2.3" + } + }, "stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -6666,6 +9423,16 @@ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, + "trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" + }, + "trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" + }, "tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -6690,6 +9457,72 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "requires": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + } + }, + "unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "requires": { + "@types/unist": "^3.0.0" + } + }, + "unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "requires": { + "@types/unist": "^3.0.0" + } + }, + "unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + } + }, + "unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "requires": { + "@types/unist": "^3.0.0" + } + }, + "unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + } + }, + "unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + } + }, "universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -6713,6 +9546,12 @@ "tslib": "^2.0.0" } }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} + }, "use-sidecar": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", @@ -6728,6 +9567,25 @@ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", "requires": {} }, + "vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + } + }, + "vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "requires": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + } + }, "vite": { "version": "5.0.12", "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", @@ -6769,6 +9627,11 @@ "requires": { "use-sync-external-store": "1.2.0" } + }, + "zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" } } } diff --git a/frontend/package.json b/frontend/package.json index a1ac410a..b1feb8ad 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -17,13 +17,16 @@ "@emotion/styled": "11.11.0", "@tanstack/react-router": "1.19.1", "axios": "1.6.2", + "chakra-react-select": "^4.7.6", "form-data": "4.0.0", "framer-motion": "10.16.16", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "7.49.3", "react-icons": "5.0.1", + "react-markdown": "^9.0.1", "react-query": "3.39.3", + "reactflow": "^11.11.1", "zustand": "4.5.0" }, "devDependencies": { diff --git a/frontend/src/client/index.ts b/frontend/src/client/index.ts index fb94ef69..2eaf2bd2 100644 --- a/frontend/src/client/index.ts +++ b/frontend/src/client/index.ts @@ -8,13 +8,24 @@ export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; export type { Body_login_login_access_token } from './models/Body_login_login_access_token'; +export type { ChatMessage } from './models/ChatMessage'; +export type { ChatMessageType } from './models/ChatMessageType'; export type { HTTPValidationError } from './models/HTTPValidationError'; export type { ItemCreate } from './models/ItemCreate'; export type { ItemOut } from './models/ItemOut'; export type { ItemsOut } from './models/ItemsOut'; export type { ItemUpdate } from './models/ItemUpdate'; +export type { MemberCreate } from './models/MemberCreate'; +export type { MemberOut } from './models/MemberOut'; +export type { MembersOut } from './models/MembersOut'; +export type { MemberUpdate } from './models/MemberUpdate'; export type { Message } from './models/Message'; export type { NewPassword } from './models/NewPassword'; +export type { TeamChat } from './models/TeamChat'; +export type { TeamCreate } from './models/TeamCreate'; +export type { TeamOut } from './models/TeamOut'; +export type { TeamsOut } from './models/TeamsOut'; +export type { TeamUpdate } from './models/TeamUpdate'; export type { Token } from './models/Token'; export type { UpdatePassword } from './models/UpdatePassword'; export type { UserCreate } from './models/UserCreate'; @@ -26,13 +37,24 @@ export type { UserUpdateMe } from './models/UserUpdateMe'; export type { ValidationError } from './models/ValidationError'; export { $Body_login_login_access_token } from './schemas/$Body_login_login_access_token'; +export { $ChatMessage } from './schemas/$ChatMessage'; +export { $ChatMessageType } from './schemas/$ChatMessageType'; export { $HTTPValidationError } from './schemas/$HTTPValidationError'; export { $ItemCreate } from './schemas/$ItemCreate'; export { $ItemOut } from './schemas/$ItemOut'; export { $ItemsOut } from './schemas/$ItemsOut'; export { $ItemUpdate } from './schemas/$ItemUpdate'; +export { $MemberCreate } from './schemas/$MemberCreate'; +export { $MemberOut } from './schemas/$MemberOut'; +export { $MembersOut } from './schemas/$MembersOut'; +export { $MemberUpdate } from './schemas/$MemberUpdate'; export { $Message } from './schemas/$Message'; export { $NewPassword } from './schemas/$NewPassword'; +export { $TeamChat } from './schemas/$TeamChat'; +export { $TeamCreate } from './schemas/$TeamCreate'; +export { $TeamOut } from './schemas/$TeamOut'; +export { $TeamsOut } from './schemas/$TeamsOut'; +export { $TeamUpdate } from './schemas/$TeamUpdate'; export { $Token } from './schemas/$Token'; export { $UpdatePassword } from './schemas/$UpdatePassword'; export { $UserCreate } from './schemas/$UserCreate'; @@ -45,5 +67,7 @@ export { $ValidationError } from './schemas/$ValidationError'; export { ItemsService } from './services/ItemsService'; export { LoginService } from './services/LoginService'; +export { MembersService } from './services/MembersService'; +export { TeamsService } from './services/TeamsService'; export { UsersService } from './services/UsersService'; export { UtilsService } from './services/UtilsService'; diff --git a/frontend/src/client/models/Body_login_login_access_token.ts b/frontend/src/client/models/Body_login_login_access_token.ts index 7798e611..b1bec7ba 100644 --- a/frontend/src/client/models/Body_login_login_access_token.ts +++ b/frontend/src/client/models/Body_login_login_access_token.ts @@ -11,3 +11,4 @@ export type Body_login_login_access_token = { client_id?: (string | null); client_secret?: (string | null); }; + diff --git a/frontend/src/client/models/ChatMessage.ts b/frontend/src/client/models/ChatMessage.ts new file mode 100644 index 00000000..49c0ed8d --- /dev/null +++ b/frontend/src/client/models/ChatMessage.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ChatMessageType } from './ChatMessageType'; + +export type ChatMessage = { + type: ChatMessageType; + content: string; +}; + diff --git a/frontend/src/client/models/ChatMessageType.ts b/frontend/src/client/models/ChatMessageType.ts new file mode 100644 index 00000000..23fdf1e8 --- /dev/null +++ b/frontend/src/client/models/ChatMessageType.ts @@ -0,0 +1,6 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ChatMessageType = 'human' | 'ai'; diff --git a/frontend/src/client/models/HTTPValidationError.ts b/frontend/src/client/models/HTTPValidationError.ts index e218a9f3..c0bcc87c 100644 --- a/frontend/src/client/models/HTTPValidationError.ts +++ b/frontend/src/client/models/HTTPValidationError.ts @@ -8,3 +8,4 @@ import type { ValidationError } from './ValidationError'; export type HTTPValidationError = { detail?: Array; }; + diff --git a/frontend/src/client/models/ItemCreate.ts b/frontend/src/client/models/ItemCreate.ts index aeefb6dd..50e8e4dd 100644 --- a/frontend/src/client/models/ItemCreate.ts +++ b/frontend/src/client/models/ItemCreate.ts @@ -7,3 +7,4 @@ export type ItemCreate = { title: string; description?: (string | null); }; + diff --git a/frontend/src/client/models/ItemOut.ts b/frontend/src/client/models/ItemOut.ts index cbe6c02c..1ae52896 100644 --- a/frontend/src/client/models/ItemOut.ts +++ b/frontend/src/client/models/ItemOut.ts @@ -9,3 +9,4 @@ export type ItemOut = { id: number; owner_id: number; }; + diff --git a/frontend/src/client/models/ItemUpdate.ts b/frontend/src/client/models/ItemUpdate.ts index 89ccb4e0..7062eea6 100644 --- a/frontend/src/client/models/ItemUpdate.ts +++ b/frontend/src/client/models/ItemUpdate.ts @@ -7,3 +7,4 @@ export type ItemUpdate = { title?: (string | null); description?: (string | null); }; + diff --git a/frontend/src/client/models/ItemsOut.ts b/frontend/src/client/models/ItemsOut.ts index e45794bf..4b4a988a 100644 --- a/frontend/src/client/models/ItemsOut.ts +++ b/frontend/src/client/models/ItemsOut.ts @@ -9,3 +9,4 @@ export type ItemsOut = { data: Array; count: number; }; + diff --git a/frontend/src/client/models/MemberCreate.ts b/frontend/src/client/models/MemberCreate.ts new file mode 100644 index 00000000..2b49def1 --- /dev/null +++ b/frontend/src/client/models/MemberCreate.ts @@ -0,0 +1,16 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type MemberCreate = { + name: string; + backstory?: (string | null); + role: string; + type: string; + owner_of?: (number | null); + position_x: number; + position_y: number; + source?: (number | null); +}; + diff --git a/frontend/src/client/models/MemberOut.ts b/frontend/src/client/models/MemberOut.ts new file mode 100644 index 00000000..260f0a27 --- /dev/null +++ b/frontend/src/client/models/MemberOut.ts @@ -0,0 +1,18 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type MemberOut = { + name: string; + backstory?: (string | null); + role: string; + type: string; + owner_of: (number | null); + position_x: number; + position_y: number; + source?: (number | null); + id: number; + belongs_to: number; +}; + diff --git a/frontend/src/client/models/MemberUpdate.ts b/frontend/src/client/models/MemberUpdate.ts new file mode 100644 index 00000000..069d056e --- /dev/null +++ b/frontend/src/client/models/MemberUpdate.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type MemberUpdate = { + name?: (string | null); + backstory?: (string | null); + role?: (string | null); + type?: (string | null); + owner_of?: (number | null); + position_x?: (number | null); + position_y?: (number | null); + source?: (number | null); + belongs_to?: (number | null); +}; + diff --git a/frontend/src/client/models/MembersOut.ts b/frontend/src/client/models/MembersOut.ts new file mode 100644 index 00000000..4f472953 --- /dev/null +++ b/frontend/src/client/models/MembersOut.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { MemberOut } from './MemberOut'; + +export type MembersOut = { + data: Array; + count: number; +}; + diff --git a/frontend/src/client/models/Message.ts b/frontend/src/client/models/Message.ts index 6220861f..5e05da75 100644 --- a/frontend/src/client/models/Message.ts +++ b/frontend/src/client/models/Message.ts @@ -6,3 +6,4 @@ export type Message = { message: string; }; + diff --git a/frontend/src/client/models/NewPassword.ts b/frontend/src/client/models/NewPassword.ts index 9d5512b3..ee5c1368 100644 --- a/frontend/src/client/models/NewPassword.ts +++ b/frontend/src/client/models/NewPassword.ts @@ -7,3 +7,4 @@ export type NewPassword = { token: string; new_password: string; }; + diff --git a/frontend/src/client/models/TeamChat.ts b/frontend/src/client/models/TeamChat.ts new file mode 100644 index 00000000..f0f6dc66 --- /dev/null +++ b/frontend/src/client/models/TeamChat.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ChatMessage } from './ChatMessage'; + +export type TeamChat = { + messages: Array; +}; + diff --git a/frontend/src/client/models/TeamCreate.ts b/frontend/src/client/models/TeamCreate.ts new file mode 100644 index 00000000..14f6eb3d --- /dev/null +++ b/frontend/src/client/models/TeamCreate.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type TeamCreate = { + name: string; + description?: (string | null); +}; + diff --git a/frontend/src/client/models/TeamOut.ts b/frontend/src/client/models/TeamOut.ts new file mode 100644 index 00000000..289b0933 --- /dev/null +++ b/frontend/src/client/models/TeamOut.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type TeamOut = { + name: string; + description?: (string | null); + id: number; + owner_id: number; +}; + diff --git a/frontend/src/client/models/TeamUpdate.ts b/frontend/src/client/models/TeamUpdate.ts new file mode 100644 index 00000000..f28a7a71 --- /dev/null +++ b/frontend/src/client/models/TeamUpdate.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type TeamUpdate = { + name?: (string | null); + description?: (string | null); +}; + diff --git a/frontend/src/client/models/TeamsOut.ts b/frontend/src/client/models/TeamsOut.ts new file mode 100644 index 00000000..39674daa --- /dev/null +++ b/frontend/src/client/models/TeamsOut.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { TeamOut } from './TeamOut'; + +export type TeamsOut = { + data: Array; + count: number; +}; + diff --git a/frontend/src/client/models/Token.ts b/frontend/src/client/models/Token.ts index ea3120bf..29b10b07 100644 --- a/frontend/src/client/models/Token.ts +++ b/frontend/src/client/models/Token.ts @@ -7,3 +7,4 @@ export type Token = { access_token: string; token_type?: string; }; + diff --git a/frontend/src/client/models/UpdatePassword.ts b/frontend/src/client/models/UpdatePassword.ts index f0c4b694..9e53ca06 100644 --- a/frontend/src/client/models/UpdatePassword.ts +++ b/frontend/src/client/models/UpdatePassword.ts @@ -7,3 +7,4 @@ export type UpdatePassword = { current_password: string; new_password: string; }; + diff --git a/frontend/src/client/models/UserCreate.ts b/frontend/src/client/models/UserCreate.ts index f49d0bff..c14aef68 100644 --- a/frontend/src/client/models/UserCreate.ts +++ b/frontend/src/client/models/UserCreate.ts @@ -10,3 +10,4 @@ export type UserCreate = { full_name?: (string | null); password: string; }; + diff --git a/frontend/src/client/models/UserCreateOpen.ts b/frontend/src/client/models/UserCreateOpen.ts index f859e9b1..b2ef96b0 100644 --- a/frontend/src/client/models/UserCreateOpen.ts +++ b/frontend/src/client/models/UserCreateOpen.ts @@ -8,3 +8,4 @@ export type UserCreateOpen = { password: string; full_name?: (string | null); }; + diff --git a/frontend/src/client/models/UserOut.ts b/frontend/src/client/models/UserOut.ts index 8387dc6d..59a00e44 100644 --- a/frontend/src/client/models/UserOut.ts +++ b/frontend/src/client/models/UserOut.ts @@ -10,3 +10,4 @@ export type UserOut = { full_name?: (string | null); id: number; }; + diff --git a/frontend/src/client/models/UserUpdate.ts b/frontend/src/client/models/UserUpdate.ts index 9ba346a4..08171163 100644 --- a/frontend/src/client/models/UserUpdate.ts +++ b/frontend/src/client/models/UserUpdate.ts @@ -10,3 +10,4 @@ export type UserUpdate = { full_name?: (string | null); password?: (string | null); }; + diff --git a/frontend/src/client/models/UserUpdateMe.ts b/frontend/src/client/models/UserUpdateMe.ts index aa7a2fbb..6c1f85ea 100644 --- a/frontend/src/client/models/UserUpdateMe.ts +++ b/frontend/src/client/models/UserUpdateMe.ts @@ -7,3 +7,4 @@ export type UserUpdateMe = { full_name?: (string | null); email?: (string | null); }; + diff --git a/frontend/src/client/models/UsersOut.ts b/frontend/src/client/models/UsersOut.ts index 0e317ab4..ba51b5e4 100644 --- a/frontend/src/client/models/UsersOut.ts +++ b/frontend/src/client/models/UsersOut.ts @@ -9,3 +9,4 @@ export type UsersOut = { data: Array; count: number; }; + diff --git a/frontend/src/client/models/ValidationError.ts b/frontend/src/client/models/ValidationError.ts index 0a3e90e9..18997ec7 100644 --- a/frontend/src/client/models/ValidationError.ts +++ b/frontend/src/client/models/ValidationError.ts @@ -8,3 +8,4 @@ export type ValidationError = { msg: string; type: string; }; + diff --git a/frontend/src/client/schemas/$Body_login_login_access_token.ts b/frontend/src/client/schemas/$Body_login_login_access_token.ts index 5d701cc4..f545b710 100644 --- a/frontend/src/client/schemas/$Body_login_login_access_token.ts +++ b/frontend/src/client/schemas/$Body_login_login_access_token.ts @@ -5,40 +5,40 @@ export const $Body_login_login_access_token = { properties: { grant_type: { - type: 'any-of', - contains: [{ - type: 'string', - pattern: 'password', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + pattern: 'password', + }, { + type: 'null', + }], + }, username: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, password: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, scope: { - type: 'string', -}, + type: 'string', + }, client_id: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, client_secret: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, }, } as const; diff --git a/frontend/src/client/schemas/$ChatMessage.ts b/frontend/src/client/schemas/$ChatMessage.ts new file mode 100644 index 00000000..a97c8fc2 --- /dev/null +++ b/frontend/src/client/schemas/$ChatMessage.ts @@ -0,0 +1,16 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ChatMessage = { + properties: { + type: { + type: 'ChatMessageType', + isRequired: true, + }, + content: { + type: 'string', + isRequired: true, + }, + }, +} as const; diff --git a/frontend/src/client/schemas/$ChatMessageType.ts b/frontend/src/client/schemas/$ChatMessageType.ts new file mode 100644 index 00000000..f2d02e46 --- /dev/null +++ b/frontend/src/client/schemas/$ChatMessageType.ts @@ -0,0 +1,7 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $ChatMessageType = { + type: 'Enum', +} as const; diff --git a/frontend/src/client/schemas/$HTTPValidationError.ts b/frontend/src/client/schemas/$HTTPValidationError.ts index 4206c7c4..f8eb5c82 100644 --- a/frontend/src/client/schemas/$HTTPValidationError.ts +++ b/frontend/src/client/schemas/$HTTPValidationError.ts @@ -5,10 +5,10 @@ export const $HTTPValidationError = { properties: { detail: { - type: 'array', - contains: { - type: 'ValidationError', - }, -}, + type: 'array', + contains: { + type: 'ValidationError', + }, + }, }, } as const; diff --git a/frontend/src/client/schemas/$ItemCreate.ts b/frontend/src/client/schemas/$ItemCreate.ts index 70037eeb..de80a67a 100644 --- a/frontend/src/client/schemas/$ItemCreate.ts +++ b/frontend/src/client/schemas/$ItemCreate.ts @@ -5,16 +5,16 @@ export const $ItemCreate = { properties: { title: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, description: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, }, } as const; diff --git a/frontend/src/client/schemas/$ItemOut.ts b/frontend/src/client/schemas/$ItemOut.ts index 015a5181..7a20bca1 100644 --- a/frontend/src/client/schemas/$ItemOut.ts +++ b/frontend/src/client/schemas/$ItemOut.ts @@ -5,24 +5,24 @@ export const $ItemOut = { properties: { title: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, description: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, id: { - type: 'number', - isRequired: true, -}, + type: 'number', + isRequired: true, + }, owner_id: { - type: 'number', - isRequired: true, -}, + type: 'number', + isRequired: true, + }, }, } as const; diff --git a/frontend/src/client/schemas/$ItemUpdate.ts b/frontend/src/client/schemas/$ItemUpdate.ts index bf76d61a..a7b52c53 100644 --- a/frontend/src/client/schemas/$ItemUpdate.ts +++ b/frontend/src/client/schemas/$ItemUpdate.ts @@ -5,20 +5,20 @@ export const $ItemUpdate = { properties: { title: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, description: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, }, } as const; diff --git a/frontend/src/client/schemas/$ItemsOut.ts b/frontend/src/client/schemas/$ItemsOut.ts index 782b68d3..cb053281 100644 --- a/frontend/src/client/schemas/$ItemsOut.ts +++ b/frontend/src/client/schemas/$ItemsOut.ts @@ -5,15 +5,15 @@ export const $ItemsOut = { properties: { data: { - type: 'array', - contains: { - type: 'ItemOut', - }, - isRequired: true, -}, + type: 'array', + contains: { + type: 'ItemOut', + }, + isRequired: true, + }, count: { - type: 'number', - isRequired: true, -}, + type: 'number', + isRequired: true, + }, }, } as const; diff --git a/frontend/src/client/schemas/$MemberCreate.ts b/frontend/src/client/schemas/$MemberCreate.ts new file mode 100644 index 00000000..525a9a2b --- /dev/null +++ b/frontend/src/client/schemas/$MemberCreate.ts @@ -0,0 +1,52 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $MemberCreate = { + properties: { + name: { + type: 'string', + isRequired: true, + }, + backstory: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, + role: { + type: 'string', + isRequired: true, + }, + type: { + type: 'string', + isRequired: true, + }, + owner_of: { + type: 'any-of', + contains: [{ + type: 'number', + }, { + type: 'null', + }], + }, + position_x: { + type: 'number', + isRequired: true, + }, + position_y: { + type: 'number', + isRequired: true, + }, + source: { + type: 'any-of', + contains: [{ + type: 'number', + }, { + type: 'null', + }], + }, + }, +} as const; diff --git a/frontend/src/client/schemas/$MemberOut.ts b/frontend/src/client/schemas/$MemberOut.ts new file mode 100644 index 00000000..236fa7d7 --- /dev/null +++ b/frontend/src/client/schemas/$MemberOut.ts @@ -0,0 +1,61 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $MemberOut = { + properties: { + name: { + type: 'string', + isRequired: true, + }, + backstory: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, + role: { + type: 'string', + isRequired: true, + }, + type: { + type: 'string', + isRequired: true, + }, + owner_of: { + type: 'any-of', + contains: [{ + type: 'number', + }, { + type: 'null', + }], + isRequired: true, + }, + position_x: { + type: 'number', + isRequired: true, + }, + position_y: { + type: 'number', + isRequired: true, + }, + source: { + type: 'any-of', + contains: [{ + type: 'number', + }, { + type: 'null', + }], + }, + id: { + type: 'number', + isRequired: true, + }, + belongs_to: { + type: 'number', + isRequired: true, + }, + }, +} as const; diff --git a/frontend/src/client/schemas/$MemberUpdate.ts b/frontend/src/client/schemas/$MemberUpdate.ts new file mode 100644 index 00000000..912f311d --- /dev/null +++ b/frontend/src/client/schemas/$MemberUpdate.ts @@ -0,0 +1,80 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $MemberUpdate = { + properties: { + name: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, + backstory: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, + role: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, + type: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, + owner_of: { + type: 'any-of', + contains: [{ + type: 'number', + }, { + type: 'null', + }], + }, + position_x: { + type: 'any-of', + contains: [{ + type: 'number', + }, { + type: 'null', + }], + }, + position_y: { + type: 'any-of', + contains: [{ + type: 'number', + }, { + type: 'null', + }], + }, + source: { + type: 'any-of', + contains: [{ + type: 'number', + }, { + type: 'null', + }], + }, + belongs_to: { + type: 'any-of', + contains: [{ + type: 'number', + }, { + type: 'null', + }], + }, + }, +} as const; diff --git a/frontend/src/client/schemas/$MembersOut.ts b/frontend/src/client/schemas/$MembersOut.ts new file mode 100644 index 00000000..488077fe --- /dev/null +++ b/frontend/src/client/schemas/$MembersOut.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $MembersOut = { + properties: { + data: { + type: 'array', + contains: { + type: 'MemberOut', + }, + isRequired: true, + }, + count: { + type: 'number', + isRequired: true, + }, + }, +} as const; diff --git a/frontend/src/client/schemas/$Message.ts b/frontend/src/client/schemas/$Message.ts index d2abdc13..5d514529 100644 --- a/frontend/src/client/schemas/$Message.ts +++ b/frontend/src/client/schemas/$Message.ts @@ -5,8 +5,8 @@ export const $Message = { properties: { message: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, }, } as const; diff --git a/frontend/src/client/schemas/$NewPassword.ts b/frontend/src/client/schemas/$NewPassword.ts index f6b19e2d..49599381 100644 --- a/frontend/src/client/schemas/$NewPassword.ts +++ b/frontend/src/client/schemas/$NewPassword.ts @@ -5,12 +5,12 @@ export const $NewPassword = { properties: { token: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, new_password: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, }, } as const; diff --git a/frontend/src/client/schemas/$TeamChat.ts b/frontend/src/client/schemas/$TeamChat.ts new file mode 100644 index 00000000..b177c5cf --- /dev/null +++ b/frontend/src/client/schemas/$TeamChat.ts @@ -0,0 +1,15 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $TeamChat = { + properties: { + messages: { + type: 'array', + contains: { + type: 'ChatMessage', + }, + isRequired: true, + }, + }, +} as const; diff --git a/frontend/src/client/schemas/$TeamCreate.ts b/frontend/src/client/schemas/$TeamCreate.ts new file mode 100644 index 00000000..944de0e6 --- /dev/null +++ b/frontend/src/client/schemas/$TeamCreate.ts @@ -0,0 +1,20 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $TeamCreate = { + properties: { + name: { + type: 'string', + isRequired: true, + }, + description: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, + }, +} as const; diff --git a/frontend/src/client/schemas/$TeamOut.ts b/frontend/src/client/schemas/$TeamOut.ts new file mode 100644 index 00000000..f12568cd --- /dev/null +++ b/frontend/src/client/schemas/$TeamOut.ts @@ -0,0 +1,28 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $TeamOut = { + properties: { + name: { + type: 'string', + isRequired: true, + }, + description: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, + id: { + type: 'number', + isRequired: true, + }, + owner_id: { + type: 'number', + isRequired: true, + }, + }, +} as const; diff --git a/frontend/src/client/schemas/$TeamUpdate.ts b/frontend/src/client/schemas/$TeamUpdate.ts new file mode 100644 index 00000000..52857980 --- /dev/null +++ b/frontend/src/client/schemas/$TeamUpdate.ts @@ -0,0 +1,24 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $TeamUpdate = { + properties: { + name: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, + description: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, + }, +} as const; diff --git a/frontend/src/client/schemas/$TeamsOut.ts b/frontend/src/client/schemas/$TeamsOut.ts new file mode 100644 index 00000000..dc51f271 --- /dev/null +++ b/frontend/src/client/schemas/$TeamsOut.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export const $TeamsOut = { + properties: { + data: { + type: 'array', + contains: { + type: 'TeamOut', + }, + isRequired: true, + }, + count: { + type: 'number', + isRequired: true, + }, + }, +} as const; diff --git a/frontend/src/client/schemas/$Token.ts b/frontend/src/client/schemas/$Token.ts index 88946bc6..d05d203f 100644 --- a/frontend/src/client/schemas/$Token.ts +++ b/frontend/src/client/schemas/$Token.ts @@ -5,11 +5,11 @@ export const $Token = { properties: { access_token: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, token_type: { - type: 'string', -}, + type: 'string', + }, }, } as const; diff --git a/frontend/src/client/schemas/$UpdatePassword.ts b/frontend/src/client/schemas/$UpdatePassword.ts index 18758819..35828f74 100644 --- a/frontend/src/client/schemas/$UpdatePassword.ts +++ b/frontend/src/client/schemas/$UpdatePassword.ts @@ -5,12 +5,12 @@ export const $UpdatePassword = { properties: { current_password: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, new_password: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, }, } as const; diff --git a/frontend/src/client/schemas/$UserCreate.ts b/frontend/src/client/schemas/$UserCreate.ts index 84503be3..8251ec91 100644 --- a/frontend/src/client/schemas/$UserCreate.ts +++ b/frontend/src/client/schemas/$UserCreate.ts @@ -5,26 +5,26 @@ export const $UserCreate = { properties: { email: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, is_active: { - type: 'boolean', -}, + type: 'boolean', + }, is_superuser: { - type: 'boolean', -}, + type: 'boolean', + }, full_name: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, password: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, }, } as const; diff --git a/frontend/src/client/schemas/$UserCreateOpen.ts b/frontend/src/client/schemas/$UserCreateOpen.ts index ae2fff5b..3e5e20db 100644 --- a/frontend/src/client/schemas/$UserCreateOpen.ts +++ b/frontend/src/client/schemas/$UserCreateOpen.ts @@ -5,20 +5,20 @@ export const $UserCreateOpen = { properties: { email: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, password: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, full_name: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, }, } as const; diff --git a/frontend/src/client/schemas/$UserOut.ts b/frontend/src/client/schemas/$UserOut.ts index 82614024..a4f00534 100644 --- a/frontend/src/client/schemas/$UserOut.ts +++ b/frontend/src/client/schemas/$UserOut.ts @@ -5,26 +5,26 @@ export const $UserOut = { properties: { email: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, is_active: { - type: 'boolean', -}, + type: 'boolean', + }, is_superuser: { - type: 'boolean', -}, + type: 'boolean', + }, full_name: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, id: { - type: 'number', - isRequired: true, -}, + type: 'number', + isRequired: true, + }, }, } as const; diff --git a/frontend/src/client/schemas/$UserUpdate.ts b/frontend/src/client/schemas/$UserUpdate.ts index 396e6173..a87f79ee 100644 --- a/frontend/src/client/schemas/$UserUpdate.ts +++ b/frontend/src/client/schemas/$UserUpdate.ts @@ -5,34 +5,34 @@ export const $UserUpdate = { properties: { email: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, is_active: { - type: 'boolean', -}, + type: 'boolean', + }, is_superuser: { - type: 'boolean', -}, + type: 'boolean', + }, full_name: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, password: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, }, } as const; diff --git a/frontend/src/client/schemas/$UserUpdateMe.ts b/frontend/src/client/schemas/$UserUpdateMe.ts index ed9c0112..ad5ef55d 100644 --- a/frontend/src/client/schemas/$UserUpdateMe.ts +++ b/frontend/src/client/schemas/$UserUpdateMe.ts @@ -5,20 +5,20 @@ export const $UserUpdateMe = { properties: { full_name: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, email: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'null', -}], -}, + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'null', + }], + }, }, } as const; diff --git a/frontend/src/client/schemas/$UsersOut.ts b/frontend/src/client/schemas/$UsersOut.ts index 9c228688..4aa6617f 100644 --- a/frontend/src/client/schemas/$UsersOut.ts +++ b/frontend/src/client/schemas/$UsersOut.ts @@ -5,15 +5,15 @@ export const $UsersOut = { properties: { data: { - type: 'array', - contains: { - type: 'UserOut', - }, - isRequired: true, -}, + type: 'array', + contains: { + type: 'UserOut', + }, + isRequired: true, + }, count: { - type: 'number', - isRequired: true, -}, + type: 'number', + isRequired: true, + }, }, } as const; diff --git a/frontend/src/client/schemas/$ValidationError.ts b/frontend/src/client/schemas/$ValidationError.ts index b040db7c..3a48f2ab 100644 --- a/frontend/src/client/schemas/$ValidationError.ts +++ b/frontend/src/client/schemas/$ValidationError.ts @@ -5,24 +5,24 @@ export const $ValidationError = { properties: { loc: { - type: 'array', - contains: { - type: 'any-of', - contains: [{ - type: 'string', -}, { - type: 'number', -}], -}, - isRequired: true, -}, + type: 'array', + contains: { + type: 'any-of', + contains: [{ + type: 'string', + }, { + type: 'number', + }], + }, + isRequired: true, + }, msg: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, type: { - type: 'string', - isRequired: true, -}, + type: 'string', + isRequired: true, + }, }, } as const; diff --git a/frontend/src/client/services/ItemsService.ts b/frontend/src/client/services/ItemsService.ts index b68a28ac..331581e3 100644 --- a/frontend/src/client/services/ItemsService.ts +++ b/frontend/src/client/services/ItemsService.ts @@ -21,12 +21,12 @@ export class ItemsService { * @throws ApiError */ public static readItems({ -skip, -limit = 100, -}: { -skip?: number, -limit?: number, -}): CancelablePromise { + skip, + limit = 100, + }: { + skip?: number, + limit?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/api/v1/items/', @@ -47,10 +47,10 @@ limit?: number, * @throws ApiError */ public static createItem({ -requestBody, -}: { -requestBody: ItemCreate, -}): CancelablePromise { + requestBody, + }: { + requestBody: ItemCreate, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/api/v1/items/', @@ -69,10 +69,10 @@ requestBody: ItemCreate, * @throws ApiError */ public static readItem({ -id, -}: { -id: number, -}): CancelablePromise { + id, + }: { + id: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/api/v1/items/{id}', @@ -92,12 +92,12 @@ id: number, * @throws ApiError */ public static updateItem({ -id, -requestBody, -}: { -id: number, -requestBody: ItemUpdate, -}): CancelablePromise { + id, + requestBody, + }: { + id: number, + requestBody: ItemUpdate, + }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', url: '/api/v1/items/{id}', @@ -119,10 +119,10 @@ requestBody: ItemUpdate, * @throws ApiError */ public static deleteItem({ -id, -}: { -id: number, -}): CancelablePromise { + id, + }: { + id: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', url: '/api/v1/items/{id}', diff --git a/frontend/src/client/services/LoginService.ts b/frontend/src/client/services/LoginService.ts index e40899d3..e7679cab 100644 --- a/frontend/src/client/services/LoginService.ts +++ b/frontend/src/client/services/LoginService.ts @@ -21,10 +21,10 @@ export class LoginService { * @throws ApiError */ public static loginAccessToken({ -formData, -}: { -formData: Body_login_login_access_token, -}): CancelablePromise { + formData, + }: { + formData: Body_login_login_access_token, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/api/v1/login/access-token', @@ -56,10 +56,10 @@ formData: Body_login_login_access_token, * @throws ApiError */ public static recoverPassword({ -email, -}: { -email: string, -}): CancelablePromise { + email, + }: { + email: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/api/v1/password-recovery/{email}', @@ -79,10 +79,10 @@ email: string, * @throws ApiError */ public static resetPassword({ -requestBody, -}: { -requestBody: NewPassword, -}): CancelablePromise { + requestBody, + }: { + requestBody: NewPassword, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/api/v1/reset-password/', @@ -94,4 +94,27 @@ requestBody: NewPassword, }); } + /** + * Recover Password Html Content + * HTML Content for Password Recovery + * @returns string Successful Response + * @throws ApiError + */ + public static recoverPasswordHtmlContent({ + email, + }: { + email: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v1/password-recovery-html-content/{email}', + path: { + 'email': email, + }, + errors: { + 422: `Validation Error`, + }, + }); + } + } diff --git a/frontend/src/client/services/MembersService.ts b/frontend/src/client/services/MembersService.ts new file mode 100644 index 00000000..c8394efb --- /dev/null +++ b/frontend/src/client/services/MembersService.ts @@ -0,0 +1,157 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { MemberCreate } from '../models/MemberCreate'; +import type { MemberOut } from '../models/MemberOut'; +import type { MembersOut } from '../models/MembersOut'; +import type { MemberUpdate } from '../models/MemberUpdate'; +import type { Message } from '../models/Message'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class MembersService { + + /** + * Read Members + * Retrieve members from team. + * @returns MembersOut Successful Response + * @throws ApiError + */ + public static readMembers({ + teamId, + skip, + limit = 100, + }: { + teamId: number, + skip?: number, + limit?: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v1/teams/{team_id}/members/', + path: { + 'team_id': teamId, + }, + query: { + 'skip': skip, + 'limit': limit, + }, + errors: { + 422: `Validation Error`, + }, + }); + } + + /** + * Create Member + * Create new member. + * @returns MemberOut Successful Response + * @throws ApiError + */ + public static createMember({ + teamId, + requestBody, + }: { + teamId: number, + requestBody: MemberCreate, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v1/teams/{team_id}/members/', + path: { + 'team_id': teamId, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } + + /** + * Read Member + * Get member by ID. + * @returns MemberOut Successful Response + * @throws ApiError + */ + public static readMember({ + teamId, + id, + }: { + teamId: number, + id: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v1/teams/{team_id}/members/{id}', + path: { + 'team_id': teamId, + 'id': id, + }, + errors: { + 422: `Validation Error`, + }, + }); + } + + /** + * Update Member + * Update a member. + * @returns MemberOut Successful Response + * @throws ApiError + */ + public static updateMember({ + teamId, + id, + requestBody, + }: { + teamId: number, + id: number, + requestBody: MemberUpdate, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v1/teams/{team_id}/members/{id}', + path: { + 'team_id': teamId, + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } + + /** + * Delete Member + * Delete a member. + * @returns Message Successful Response + * @throws ApiError + */ + public static deleteMember({ + teamId, + id, + }: { + teamId: number, + id: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/api/v1/teams/{team_id}/members/{id}', + path: { + 'team_id': teamId, + 'id': id, + }, + errors: { + 422: `Validation Error`, + }, + }); + } + +} diff --git a/frontend/src/client/services/TeamsService.ts b/frontend/src/client/services/TeamsService.ts new file mode 100644 index 00000000..b3a6f349 --- /dev/null +++ b/frontend/src/client/services/TeamsService.ts @@ -0,0 +1,165 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { TeamChat } from '../models/TeamChat'; +import type { TeamCreate } from '../models/TeamCreate'; +import type { TeamOut } from '../models/TeamOut'; +import type { TeamsOut } from '../models/TeamsOut'; +import type { TeamUpdate } from '../models/TeamUpdate'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class TeamsService { + + /** + * Read Teams + * Retrieve teams + * @returns TeamsOut Successful Response + * @throws ApiError + */ + public static readTeams({ + skip, + limit = 100, + }: { + skip?: number, + limit?: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v1/teams/', + query: { + 'skip': skip, + 'limit': limit, + }, + errors: { + 422: `Validation Error`, + }, + }); + } + + /** + * Create Team + * Create new team and it's team leader + * @returns TeamOut Successful Response + * @throws ApiError + */ + public static createTeam({ + requestBody, + }: { + requestBody: TeamCreate, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v1/teams/', + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } + + /** + * Read Team + * Get team by ID. + * @returns TeamOut Successful Response + * @throws ApiError + */ + public static readTeam({ + id, + }: { + id: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/api/v1/teams/{id}', + path: { + 'id': id, + }, + errors: { + 422: `Validation Error`, + }, + }); + } + + /** + * Update Team + * Update a team. + * @returns TeamOut Successful Response + * @throws ApiError + */ + public static updateTeam({ + id, + requestBody, + }: { + id: number, + requestBody: TeamUpdate, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/api/v1/teams/{id}', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } + + /** + * Delete Team + * Delete a team. + * @returns any Successful Response + * @throws ApiError + */ + public static deleteTeam({ + id, + }: { + id: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/api/v1/teams/{id}', + path: { + 'id': id, + }, + errors: { + 422: `Validation Error`, + }, + }); + } + + /** + * Stream + * Stream a response to a user's input. + * @returns any Successful Response + * @throws ApiError + */ + public static stream({ + id, + requestBody, + }: { + id: number, + requestBody: TeamChat, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/api/v1/teams/{id}/stream', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } + +} diff --git a/frontend/src/client/services/UsersService.ts b/frontend/src/client/services/UsersService.ts index 055debe5..94684b4f 100644 --- a/frontend/src/client/services/UsersService.ts +++ b/frontend/src/client/services/UsersService.ts @@ -24,12 +24,12 @@ export class UsersService { * @throws ApiError */ public static readUsers({ -skip, -limit = 100, -}: { -skip?: number, -limit?: number, -}): CancelablePromise { + skip, + limit = 100, + }: { + skip?: number, + limit?: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/api/v1/users/', @@ -50,10 +50,10 @@ limit?: number, * @throws ApiError */ public static createUser({ -requestBody, -}: { -requestBody: UserCreate, -}): CancelablePromise { + requestBody, + }: { + requestBody: UserCreate, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/api/v1/users/', @@ -85,10 +85,10 @@ requestBody: UserCreate, * @throws ApiError */ public static updateUserMe({ -requestBody, -}: { -requestBody: UserUpdateMe, -}): CancelablePromise { + requestBody, + }: { + requestBody: UserUpdateMe, + }): CancelablePromise { return __request(OpenAPI, { method: 'PATCH', url: '/api/v1/users/me', @@ -107,10 +107,10 @@ requestBody: UserUpdateMe, * @throws ApiError */ public static updatePasswordMe({ -requestBody, -}: { -requestBody: UpdatePassword, -}): CancelablePromise { + requestBody, + }: { + requestBody: UpdatePassword, + }): CancelablePromise { return __request(OpenAPI, { method: 'PATCH', url: '/api/v1/users/me/password', @@ -129,10 +129,10 @@ requestBody: UpdatePassword, * @throws ApiError */ public static createUserOpen({ -requestBody, -}: { -requestBody: UserCreateOpen, -}): CancelablePromise { + requestBody, + }: { + requestBody: UserCreateOpen, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/api/v1/users/open', @@ -151,10 +151,10 @@ requestBody: UserCreateOpen, * @throws ApiError */ public static readUserById({ -userId, -}: { -userId: number, -}): CancelablePromise { + userId, + }: { + userId: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/api/v1/users/{user_id}', @@ -174,12 +174,12 @@ userId: number, * @throws ApiError */ public static updateUser({ -userId, -requestBody, -}: { -userId: number, -requestBody: UserUpdate, -}): CancelablePromise { + userId, + requestBody, + }: { + userId: number, + requestBody: UserUpdate, + }): CancelablePromise { return __request(OpenAPI, { method: 'PATCH', url: '/api/v1/users/{user_id}', @@ -201,10 +201,10 @@ requestBody: UserUpdate, * @throws ApiError */ public static deleteUser({ -userId, -}: { -userId: number, -}): CancelablePromise { + userId, + }: { + userId: number, + }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', url: '/api/v1/users/{user_id}', diff --git a/frontend/src/client/services/UtilsService.ts b/frontend/src/client/services/UtilsService.ts index a7ed0bb4..bc6f97ef 100644 --- a/frontend/src/client/services/UtilsService.ts +++ b/frontend/src/client/services/UtilsService.ts @@ -10,28 +10,6 @@ import { request as __request } from '../core/request'; export class UtilsService { - /** - * Test Celery - * Test Celery worker. - * @returns Message Successful Response - * @throws ApiError - */ - public static testCelery({ -requestBody, -}: { -requestBody: Message, -}): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/api/v1/utils/test-celery/', - body: requestBody, - mediaType: 'application/json', - errors: { - 422: `Validation Error`, - }, - }); - } - /** * Test Email * Test emails. @@ -39,10 +17,10 @@ requestBody: Message, * @throws ApiError */ public static testEmail({ -emailTo, -}: { -emailTo: string, -}): CancelablePromise { + emailTo, + }: { + emailTo: string, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/api/v1/utils/test-email/', diff --git a/frontend/src/components/Common/ActionsMenu.tsx b/frontend/src/components/Common/ActionsMenu.tsx index 3cc2dc0c..9dc5fd33 100644 --- a/frontend/src/components/Common/ActionsMenu.tsx +++ b/frontend/src/components/Common/ActionsMenu.tsx @@ -9,14 +9,15 @@ import { import { BsThreeDotsVertical } from "react-icons/bs" import { FiEdit, FiTrash } from "react-icons/fi" -import type { ItemOut, UserOut } from "../../client" +import type { ItemOut, TeamOut, UserOut } from "../../client" import EditUser from "../Admin/EditUser" import EditItem from "../Items/EditItem" +import EditTeam from "../Teams/EditTeam" import Delete from "./DeleteAlert" interface ActionsMenuProps { type: string - value: ItemOut | UserOut + value: ItemOut | UserOut | TeamOut disabled?: boolean } @@ -54,12 +55,18 @@ const ActionsMenu = ({ type, value, disabled }: ActionsMenuProps) => { isOpen={editUserModal.isOpen} onClose={editUserModal.onClose} /> - ) : ( + ) : type === "Item" ? ( + ) : ( + )} { await ItemsService.deleteItem({ id: id }) } else if (type === "User") { await UsersService.deleteUser({ userId: id }) + } else if (type === "Team") { + await TeamsService.deleteTeam({ id: id }) } else { throw new Error(`Unexpected type: ${type}`) } @@ -57,7 +59,9 @@ const Delete = ({ type, id, isOpen, onClose }: DeleteProps) => { ) }, onSettled: () => { - queryClient.invalidateQueries(type === "Item" ? "items" : "users") + queryClient.invalidateQueries( + type === "Item" ? "items" : type === "User" ? "users" : "teams", + ) }, }) diff --git a/frontend/src/components/Common/Navbar.tsx b/frontend/src/components/Common/Navbar.tsx index 6fcd3a1f..b52db606 100644 --- a/frontend/src/components/Common/Navbar.tsx +++ b/frontend/src/components/Common/Navbar.tsx @@ -3,6 +3,7 @@ import { FaPlus } from "react-icons/fa" import AddUser from "../Admin/AddUser" import AddItem from "../Items/AddItem" +import AddTeam from "../Teams/AddTeam" interface NavbarProps { type: string @@ -11,6 +12,7 @@ interface NavbarProps { const Navbar = ({ type }: NavbarProps) => { const addUserModal = useDisclosure() const addItemModal = useDisclosure() + const addTeamModal = useDisclosure() return ( <> @@ -26,12 +28,19 @@ const Navbar = ({ type }: NavbarProps) => { variant="primary" gap={1} fontSize={{ base: "sm", md: "inherit" }} - onClick={type === "User" ? addUserModal.onOpen : addItemModal.onOpen} + onClick={ + type === "User" + ? addUserModal.onOpen + : type === "Item" + ? addItemModal.onOpen + : addTeamModal.onOpen + } > Add {type} + ) diff --git a/frontend/src/components/Common/SidebarItems.tsx b/frontend/src/components/Common/SidebarItems.tsx index d075b09d..d6aad6e7 100644 --- a/frontend/src/components/Common/SidebarItems.tsx +++ b/frontend/src/components/Common/SidebarItems.tsx @@ -1,6 +1,7 @@ import { Box, Flex, Icon, Text, useColorModeValue } from "@chakra-ui/react" import { Link } from "@tanstack/react-router" import { FiBriefcase, FiHome, FiSettings, FiUsers } from "react-icons/fi" +import { LuNetwork } from "react-icons/lu" import { useQueryClient } from "react-query" import type { UserOut } from "../../client" @@ -8,6 +9,7 @@ import type { UserOut } from "../../client" const items = [ { icon: FiHome, title: "Dashboard", path: "/" }, { icon: FiBriefcase, title: "Items", path: "/items" }, + { icon: LuNetwork, title: "Teams", path: "/teams" }, { icon: FiSettings, title: "User Settings", path: "/settings" }, ] diff --git a/frontend/src/components/Members/EditMember.tsx b/frontend/src/components/Members/EditMember.tsx new file mode 100644 index 00000000..4593a486 --- /dev/null +++ b/frontend/src/components/Members/EditMember.tsx @@ -0,0 +1,178 @@ +import { + Button, + FormControl, + FormErrorMessage, + FormLabel, + Input, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Select, + Textarea, +} from "@chakra-ui/react" +import useCustomToast from "../../hooks/useCustomToast" +import { useMutation, useQueryClient } from "react-query" +import { + type ApiError, + MembersService, + type TeamUpdate, + type MemberOut, + type MemberUpdate, +} from "../../client" +import { type SubmitHandler, useForm } from "react-hook-form" + +interface EditMemberProps { + member: MemberOut + teamId: number + isOpen: boolean + onClose: () => void +} + +export function EditMember({ + member, + teamId, + isOpen, + onClose, +}: EditMemberProps) { + const queryClient = useQueryClient() + const showToast = useCustomToast() + const { + register, + handleSubmit, + reset, + formState: { isSubmitting, errors, isDirty }, + } = useForm({ + mode: "onBlur", + criteriaMode: "all", + values: member, + }) + + const updateMember = async (data: MemberUpdate) => { + await MembersService.updateMember({ + id: member.id, + teamId: teamId, + requestBody: data, + }) + } + + const mutation = useMutation(updateMember, { + onSuccess: () => { + showToast("Success!", "Team updated successfully.", "success") + onClose() + }, + onError: (err: ApiError) => { + const errDetail = err.body?.detail + showToast("Something went wrong.", `${errDetail}`, "error") + }, + onSettled: () => { + queryClient.invalidateQueries(`teams/${teamId}/members`) + }, + }) + + const onSubmit: SubmitHandler = async (data) => { + mutation.mutate(data) + } + + const onCancel = () => { + reset() + onClose() + } + + return ( + + + + Update Team Member + + + + Type + + + + Name + + {errors.name && ( + {errors.name.message} + )} + + + Role +