diff --git a/.env b/.env
index 1d44286e25..d71a717b74 100644
--- a/.env
+++ b/.env
@@ -18,9 +18,9 @@ STACK_NAME=full-stack-fastapi-project
# Backend
BACKEND_CORS_ORIGINS="http://localhost,http://localhost:5173,https://localhost,https://localhost:5173,http://localhost.tiangolo.com"
-SECRET_KEY=changethis
+SECRET_KEY=UXjzVJ3dRZEDKD8RkdUBTBsSPVETMj3R
FIRST_SUPERUSER=admin@example.com
-FIRST_SUPERUSER_PASSWORD=changethis
+FIRST_SUPERUSER_PASSWORD=Torghay1988
# Emails
SMTP_HOST=
@@ -31,12 +31,12 @@ SMTP_TLS=True
SMTP_SSL=False
SMTP_PORT=587
-# Postgres
-POSTGRES_SERVER=localhost
-POSTGRES_PORT=5432
-POSTGRES_DB=app
-POSTGRES_USER=postgres
-POSTGRES_PASSWORD=changethis
+# Mysql
+MYSQL_SERVER=localhost
+MYSQL_PORT=3306
+MYSQL_DB=lalili
+MYSQL_USER=root
+MYSQL_PASSWORD=Qaz123(!*
SENTRY_DSN=
diff --git a/backend/app/alembic/versions/1a31ce608336_add_cascade_delete_relationships.py b/backend/app/alembic/versions/1a31ce608336_add_cascade_delete_relationships.py
deleted file mode 100644
index 10e47a1456..0000000000
--- a/backend/app/alembic/versions/1a31ce608336_add_cascade_delete_relationships.py
+++ /dev/null
@@ -1,37 +0,0 @@
-"""Add cascade delete relationships
-
-Revision ID: 1a31ce608336
-Revises: d98dd8ec85a3
-Create Date: 2024-07-31 22:24:34.447891
-
-"""
-from alembic import op
-import sqlalchemy as sa
-import sqlmodel.sql.sqltypes
-
-
-# revision identifiers, used by Alembic.
-revision = '1a31ce608336'
-down_revision = 'd98dd8ec85a3'
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
- # ### commands auto generated by Alembic - please adjust! ###
- op.alter_column('item', 'owner_id',
- existing_type=sa.UUID(),
- nullable=False)
- op.drop_constraint('item_owner_id_fkey', 'item', type_='foreignkey')
- op.create_foreign_key(None, 'item', 'user', ['owner_id'], ['id'], ondelete='CASCADE')
- # ### end Alembic commands ###
-
-
-def downgrade():
- # ### commands auto generated by Alembic - please adjust! ###
- op.drop_constraint(None, 'item', type_='foreignkey')
- op.create_foreign_key('item_owner_id_fkey', 'item', 'user', ['owner_id'], ['id'])
- op.alter_column('item', 'owner_id',
- existing_type=sa.UUID(),
- nullable=True)
- # ### end Alembic commands ###
diff --git a/backend/app/alembic/versions/324024cfba63_upgrade_model.py b/backend/app/alembic/versions/324024cfba63_upgrade_model.py
new file mode 100644
index 0000000000..5a682fc258
--- /dev/null
+++ b/backend/app/alembic/versions/324024cfba63_upgrade_model.py
@@ -0,0 +1,48 @@
+"""Upgrade model
+
+Revision ID: 324024cfba63
+Revises:
+Create Date: 2025-01-14 14:35:35.495095
+
+"""
+from alembic import op
+import sqlalchemy as sa
+import sqlmodel.sql.sqltypes
+
+
+# revision identifiers, used by Alembic.
+revision = '324024cfba63'
+down_revision = None
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.create_table('user',
+ sa.Column('email', sqlmodel.sql.sqltypes.AutoString(length=255), nullable=False),
+ sa.Column('is_active', sa.Boolean(), nullable=False),
+ sa.Column('is_superuser', sa.Boolean(), nullable=False),
+ sa.Column('full_name', sqlmodel.sql.sqltypes.AutoString(length=255), nullable=True),
+ sa.Column('id', sa.Uuid(), nullable=False),
+ sa.Column('hashed_password', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
+ sa.PrimaryKeyConstraint('id')
+ )
+ op.create_index(op.f('ix_user_email'), 'user', ['email'], unique=True)
+ op.create_table('item',
+ sa.Column('description', sqlmodel.sql.sqltypes.AutoString(length=255), nullable=True),
+ sa.Column('id', sa.Uuid(), nullable=False),
+ sa.Column('title', sqlmodel.sql.sqltypes.AutoString(length=255), nullable=False),
+ sa.Column('owner_id', sa.Uuid(), nullable=False),
+ sa.ForeignKeyConstraint(['owner_id'], ['user.id'], ondelete='CASCADE'),
+ sa.PrimaryKeyConstraint('id')
+ )
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_table('item')
+ op.drop_index(op.f('ix_user_email'), table_name='user')
+ op.drop_table('user')
+ # ### end Alembic commands ###
diff --git a/backend/app/alembic/versions/9c0a54914c78_add_max_length_for_string_varchar_.py b/backend/app/alembic/versions/9c0a54914c78_add_max_length_for_string_varchar_.py
deleted file mode 100755
index 78a41773b9..0000000000
--- a/backend/app/alembic/versions/9c0a54914c78_add_max_length_for_string_varchar_.py
+++ /dev/null
@@ -1,69 +0,0 @@
-"""Add max length for string(varchar) fields in User and Items models
-
-Revision ID: 9c0a54914c78
-Revises: e2412789c190
-Create Date: 2024-06-17 14:42:44.639457
-
-"""
-from alembic import op
-import sqlalchemy as sa
-import sqlmodel.sql.sqltypes
-
-
-# revision identifiers, used by Alembic.
-revision = '9c0a54914c78'
-down_revision = 'e2412789c190'
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
- # Adjust the length of the email field in the User table
- op.alter_column('user', 'email',
- existing_type=sa.String(),
- type_=sa.String(length=255),
- existing_nullable=False)
-
- # Adjust the length of the full_name field in the User table
- op.alter_column('user', 'full_name',
- existing_type=sa.String(),
- type_=sa.String(length=255),
- existing_nullable=True)
-
- # Adjust the length of the title field in the Item table
- op.alter_column('item', 'title',
- existing_type=sa.String(),
- type_=sa.String(length=255),
- existing_nullable=False)
-
- # Adjust the length of the description field in the Item table
- op.alter_column('item', 'description',
- existing_type=sa.String(),
- type_=sa.String(length=255),
- existing_nullable=True)
-
-
-def downgrade():
- # Revert the length of the email field in the User table
- op.alter_column('user', 'email',
- existing_type=sa.String(length=255),
- type_=sa.String(),
- existing_nullable=False)
-
- # Revert the length of the full_name field in the User table
- op.alter_column('user', 'full_name',
- existing_type=sa.String(length=255),
- type_=sa.String(),
- existing_nullable=True)
-
- # Revert the length of the title field in the Item table
- op.alter_column('item', 'title',
- existing_type=sa.String(length=255),
- type_=sa.String(),
- existing_nullable=False)
-
- # Revert the length of the description field in the Item table
- op.alter_column('item', 'description',
- existing_type=sa.String(length=255),
- type_=sa.String(),
- existing_nullable=True)
diff --git a/backend/app/alembic/versions/d98dd8ec85a3_edit_replace_id_integers_in_all_models_.py b/backend/app/alembic/versions/d98dd8ec85a3_edit_replace_id_integers_in_all_models_.py
deleted file mode 100755
index 37af1fa215..0000000000
--- a/backend/app/alembic/versions/d98dd8ec85a3_edit_replace_id_integers_in_all_models_.py
+++ /dev/null
@@ -1,90 +0,0 @@
-"""Edit replace id integers in all models to use UUID instead
-
-Revision ID: d98dd8ec85a3
-Revises: 9c0a54914c78
-Create Date: 2024-07-19 04:08:04.000976
-
-"""
-from alembic import op
-import sqlalchemy as sa
-import sqlmodel.sql.sqltypes
-from sqlalchemy.dialects import postgresql
-
-
-# revision identifiers, used by Alembic.
-revision = 'd98dd8ec85a3'
-down_revision = '9c0a54914c78'
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
- # Ensure uuid-ossp extension is available
- op.execute('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"')
-
- # Create a new UUID column with a default UUID value
- op.add_column('user', sa.Column('new_id', postgresql.UUID(as_uuid=True), default=sa.text('uuid_generate_v4()')))
- op.add_column('item', sa.Column('new_id', postgresql.UUID(as_uuid=True), default=sa.text('uuid_generate_v4()')))
- op.add_column('item', sa.Column('new_owner_id', postgresql.UUID(as_uuid=True), nullable=True))
-
- # Populate the new columns with UUIDs
- op.execute('UPDATE "user" SET new_id = uuid_generate_v4()')
- op.execute('UPDATE item SET new_id = uuid_generate_v4()')
- op.execute('UPDATE item SET new_owner_id = (SELECT new_id FROM "user" WHERE "user".id = item.owner_id)')
-
- # Set the new_id as not nullable
- op.alter_column('user', 'new_id', nullable=False)
- op.alter_column('item', 'new_id', nullable=False)
-
- # Drop old columns and rename new columns
- op.drop_constraint('item_owner_id_fkey', 'item', type_='foreignkey')
- op.drop_column('item', 'owner_id')
- op.alter_column('item', 'new_owner_id', new_column_name='owner_id')
-
- op.drop_column('user', 'id')
- op.alter_column('user', 'new_id', new_column_name='id')
-
- op.drop_column('item', 'id')
- op.alter_column('item', 'new_id', new_column_name='id')
-
- # Create primary key constraint
- op.create_primary_key('user_pkey', 'user', ['id'])
- op.create_primary_key('item_pkey', 'item', ['id'])
-
- # Recreate foreign key constraint
- op.create_foreign_key('item_owner_id_fkey', 'item', 'user', ['owner_id'], ['id'])
-
-def downgrade():
- # Reverse the upgrade process
- op.add_column('user', sa.Column('old_id', sa.Integer, autoincrement=True))
- op.add_column('item', sa.Column('old_id', sa.Integer, autoincrement=True))
- op.add_column('item', sa.Column('old_owner_id', sa.Integer, nullable=True))
-
- # Populate the old columns with default values
- # Generate sequences for the integer IDs if not exist
- op.execute('CREATE SEQUENCE IF NOT EXISTS user_id_seq AS INTEGER OWNED BY "user".old_id')
- op.execute('CREATE SEQUENCE IF NOT EXISTS item_id_seq AS INTEGER OWNED BY item.old_id')
-
- op.execute('SELECT setval(\'user_id_seq\', COALESCE((SELECT MAX(old_id) + 1 FROM "user"), 1), false)')
- op.execute('SELECT setval(\'item_id_seq\', COALESCE((SELECT MAX(old_id) + 1 FROM item), 1), false)')
-
- op.execute('UPDATE "user" SET old_id = nextval(\'user_id_seq\')')
- op.execute('UPDATE item SET old_id = nextval(\'item_id_seq\'), old_owner_id = (SELECT old_id FROM "user" WHERE "user".id = item.owner_id)')
-
- # Drop new columns and rename old columns back
- op.drop_constraint('item_owner_id_fkey', 'item', type_='foreignkey')
- op.drop_column('item', 'owner_id')
- op.alter_column('item', 'old_owner_id', new_column_name='owner_id')
-
- op.drop_column('user', 'id')
- op.alter_column('user', 'old_id', new_column_name='id')
-
- op.drop_column('item', 'id')
- op.alter_column('item', 'old_id', new_column_name='id')
-
- # Create primary key constraint
- op.create_primary_key('user_pkey', 'user', ['id'])
- op.create_primary_key('item_pkey', 'item', ['id'])
-
- # Recreate foreign key constraint
- op.create_foreign_key('item_owner_id_fkey', 'item', 'user', ['owner_id'], ['id'])
diff --git a/backend/app/alembic/versions/e2412789c190_initialize_models.py b/backend/app/alembic/versions/e2412789c190_initialize_models.py
deleted file mode 100644
index 7529ea91fa..0000000000
--- a/backend/app/alembic/versions/e2412789c190_initialize_models.py
+++ /dev/null
@@ -1,54 +0,0 @@
-"""Initialize models
-
-Revision ID: e2412789c190
-Revises:
-Create Date: 2023-11-24 22:55:43.195942
-
-"""
-import sqlalchemy as sa
-import sqlmodel.sql.sqltypes
-from alembic import op
-
-# revision identifiers, used by Alembic.
-revision = "e2412789c190"
-down_revision = None
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
- # ### commands auto generated by Alembic - please adjust! ###
- op.create_table(
- "user",
- sa.Column("email", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
- sa.Column("is_active", sa.Boolean(), nullable=False),
- sa.Column("is_superuser", sa.Boolean(), nullable=False),
- sa.Column("full_name", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
- sa.Column("id", sa.Integer(), nullable=False),
- sa.Column(
- "hashed_password", sqlmodel.sql.sqltypes.AutoString(), nullable=False
- ),
- sa.PrimaryKeyConstraint("id"),
- )
- op.create_index(op.f("ix_user_email"), "user", ["email"], unique=True)
- op.create_table(
- "item",
- sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
- sa.Column("id", sa.Integer(), nullable=False),
- sa.Column("title", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
- sa.Column("owner_id", sa.Integer(), nullable=False),
- sa.ForeignKeyConstraint(
- ["owner_id"],
- ["user.id"],
- ),
- sa.PrimaryKeyConstraint("id"),
- )
- # ### end Alembic commands ###
-
-
-def downgrade():
- # ### commands auto generated by Alembic - please adjust! ###
- op.drop_table("item")
- op.drop_index(op.f("ix_user_email"), table_name="user")
- op.drop_table("user")
- # ### end Alembic commands ###
diff --git a/backend/app/api/deps.py b/backend/app/api/deps.py
index c2b83c841d..72d418cabd 100644
--- a/backend/app/api/deps.py
+++ b/backend/app/api/deps.py
@@ -1,6 +1,8 @@
+import uuid
from collections.abc import Generator
from typing import Annotated
+
import jwt
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
@@ -13,6 +15,7 @@
from app.core.db import engine
from app.models import TokenPayload, User
+
reusable_oauth2 = OAuth2PasswordBearer(
tokenUrl=f"{settings.API_V1_STR}/login/access-token"
)
@@ -38,7 +41,7 @@ def get_current_user(session: SessionDep, token: TokenDep) -> User:
status_code=status.HTTP_403_FORBIDDEN,
detail="Could not validate credentials",
)
- user = session.get(User, token_data.sub)
+ user = session.get(User, uuid.UUID(token_data.sub))
if not user:
raise HTTPException(status_code=404, detail="User not found")
if not user.is_active:
diff --git a/backend/app/api/routes/items.py b/backend/app/api/routes/items.py
index 177dc1e476..7122b51801 100644
--- a/backend/app/api/routes/items.py
+++ b/backend/app/api/routes/items.py
@@ -1,11 +1,11 @@
import uuid
from typing import Any
-from fastapi import APIRouter, HTTPException
-from sqlmodel import func, select
+from fastapi import APIRouter
from app.api.deps import CurrentUser, SessionDep
-from app.models import Item, ItemCreate, ItemPublic, ItemsPublic, ItemUpdate, Message
+from app.service.item_service import ItemService
+from app.models import ItemCreate, ItemPublic, ItemsPublic, ItemUpdate, Message
router = APIRouter(prefix="/items", tags=["items"])
@@ -17,28 +17,14 @@ def read_items(
"""
Retrieve items.
"""
-
- if current_user.is_superuser:
- count_statement = select(func.count()).select_from(Item)
- count = session.exec(count_statement).one()
- statement = select(Item).offset(skip).limit(limit)
- items = session.exec(statement).all()
- else:
- count_statement = (
- select(func.count())
- .select_from(Item)
- .where(Item.owner_id == current_user.id)
- )
- count = session.exec(count_statement).one()
- statement = (
- select(Item)
- .where(Item.owner_id == current_user.id)
- .offset(skip)
- .limit(limit)
- )
- items = session.exec(statement).all()
-
- return ItemsPublic(data=items, count=count)
+ item_service = ItemService(session)
+ result = item_service.read_items(
+ owner_id=current_user.id,
+ is_superuser=current_user.is_superuser,
+ skip=skip,
+ limit=limit,
+ )
+ return ItemsPublic(data=result["data"], count=result["count"])
@router.get("/{id}", response_model=ItemPublic)
@@ -46,13 +32,10 @@ def read_item(session: SessionDep, current_user: CurrentUser, id: uuid.UUID) ->
"""
Get item by ID.
"""
- item = session.get(Item, id)
- if not item:
- raise HTTPException(status_code=404, detail="Item not found")
- if not current_user.is_superuser and (item.owner_id != current_user.id):
- raise HTTPException(status_code=400, detail="Not enough permissions")
- return item
-
+ item_service = ItemService(session)
+ return item_service.read_item(
+ item_id=id, owner_id=current_user.id, is_superuser=current_user.is_superuser
+ )
@router.post("/", response_model=ItemPublic)
def create_item(
@@ -61,11 +44,8 @@ def create_item(
"""
Create new item.
"""
- item = Item.model_validate(item_in, update={"owner_id": current_user.id})
- session.add(item)
- session.commit()
- session.refresh(item)
- return item
+ item_service = ItemService(session)
+ return item_service.create_item(item_in, current_user.id)
@router.put("/{id}", response_model=ItemPublic)
@@ -79,17 +59,13 @@ def update_item(
"""
Update an item.
"""
- item = session.get(Item, id)
- if not item:
- raise HTTPException(status_code=404, detail="Item not found")
- if not current_user.is_superuser and (item.owner_id != current_user.id):
- raise HTTPException(status_code=400, detail="Not enough permissions")
- update_dict = item_in.model_dump(exclude_unset=True)
- item.sqlmodel_update(update_dict)
- session.add(item)
- session.commit()
- session.refresh(item)
- return item
+ item_service = ItemService(session)
+ return item_service.update_item(
+ item_id=id,
+ item_in=item_in,
+ owner_id=current_user.id,
+ is_superuser=current_user.is_superuser,
+ )
@router.delete("/{id}")
@@ -99,11 +75,7 @@ def delete_item(
"""
Delete an item.
"""
- item = session.get(Item, id)
- if not item:
- raise HTTPException(status_code=404, detail="Item not found")
- if not current_user.is_superuser and (item.owner_id != current_user.id):
- raise HTTPException(status_code=400, detail="Not enough permissions")
- session.delete(item)
- session.commit()
- return Message(message="Item deleted successfully")
+ item_service = ItemService(session)
+ item_service.delete_item(
+ item_id=id, owner_id=current_user.id, is_superuser=current_user.is_superuser
+ )
diff --git a/backend/app/api/routes/login.py b/backend/app/api/routes/login.py
index 980c66f86f..aab5b7a8b9 100644
--- a/backend/app/api/routes/login.py
+++ b/backend/app/api/routes/login.py
@@ -5,11 +5,11 @@
from fastapi.responses import HTMLResponse
from fastapi.security import OAuth2PasswordRequestForm
-from app import crud
from app.api.deps import CurrentUser, SessionDep, get_current_active_superuser
from app.core import security
from app.core.config import settings
from app.core.security import get_password_hash
+from app.service.user_service import UserService
from app.models import Message, NewPassword, Token, UserPublic
from app.utils import (
generate_password_reset_token,
@@ -28,8 +28,9 @@ def login_access_token(
"""
OAuth2 compatible token login, get an access token for future requests
"""
- user = crud.authenticate(
- session=session, email=form_data.username, password=form_data.password
+ user_service = UserService(session)
+ user = user_service.authenticate(
+ email=form_data.username, password=form_data.password
)
if not user:
raise HTTPException(status_code=400, detail="Incorrect email or password")
@@ -56,7 +57,8 @@ def recover_password(email: str, session: SessionDep) -> Message:
"""
Password Recovery
"""
- user = crud.get_user_by_email(session=session, email=email)
+ user_service = UserService(session)
+ user = user_service.get_user_by_email(email=email)
if not user:
raise HTTPException(
@@ -83,7 +85,8 @@ def reset_password(session: SessionDep, body: NewPassword) -> Message:
email = verify_password_reset_token(token=body.token)
if not email:
raise HTTPException(status_code=400, detail="Invalid token")
- user = crud.get_user_by_email(session=session, email=email)
+ user_service = UserService(session)
+ user = user_service.get_user_by_email(email=email)
if not user:
raise HTTPException(
status_code=404,
@@ -107,7 +110,8 @@ def recover_password_html_content(email: str, session: SessionDep) -> Any:
"""
HTML Content for Password Recovery
"""
- user = crud.get_user_by_email(session=session, email=email)
+ user_service = UserService(session)
+ user = user_service.get_user_by_email(email=email)
if not user:
raise HTTPException(
diff --git a/backend/app/api/routes/private.py b/backend/app/api/routes/private.py
index 9f33ef1900..efe20b796f 100644
--- a/backend/app/api/routes/private.py
+++ b/backend/app/api/routes/private.py
@@ -5,10 +5,7 @@
from app.api.deps import SessionDep
from app.core.security import get_password_hash
-from app.models import (
- User,
- UserPublic,
-)
+from app.models import User, UserPublic
router = APIRouter(tags=["private"], prefix="/private")
diff --git a/backend/app/api/routes/users.py b/backend/app/api/routes/users.py
index 0e8b5a87f8..7ca9cffbdf 100644
--- a/backend/app/api/routes/users.py
+++ b/backend/app/api/routes/users.py
@@ -2,21 +2,17 @@
from typing import Any
from fastapi import APIRouter, Depends, HTTPException
-from sqlmodel import col, delete, func, select
-from app import crud
from app.api.deps import (
CurrentUser,
SessionDep,
get_current_active_superuser,
)
from app.core.config import settings
-from app.core.security import get_password_hash, verify_password
+from app.service.user_service import UserService
from app.models import (
- Item,
Message,
UpdatePassword,
- User,
UserCreate,
UserPublic,
UserRegister,
@@ -38,14 +34,9 @@ def read_users(session: SessionDep, skip: int = 0, limit: int = 100) -> Any:
"""
Retrieve users.
"""
-
- count_statement = select(func.count()).select_from(User)
- count = session.exec(count_statement).one()
-
- statement = select(User).offset(skip).limit(limit)
- users = session.exec(statement).all()
-
- return UsersPublic(data=users, count=count)
+ user_service = UserService(session)
+ result = user_service.get_users(skip=skip, limit=limit)
+ return UsersPublic(data=result["data"], count=result["count"])
@router.post(
@@ -55,14 +46,15 @@ def create_user(*, session: SessionDep, user_in: UserCreate) -> Any:
"""
Create new user.
"""
- user = crud.get_user_by_email(session=session, email=user_in.email)
+ user_service = UserService(session)
+ user = user_service.get_user_by_email(email=user_in.email)
if user:
raise HTTPException(
status_code=400,
detail="The user with this email already exists in the system.",
)
- user = crud.create_user(session=session, user_create=user_in)
+ user = user_service.create_user(user_in)
if settings.emails_enabled and user_in.email:
email_data = generate_new_account_email(
email_to=user_in.email, username=user_in.email, password=user_in.password
@@ -82,19 +74,11 @@ def update_user_me(
"""
Update own user.
"""
-
- if user_in.email:
- existing_user = crud.get_user_by_email(session=session, email=user_in.email)
- if existing_user and existing_user.id != current_user.id:
- raise HTTPException(
- status_code=409, detail="User with this email already exists"
- )
- user_data = user_in.model_dump(exclude_unset=True)
- current_user.sqlmodel_update(user_data)
- session.add(current_user)
- session.commit()
- session.refresh(current_user)
- return current_user
+ user_service = UserService(session)
+ try:
+ return user_service.update_user_me(current_user, user_in)
+ except ValueError as e:
+ raise HTTPException(status_code=409, detail=str(e))
@router.patch("/me/password", response_model=Message)
@@ -104,17 +88,14 @@ def update_password_me(
"""
Update own password.
"""
- if not verify_password(body.current_password, current_user.hashed_password):
- raise HTTPException(status_code=400, detail="Incorrect password")
- if body.current_password == body.new_password:
- raise HTTPException(
- status_code=400, detail="New password cannot be the same as the current one"
+ user_service = UserService(session)
+ try:
+ user_service.update_password(
+ current_user, body.current_password, body.new_password
)
- hashed_password = get_password_hash(body.new_password)
- current_user.hashed_password = hashed_password
- session.add(current_user)
- session.commit()
- return Message(message="Password updated successfully")
+ return Message(message="Password updated successfully")
+ except ValueError as e:
+ raise HTTPException(status_code=400, detail=str(e))
@router.get("/me", response_model=UserPublic)
@@ -130,15 +111,14 @@ def delete_user_me(session: SessionDep, current_user: CurrentUser) -> Any:
"""
Delete own user.
"""
- if current_user.is_superuser:
- raise HTTPException(
- status_code=403, detail="Super users are not allowed to delete themselves"
+ user_service = UserService(session)
+ try:
+ user_service.delete_user(
+ str(current_user.id), str(current_user.id), current_user.is_superuser
)
- statement = delete(Item).where(col(Item.owner_id) == current_user.id)
- session.exec(statement) # type: ignore
- session.delete(current_user)
- session.commit()
- return Message(message="User deleted successfully")
+ return Message(message="User deleted successfully")
+ except ValueError as e:
+ raise HTTPException(status_code=403, detail=str(e))
@router.post("/signup", response_model=UserPublic)
@@ -146,14 +126,15 @@ def register_user(session: SessionDep, user_in: UserRegister) -> Any:
"""
Create new user without the need to be logged in.
"""
- user = crud.get_user_by_email(session=session, email=user_in.email)
+ user_service = UserService(session)
+ user = user_service.get_user_by_email(email=user_in.email)
if user:
raise HTTPException(
status_code=400,
detail="The user with this email already exists in the system",
)
user_create = UserCreate.model_validate(user_in)
- user = crud.create_user(session=session, user_create=user_create)
+ user = user_service.create_user(user_create)
return user
@@ -164,7 +145,10 @@ def read_user_by_id(
"""
Get a specific user by id.
"""
- user = session.get(User, user_id)
+ user_service = UserService(session)
+ user = user_service.get_user_by_id(str(user_id))
+ if not user:
+ raise HTTPException(status_code=404, detail="User not found")
if user == current_user:
return user
if not current_user.is_superuser:
@@ -189,22 +173,14 @@ def update_user(
"""
Update a user.
"""
-
- db_user = session.get(User, user_id)
+ user_service = UserService(session)
+ db_user = user_service.get_user_by_id(str(user_id))
if not db_user:
raise HTTPException(
status_code=404,
detail="The user with this id does not exist in the system",
)
- if user_in.email:
- existing_user = crud.get_user_by_email(session=session, email=user_in.email)
- if existing_user and existing_user.id != user_id:
- raise HTTPException(
- status_code=409, detail="User with this email already exists"
- )
-
- db_user = crud.update_user(session=session, db_user=db_user, user_in=user_in)
- return db_user
+ return user_service.update_user(db_user=db_user, user_in=user_in)
@router.delete("/{user_id}", dependencies=[Depends(get_current_active_superuser)])
@@ -214,15 +190,11 @@ def delete_user(
"""
Delete a user.
"""
- user = session.get(User, user_id)
- if not user:
- raise HTTPException(status_code=404, detail="User not found")
- if user == current_user:
- raise HTTPException(
- status_code=403, detail="Super users are not allowed to delete themselves"
+ user_service = UserService(session)
+ try:
+ user_service.delete_user(
+ str(user_id), str(current_user.id), current_user.is_superuser
)
- statement = delete(Item).where(col(Item.owner_id) == user_id)
- session.exec(statement) # type: ignore
- session.delete(user)
- session.commit()
- return Message(message="User deleted successfully")
+ return Message(message="User deleted successfully")
+ except ValueError as e:
+ raise HTTPException(status_code=403, detail=str(e))
diff --git a/backend/app/core/config.py b/backend/app/core/config.py
index 2370469d7a..7f4e395ced 100644
--- a/backend/app/core/config.py
+++ b/backend/app/core/config.py
@@ -6,7 +6,7 @@
AnyUrl,
BeforeValidator,
HttpUrl,
- PostgresDsn,
+ MySQLDsn,
computed_field,
model_validator,
)
@@ -50,22 +50,22 @@ def all_cors_origins(self) -> list[str]:
PROJECT_NAME: str
SENTRY_DSN: HttpUrl | None = None
- POSTGRES_SERVER: str
- POSTGRES_PORT: int = 5432
- POSTGRES_USER: str
- POSTGRES_PASSWORD: str = ""
- POSTGRES_DB: str = ""
+ MYSQL_SERVER: str
+ MYSQL_PORT: int = 5432
+ MYSQL_USER: str
+ MYSQL_PASSWORD: str = ""
+ MYSQL_DB: str = ""
@computed_field # type: ignore[prop-decorator]
@property
- def SQLALCHEMY_DATABASE_URI(self) -> PostgresDsn:
+ def SQLALCHEMY_DATABASE_URI(self) -> MySQLDsn:
return MultiHostUrl.build(
- scheme="postgresql+psycopg",
- username=self.POSTGRES_USER,
- password=self.POSTGRES_PASSWORD,
- host=self.POSTGRES_SERVER,
- port=self.POSTGRES_PORT,
- path=self.POSTGRES_DB,
+ scheme="mysql+pymysql",
+ username=self.MYSQL_USER,
+ password=self.MYSQL_PASSWORD,
+ host=self.MYSQL_SERVER,
+ port=self.MYSQL_PORT,
+ path=self.MYSQL_DB,
)
SMTP_TLS: bool = True
@@ -111,7 +111,7 @@ def _check_default_secret(self, var_name: str, value: str | None) -> None:
@model_validator(mode="after")
def _enforce_non_default_secrets(self) -> Self:
self._check_default_secret("SECRET_KEY", self.SECRET_KEY)
- self._check_default_secret("POSTGRES_PASSWORD", self.POSTGRES_PASSWORD)
+ self._check_default_secret("MYSQL_PASSWORD", self.MYSQL_PASSWORD)
self._check_default_secret(
"FIRST_SUPERUSER_PASSWORD", self.FIRST_SUPERUSER_PASSWORD
)
diff --git a/backend/app/core/db.py b/backend/app/core/db.py
index ba991fb36d..707272b585 100644
--- a/backend/app/core/db.py
+++ b/backend/app/core/db.py
@@ -1,7 +1,7 @@
from sqlmodel import Session, create_engine, select
-from app import crud
from app.core.config import settings
+from app.service.user_service import UserService
from app.models import User, UserCreate
engine = create_engine(str(settings.SQLALCHEMY_DATABASE_URI))
@@ -30,4 +30,5 @@ def init_db(session: Session) -> None:
password=settings.FIRST_SUPERUSER_PASSWORD,
is_superuser=True,
)
- user = crud.create_user(session=session, user_create=user_in)
+ user_service = UserService(session)
+ user = user_service.create_user(user_in)
diff --git a/backend/app/crud.py b/backend/app/crud.py
deleted file mode 100644
index 905bf48724..0000000000
--- a/backend/app/crud.py
+++ /dev/null
@@ -1,54 +0,0 @@
-import uuid
-from typing import Any
-
-from sqlmodel import Session, select
-
-from app.core.security import get_password_hash, verify_password
-from app.models import Item, ItemCreate, User, UserCreate, UserUpdate
-
-
-def create_user(*, session: Session, user_create: UserCreate) -> User:
- db_obj = User.model_validate(
- user_create, update={"hashed_password": get_password_hash(user_create.password)}
- )
- session.add(db_obj)
- session.commit()
- session.refresh(db_obj)
- return db_obj
-
-
-def update_user(*, session: Session, db_user: User, user_in: UserUpdate) -> Any:
- user_data = user_in.model_dump(exclude_unset=True)
- extra_data = {}
- if "password" in user_data:
- password = user_data["password"]
- hashed_password = get_password_hash(password)
- extra_data["hashed_password"] = hashed_password
- db_user.sqlmodel_update(user_data, update=extra_data)
- session.add(db_user)
- session.commit()
- session.refresh(db_user)
- return db_user
-
-
-def get_user_by_email(*, session: Session, email: str) -> User | None:
- statement = select(User).where(User.email == email)
- session_user = session.exec(statement).first()
- return session_user
-
-
-def authenticate(*, session: Session, email: str, password: str) -> User | None:
- db_user = get_user_by_email(session=session, email=email)
- if not db_user:
- return None
- if not verify_password(password, db_user.hashed_password):
- return None
- return db_user
-
-
-def create_item(*, session: Session, item_in: ItemCreate, owner_id: uuid.UUID) -> Item:
- db_item = Item.model_validate(item_in, update={"owner_id": owner_id})
- session.add(db_item)
- session.commit()
- session.refresh(db_item)
- return db_item
diff --git a/backend/app/model/__init__.py b/backend/app/model/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/app/model/item_model.py b/backend/app/model/item_model.py
new file mode 100644
index 0000000000..154f379ef2
--- /dev/null
+++ b/backend/app/model/item_model.py
@@ -0,0 +1,59 @@
+import uuid
+from typing import Any
+
+from sqlalchemy import func
+from sqlmodel import Session, select
+
+from app.models import ItemCreate, ItemUpdate
+
+
+class Item:
+ def __init__(self, session: Session):
+ self.session = session
+
+ def create(cls, item_in: ItemCreate, owner_id: uuid.UUID) -> "Item":
+ db_item = Item.model_validate(item_in, update={"owner_id": owner_id})
+ cls.session.add(db_item)
+ cls.session.commit()
+ cls.session.refresh(db_item)
+ return db_item
+
+ def get_items(
+ cls,
+ owner_id: uuid.UUID,
+ is_superuser: bool,
+ skip: int = 0,
+ limit: int = 100,
+ ) -> Any:
+ if is_superuser:
+ count_statement = select(func.count()).select_from(Item)
+ count = cls.session.exec(count_statement).one()
+ statement = select(Item).offset(skip).limit(limit)
+ items = cls.session.exec(statement).all()
+ else:
+ count_statement = (
+ select(func.count()).select_from(Item).where(Item.owner_id == owner_id)
+ )
+ count = cls.session.exec(count_statement).one()
+ statement = (
+ select(Item).where(Item.owner_id == owner_id).offset(skip).limit(limit)
+ )
+ items = cls.session.exec(statement).all()
+ return {"data": items, "count": count}
+
+ def get_by_id(cls, item_id: uuid.UUID) -> "Item | None":
+ return cls.session.get(Item, item_id)
+
+ def update(cls, item: "Item", item_in: ItemUpdate) -> "Item":
+ update_dict = item_in.model_dump(exclude_unset=True)
+ item.sqlmodel_update(update_dict)
+ cls.session.add(item)
+ cls.session.commit()
+ cls.session.refresh(item)
+ return item
+
+ def delete(cls, item_id: uuid.UUID) -> None:
+ item = cls.session.get(Item, item_id)
+ if item:
+ cls.session.delete(item)
+ cls.session.commit()
diff --git a/backend/app/model/user_model.py b/backend/app/model/user_model.py
new file mode 100644
index 0000000000..d48590ea51
--- /dev/null
+++ b/backend/app/model/user_model.py
@@ -0,0 +1,57 @@
+import uuid
+from typing import Any
+
+from sqlalchemy import func
+from sqlmodel import Session, select
+
+from app.core.security import get_password_hash
+from app.models import User, UserCreate, UserUpdate
+
+
+class UserModel:
+ def __init__(self, session: Session):
+ self.session = session
+
+ def create(cls, user_create: UserCreate) -> "User":
+ db_obj = User.model_validate(
+ user_create,
+ update={"hashed_password": get_password_hash(user_create.password)},
+ )
+ cls.session.add(db_obj)
+ cls.session.commit()
+ cls.session.refresh(db_obj)
+ return db_obj
+
+ def update(cls, db_user: "User", user_in: UserUpdate) -> Any:
+ user_data = user_in.model_dump(exclude_unset=True)
+ extra_data = {}
+ if "password" in user_data:
+ password = user_data["password"]
+ hashed_password = get_password_hash(password)
+ extra_data["hashed_password"] = hashed_password
+ db_user.sqlmodel_update(user_data, update=extra_data)
+ cls.session.add(db_user)
+ cls.session.commit()
+ cls.session.refresh(db_user)
+ return db_user
+
+ def get_by_email(cls, email: str) -> "User | None":
+ statement = select(cls.__class__).where(cls.__class__.email == email)
+ return cls.session.exec(statement).first()
+
+ def get_by_id(cls, user_id: str) -> "User | None":
+ statement = select(cls.__class__).where(cls.__class__.id == uuid.UUID(user_id))
+ return cls.session.exec(statement).first()
+
+ def get_users(cls, skip: int = 0, limit: int = 100) -> dict:
+ count_statement = select(func.count()).select_from(cls.__class__)
+ count = cls.session.exec(count_statement).one()
+ statement = select(cls.__class__).offset(skip).limit(limit)
+ users = cls.session.exec(statement).all()
+ return {"data": users, "count": count}
+
+ def delete_user(cls, user_id: str) -> None:
+ user = cls.get_by_id(user_id)
+ if user:
+ cls.session.delete(user)
+ cls.session.commit()
diff --git a/backend/app/service/__init__.py b/backend/app/service/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/backend/app/service/item_service.py b/backend/app/service/item_service.py
new file mode 100644
index 0000000000..eef43976b3
--- /dev/null
+++ b/backend/app/service/item_service.py
@@ -0,0 +1,62 @@
+import uuid
+from typing import Any
+
+from fastapi import HTTPException
+from sqlmodel import Session
+
+from app.models import Item, ItemCreate, ItemUpdate
+from app.models import Message
+
+class ItemService:
+ def __init__(self, session: Session):
+ self.session = session
+
+ def create_item(self, item_in: ItemCreate, owner_id: uuid.UUID) -> Item:
+ return Item.create(self.session, item_in, owner_id)
+
+ def read_items(
+ self, owner_id: uuid.UUID, is_superuser: bool, skip: int = 0, limit: int = 100
+ ) -> Any:
+ return Item.get_items(
+ self.session,
+ owner_id=owner_id,
+ is_superuser=is_superuser,
+ skip=skip,
+ limit=limit,
+ )
+
+
+ def read_item(
+ self, item_id: uuid.UUID, owner_id: uuid.UUID, is_superuser: bool
+ ) -> Any:
+ item = Item.get_by_id(self.session, item_id)
+ if not item:
+ raise HTTPException(status_code=404, detail="Item not found")
+ if not is_superuser and (item.owner_id != owner_id):
+ raise HTTPException(status_code=400, detail="Not enough permissions")
+ return item
+
+ def update_item(
+ self,
+ item_id: uuid.UUID,
+ item_in: ItemUpdate,
+ owner_id: uuid.UUID,
+ is_superuser: bool,
+ ) -> Any:
+ item = Item.get_by_id(self.session, item_id)
+ if not item:
+ raise HTTPException(status_code=404, detail="Item not found")
+ if not is_superuser and (item.owner_id != owner_id):
+ raise HTTPException(status_code=400, detail="Not enough permissions")
+ return Item.update(self.session, item, item_in)
+
+ def delete_item(
+ self, item_id: uuid.UUID, owner_id: uuid.UUID, is_superuser: bool
+ ) -> Message:
+ item = Item.get_by_id(self.session, item_id)
+ if not item:
+ raise HTTPException(status_code=404, detail="Item not found")
+ if not is_superuser and (item.owner_id != owner_id):
+ raise HTTPException(status_code=400, detail="Not enough permissions")
+ Item.delete(self.session, item_id)
+ return Message(message="Item deleted successfully")
\ No newline at end of file
diff --git a/backend/app/service/user_service.py b/backend/app/service/user_service.py
new file mode 100644
index 0000000000..f0a7289c6f
--- /dev/null
+++ b/backend/app/service/user_service.py
@@ -0,0 +1,57 @@
+import uuid
+from typing import Any
+
+from sqlalchemy import func
+from sqlmodel import Session, select
+
+from app.core.security import get_password_hash
+from app.models import User, UserCreate, UserUpdate
+
+
+class UserModel:
+ def __init__(self, session: Session):
+ self.session = session
+
+ def create(cls, user_create: UserCreate) -> "User":
+ db_obj = User.model_validate(
+ user_create,
+ update={"hashed_password": get_password_hash(user_create.password)},
+ )
+ cls.session.add(db_obj)
+ cls.session.commit()
+ cls.session.refresh(db_obj)
+ return db_obj
+
+ def update(cls, db_user: "User", user_in: UserUpdate) -> Any:
+ user_data = user_in.model_dump(exclude_unset=True)
+ extra_data = {}
+ if "password" in user_data:
+ password = user_data["password"]
+ hashed_password = get_password_hash(password)
+ extra_data["hashed_password"] = hashed_password
+ db_user.sqlmodel_update(user_data, update=extra_data)
+ cls.session.add(db_user)
+ cls.session.commit()
+ cls.session.refresh(db_user)
+ return db_user
+
+ def get_by_email(cls, email: str) -> "User | None":
+ statement = select(User).where(User.email == email)
+ return cls.session.exec(statement).first()
+
+ def get_by_id(cls, user_id: str) -> "User | None":
+ statement = select(User).where(User.id == uuid.UUID(user_id))
+ return cls.session.exec(statement).first()
+
+ def get_users(cls, skip: int = 0, limit: int = 100) -> dict:
+ count_statement = select(func.count()).select_from(User)
+ count = cls.session.exec(count_statement).one()
+ statement = select(User).offset(skip).limit(limit)
+ users = cls.session.exec(statement).all()
+ return {"data": users, "count": count}
+
+ def delete_user(cls, user_id: str) -> None:
+ user = cls.get_by_id(user_id)
+ if user:
+ cls.session.delete(user)
+ cls.session.commit()
diff --git a/backend/app/tests/api/routes/test_login.py b/backend/app/tests/api/routes/test_login.py
index 34fe8ee560..b1a0e7db07 100644
--- a/backend/app/tests/api/routes/test_login.py
+++ b/backend/app/tests/api/routes/test_login.py
@@ -5,7 +5,7 @@
from app.core.config import settings
from app.core.security import verify_password
-from app.models import User
+from backend.app.model.user_model import User
from app.utils import generate_password_reset_token
diff --git a/backend/app/tests/api/routes/test_private.py b/backend/app/tests/api/routes/test_private.py
index 1e1f985021..d3c05ce2a7 100644
--- a/backend/app/tests/api/routes/test_private.py
+++ b/backend/app/tests/api/routes/test_private.py
@@ -2,7 +2,7 @@
from sqlmodel import Session, select
from app.core.config import settings
-from app.models import User
+from backend.app.model.user_model import User
def test_create_user(client: TestClient, db: Session) -> None:
diff --git a/backend/app/tests/api/routes/test_users.py b/backend/app/tests/api/routes/test_users.py
index ba9be65426..7b8685e3ea 100644
--- a/backend/app/tests/api/routes/test_users.py
+++ b/backend/app/tests/api/routes/test_users.py
@@ -7,7 +7,7 @@
from app import crud
from app.core.config import settings
from app.core.security import verify_password
-from app.models import User, UserCreate
+from backend.app.model.user_model import User, UserCreate
from app.tests.utils.utils import random_email, random_lower_string
diff --git a/backend/app/tests/conftest.py b/backend/app/tests/conftest.py
index 90ab39a357..23287a2c5a 100644
--- a/backend/app/tests/conftest.py
+++ b/backend/app/tests/conftest.py
@@ -7,7 +7,8 @@
from app.core.config import settings
from app.core.db import engine, init_db
from app.main import app
-from app.models import Item, User
+from app.model.item_model import Item
+from app.model.user_model import User
from app.tests.utils.user import authentication_token_from_email
from app.tests.utils.utils import get_superuser_token_headers
diff --git a/backend/app/tests/crud/test_user.py b/backend/app/tests/crud/test_user.py
deleted file mode 100644
index e9eb4a0391..0000000000
--- a/backend/app/tests/crud/test_user.py
+++ /dev/null
@@ -1,91 +0,0 @@
-from fastapi.encoders import jsonable_encoder
-from sqlmodel import Session
-
-from app import crud
-from app.core.security import verify_password
-from app.models import User, UserCreate, UserUpdate
-from app.tests.utils.utils import random_email, random_lower_string
-
-
-def test_create_user(db: Session) -> None:
- email = random_email()
- password = random_lower_string()
- user_in = UserCreate(email=email, password=password)
- user = crud.create_user(session=db, user_create=user_in)
- assert user.email == email
- assert hasattr(user, "hashed_password")
-
-
-def test_authenticate_user(db: Session) -> None:
- email = random_email()
- password = random_lower_string()
- user_in = UserCreate(email=email, password=password)
- user = crud.create_user(session=db, user_create=user_in)
- authenticated_user = crud.authenticate(session=db, email=email, password=password)
- assert authenticated_user
- assert user.email == authenticated_user.email
-
-
-def test_not_authenticate_user(db: Session) -> None:
- email = random_email()
- password = random_lower_string()
- user = crud.authenticate(session=db, email=email, password=password)
- assert user is None
-
-
-def test_check_if_user_is_active(db: Session) -> None:
- email = random_email()
- password = random_lower_string()
- user_in = UserCreate(email=email, password=password)
- user = crud.create_user(session=db, user_create=user_in)
- assert user.is_active is True
-
-
-def test_check_if_user_is_active_inactive(db: Session) -> None:
- email = random_email()
- password = random_lower_string()
- user_in = UserCreate(email=email, password=password, disabled=True)
- user = crud.create_user(session=db, user_create=user_in)
- assert user.is_active
-
-
-def test_check_if_user_is_superuser(db: Session) -> None:
- email = random_email()
- password = random_lower_string()
- user_in = UserCreate(email=email, password=password, is_superuser=True)
- user = crud.create_user(session=db, user_create=user_in)
- assert user.is_superuser is True
-
-
-def test_check_if_user_is_superuser_normal_user(db: Session) -> None:
- username = random_email()
- password = random_lower_string()
- user_in = UserCreate(email=username, password=password)
- user = crud.create_user(session=db, user_create=user_in)
- assert user.is_superuser is False
-
-
-def test_get_user(db: Session) -> None:
- password = random_lower_string()
- username = random_email()
- user_in = UserCreate(email=username, password=password, is_superuser=True)
- user = crud.create_user(session=db, user_create=user_in)
- user_2 = db.get(User, user.id)
- assert user_2
- assert user.email == user_2.email
- assert jsonable_encoder(user) == jsonable_encoder(user_2)
-
-
-def test_update_user(db: Session) -> None:
- password = random_lower_string()
- email = random_email()
- user_in = UserCreate(email=email, password=password, is_superuser=True)
- user = crud.create_user(session=db, user_create=user_in)
- new_password = random_lower_string()
- user_in_update = UserUpdate(password=new_password, is_superuser=True)
- if user.id is not None:
- crud.update_user(session=db, db_user=user, user_in=user_in_update)
- user_2 = db.get(User, user.id)
- assert user_2
- assert user.email == user_2.email
- assert verify_password(new_password, user_2.hashed_password)
diff --git a/backend/app/tests/utils/item.py b/backend/app/tests/utils/item.py
index 6e32b3a84a..bb500fb6d7 100644
--- a/backend/app/tests/utils/item.py
+++ b/backend/app/tests/utils/item.py
@@ -1,7 +1,7 @@
from sqlmodel import Session
-from app import crud
-from app.models import Item, ItemCreate
+from app.service.item_service import ItemService
+from app.model.item_model import Item, ItemCreate
from app.tests.utils.user import create_random_user
from app.tests.utils.utils import random_lower_string
@@ -13,4 +13,6 @@ def create_random_item(db: Session) -> Item:
title = random_lower_string()
description = random_lower_string()
item_in = ItemCreate(title=title, description=description)
- return crud.create_item(session=db, item_in=item_in, owner_id=owner_id)
+ item_service = ItemService(db)
+ item = item_service.create_item(item_in, owner_id)
+ return item
diff --git a/backend/app/tests/utils/user.py b/backend/app/tests/utils/user.py
index 9c1b073109..3441bba108 100644
--- a/backend/app/tests/utils/user.py
+++ b/backend/app/tests/utils/user.py
@@ -1,9 +1,10 @@
from fastapi.testclient import TestClient
from sqlmodel import Session
-from app import crud
+
from app.core.config import settings
-from app.models import User, UserCreate, UserUpdate
+from backend.app.model.user_model import User, UserCreate, UserUpdate
+from app.service.user_service import UserService
from app.tests.utils.utils import random_email, random_lower_string
@@ -23,7 +24,8 @@ def create_random_user(db: Session) -> User:
email = random_email()
password = random_lower_string()
user_in = UserCreate(email=email, password=password)
- user = crud.create_user(session=db, user_create=user_in)
+ user_service = UserService(db)
+ user = user_service.create_user(user_in)
return user
@@ -36,14 +38,15 @@ def authentication_token_from_email(
If the user doesn't exist it is created first.
"""
password = random_lower_string()
- user = crud.get_user_by_email(session=db, email=email)
+ user_service = UserService(db)
+ user = user_service.get_user_by_email(email=email)
if not user:
user_in_create = UserCreate(email=email, password=password)
- user = crud.create_user(session=db, user_create=user_in_create)
+ user = user_service.create_user(user_in_create)
else:
user_in_update = UserUpdate(password=password)
if not user.id:
raise Exception("User id not set")
- user = crud.update_user(session=db, db_user=user, user_in=user_in_update)
-
+ user_service = UserService(db)
+ user = user_service.update_user(user, user_in_update)
return user_authentication_headers(client=client, email=email, password=password)
diff --git a/backend/pyproject.toml b/backend/pyproject.toml
index 1c77b83ded..eb61c58628 100644
--- a/backend/pyproject.toml
+++ b/backend/pyproject.toml
@@ -14,12 +14,12 @@ dependencies = [
"jinja2<4.0.0,>=3.1.4",
"alembic<2.0.0,>=1.12.1",
"httpx<1.0.0,>=0.25.1",
- "psycopg[binary]<4.0.0,>=3.1.13",
+ "pymysql[binary]<2.0.0,>=1.1.1",
"sqlmodel<1.0.0,>=0.0.21",
# Pin bcrypt until passlib supports the latest
"bcrypt==4.0.1",
"pydantic-settings<3.0.0,>=2.2.1",
- "sentry-sdk[fastapi]<2.0.0,>=1.40.6",
+ "sentry-sdk[fastapi]>=1.40.6,<2.0.0",
"pyjwt<3.0.0,>=2.8.0",
]
diff --git a/backend/uv.lock b/backend/uv.lock
index cfc200d3c3..c759be607d 100644
--- a/backend/uv.lock
+++ b/backend/uv.lock
@@ -56,10 +56,10 @@ dependencies = [
{ name = "httpx" },
{ name = "jinja2" },
{ name = "passlib", extra = ["bcrypt"] },
- { name = "psycopg", extra = ["binary"] },
{ name = "pydantic" },
{ name = "pydantic-settings" },
{ name = "pyjwt" },
+ { name = "pymysql" },
{ name = "python-multipart" },
{ name = "sentry-sdk", extra = ["fastapi"] },
{ name = "sqlmodel" },
@@ -86,10 +86,10 @@ requires-dist = [
{ name = "httpx", specifier = ">=0.25.1,<1.0.0" },
{ name = "jinja2", specifier = ">=3.1.4,<4.0.0" },
{ name = "passlib", extras = ["bcrypt"], specifier = ">=1.7.4,<2.0.0" },
- { name = "psycopg", extras = ["binary"], specifier = ">=3.1.13,<4.0.0" },
{ name = "pydantic", specifier = ">2.0" },
{ name = "pydantic-settings", specifier = ">=2.2.1,<3.0.0" },
{ name = "pyjwt", specifier = ">=2.8.0,<3.0.0" },
+ { name = "pymysql", extras = ["binary"], specifier = ">=1.1.1,<2.0.0" },
{ name = "python-multipart", specifier = ">=0.0.7,<1.0.0" },
{ name = "sentry-sdk", extras = ["fastapi"], specifier = ">=1.40.6,<2.0.0" },
{ name = "sqlmodel", specifier = ">=0.0.21,<1.0.0" },
@@ -220,7 +220,7 @@ name = "click"
version = "8.1.7"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "colorama", marker = "platform_system == 'Windows'" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 }
wheels = [
@@ -863,75 +863,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b1/07/4e8d94f94c7d41ca5ddf8a9695ad87b888104e2fd41a35546c1dc9ca74ac/premailer-3.10.0-py2.py3-none-any.whl", hash = "sha256:021b8196364d7df96d04f9ade51b794d0b77bcc19e998321c515633a2273be1a", size = 19544 },
]
-[[package]]
-name = "psycopg"
-version = "3.2.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "typing-extensions", marker = "python_full_version < '3.13'" },
- { name = "tzdata", marker = "sys_platform == 'win32'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/fe/70/d1e4c251be6e0752cbc7408f0556f8f922690837309442b9019122295712/psycopg-3.2.2.tar.gz", hash = "sha256:8bad2e497ce22d556dac1464738cb948f8d6bab450d965cf1d8a8effd52412e0", size = 155483 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/3f/89/e63ec25b80290c4a923cdb5ecd5dbc85e310f93fb84b7f294006c9269d95/psycopg-3.2.2-py3-none-any.whl", hash = "sha256:babf565d459d8f72fb65da5e211dd0b58a52c51e4e1fa9cadecff42d6b7619b2", size = 197852 },
-]
-
-[package.optional-dependencies]
-binary = [
- { name = "psycopg-binary", marker = "implementation_name != 'pypy'" },
-]
-
-[[package]]
-name = "psycopg-binary"
-version = "3.2.2"
-source = { registry = "https://pypi.org/simple" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/01/42/f5a181d07c0ae5c8091449fda45d562d3b0861c127b94d7009eaea45c61f/psycopg_binary-3.2.2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:8eacbf58d4f8d7bc82e0a60476afa2622b5a58f639a3cc2710e3e37b72aff3cb", size = 3381668 },
- { url = "https://files.pythonhosted.org/packages/ce/fb/66d2e3e5d550ba3b9d33e30bf6d5beb871a85eb95553c851fce7f09f8a1e/psycopg_binary-3.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:d07e62476ee8c54853b2b8cfdf3858a574218103b4cd213211f64326c7812437", size = 3502272 },
- { url = "https://files.pythonhosted.org/packages/f0/8d/758da39eca57f046ee712ad4c310840bcc08d889042d1b297cd28c78e909/psycopg_binary-3.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c22e615ee0ecfc6687bb8a39a4ed9d6bac030b5e72ac15e7324fd6e48979af71", size = 4467251 },
- { url = "https://files.pythonhosted.org/packages/91/bb/1abb1ccc318eb878acf9637479334de7406529516126e4af48b16dd85426/psycopg_binary-3.2.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec29c7ec136263628e3f09a53e51d0a4b1ad765a6e45135707bfa848b39113f9", size = 4268614 },
- { url = "https://files.pythonhosted.org/packages/f5/1a/14b4ae68f1c7cfba543883987d2f134eca31b0983bb684a52e0f51f3ac21/psycopg_binary-3.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:035753f80cbbf6aceca6386f53e139df70c7aca057b0592711047b5a8cfef8bb", size = 4512352 },
- { url = "https://files.pythonhosted.org/packages/12/44/53df01c7c7cffb351cafa88c58692fab0ab962edd89f22974cbfc38b6677/psycopg_binary-3.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9ee99336151ff7c30682f2ef9cb1174d235bc1471322faabba97f9db1398167", size = 4212477 },
- { url = "https://files.pythonhosted.org/packages/b7/31/c918927692fc5a9c4db0a7c454e1595e9d40378d5c526d26505f310e4068/psycopg_binary-3.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a60674dff4a4194e88312b463fb84ac80924c2b9e25d0e0460f3176bf1af4a6b", size = 3137907 },
- { url = "https://files.pythonhosted.org/packages/cb/65/538aa057b3e8245a31ea8baac93df9947ee1b2ebf4c02014a556cddd875e/psycopg_binary-3.2.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3c701507a49340de422d77a6ce95918a0019990bbf27daec35aa40050c6eadb6", size = 3113363 },
- { url = "https://files.pythonhosted.org/packages/dc/81/eaee4f05bcba19984615e90319c429d125d07e5f0fe8c8ec3025901de4df/psycopg_binary-3.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1b3c5a04eaf8866e399315cff2e810260cce10b797437a9f49fd71b5f4b94d0a", size = 3220512 },
- { url = "https://files.pythonhosted.org/packages/48/cc/1d0f82a47216f925e36be6f6d7be61984a5168ff8c0496c57f468cc0e219/psycopg_binary-3.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0ad9c09de4c262f516ae6891d042a4325649b18efa39dd82bbe0f7bc95c37bfb", size = 3255023 },
- { url = "https://files.pythonhosted.org/packages/d0/29/c45760ba6218eae37474aa5f46c1f55b290a6d4b86c0c59e60fa5613257a/psycopg_binary-3.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:bf1d3582185cb43ecc27403bee2f5405b7a45ccaab46c8508d9a9327341574fc", size = 2921688 },
- { url = "https://files.pythonhosted.org/packages/1f/1a/76299ad86a01f57a67961c4a45ce06c6eb8e76b8bc7bfb92548c62a6fa72/psycopg_binary-3.2.2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:554d208757129d34fa47b7c890f9ef922f754e99c6b089cb3a209aa0fe282682", size = 3390336 },
- { url = "https://files.pythonhosted.org/packages/c2/1d/04fbcadd568eb0ee04b0d99286fe4ffd6c76c9cdd130e58d477617b77941/psycopg_binary-3.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:71dc3cc10d1fd7d26a3079d0a5b4a8e8ad0d7b89a702ceb7605a52e4395be122", size = 3507406 },
- { url = "https://files.pythonhosted.org/packages/60/00/094a437f68d83fef4dd139630dfb0e060fcf2a7ac68fffdb63b2f3eaa43a/psycopg_binary-3.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86f578d63f2e1fdf87c9adaed4ff23d7919bda8791cf1380fa4cf3a857ccb8b", size = 4463745 },
- { url = "https://files.pythonhosted.org/packages/ea/de/0303e807a33251dec41aec709c3041b9ffd86b67d997088c504a24e90ba3/psycopg_binary-3.2.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a4eb737682c02a602a12aa85a492608066f77793dab681b1c4e885fedc160b1", size = 4263212 },
- { url = "https://files.pythonhosted.org/packages/3f/0d/8fa059bd936bb8e95164cc549d2eaaeaeb7df3a069bbb0ea01b48fab10a4/psycopg_binary-3.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e120a576e74e4e612c48f4b021e322e320ca102534d78a0ca4db2ffd058ae8d", size = 4513242 },
- { url = "https://files.pythonhosted.org/packages/1f/a5/9904c4ae040eef6cdb81c04e43b834302cfd3e47ee7cab8878d114abb168/psycopg_binary-3.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:849d518e7d4c6186e1e48ea2ac2671912edf7e732fffe6f01dfed61cf0245de4", size = 4207852 },
- { url = "https://files.pythonhosted.org/packages/07/b7/24438b2ecb3ae8ceea44cf6e2bb92baac6be9b3d92c2940c89b3aa8e520e/psycopg_binary-3.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ee2b19152bcec8f356f989c31768702be5f139b4d51094273c4a9ddc8c55380", size = 3134053 },
- { url = "https://files.pythonhosted.org/packages/83/e3/d0157858ad814cdc6cf9f9b7543c736f6b56ab9d8dc1b4ca56908ec03586/psycopg_binary-3.2.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:00273dd011892e8216fcef76b42f775ddaa6348664a7fffae2a27c9557f45bfa", size = 3110817 },
- { url = "https://files.pythonhosted.org/packages/9f/fc/8554c822a80a08cd17b9e2a4e8fc098c940e972e01bc9e3f3774b9e02d54/psycopg_binary-3.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4bcb489615d7e56d1de42937e6a0fc13f766505729afdb54c2947a52db295220", size = 3214760 },
- { url = "https://files.pythonhosted.org/packages/6a/4d/a12d8a301fbd4416ebdb3f019c777a17edea0452278f630f83237cbcc3d4/psycopg_binary-3.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:06963f88916a177df95aaed27101af0989ba206654743b1a0e050b9d8e734686", size = 3253951 },
- { url = "https://files.pythonhosted.org/packages/09/0f/120b190ddaf6afed1eaa2fbc89e29ec810d8af44ff3599521f69f89b64b3/psycopg_binary-3.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed1ad836a0c21890c7f84e73c7ef1ed0950e0e4b0d8e49b609b6fd9c13f2ca21", size = 2924949 },
- { url = "https://files.pythonhosted.org/packages/1e/9a/68b76a795fe620c8848c758d12860b8b94998f374882dbf8ea4bc343b9e1/psycopg_binary-3.2.2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:0dd314229885a81f9497875295d8788e651b78945627540f1e78ed71595e614a", size = 3361334 },
- { url = "https://files.pythonhosted.org/packages/0d/0c/f91242672c58bce7c290e11128569fe66ed27552388499cd80d75a5d4d0d/psycopg_binary-3.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:989acbe2f552769cdb780346cea32d86e7c117044238d5172ac10b025fe47194", size = 3504380 },
- { url = "https://files.pythonhosted.org/packages/e4/45/5fa47240357dea3646f3492d20141a5869cfaedcd5c64499622db7b17a8f/psycopg_binary-3.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:566b1c530898590f0ac9d949cf94351c08d73c89f8800c74c0a63ffd89a383c8", size = 4443783 },
- { url = "https://files.pythonhosted.org/packages/ee/e5/9da098d1f7c1b064b39a2499cb4dfebe8fa5a48a132c3f544dab994199c4/psycopg_binary-3.2.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68d03efab7e2830a0df3aa4c29a708930e3f6b9fd98774ff9c4fd1f33deafecc", size = 4247070 },
- { url = "https://files.pythonhosted.org/packages/ba/44/c905a0ce2c66c0250a4ddce8eef41edc728bd2055ecaf8bd23468110c3f4/psycopg_binary-3.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e1f013bfb744023df23750fde51edcb606def8328473361db3c192c392c6060", size = 4483735 },
- { url = "https://files.pythonhosted.org/packages/30/2d/9f6bfcff78b643d220e088d91103fde70d193b9745d8999c7654ad45cd65/psycopg_binary-3.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a06136aab55a2de7dd4e2555badae276846827cfb023e6ba1b22f7a7b88e3f1b", size = 4186284 },
- { url = "https://files.pythonhosted.org/packages/44/48/79e7886a28818fdb4d5d39a86b5769bb33681ac23efe23accdaab42514c6/psycopg_binary-3.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:020c5154be144a1440cf87eae012b9004fb414ae4b9e7b1b9fb808fe39e96e83", size = 3110593 },
- { url = "https://files.pythonhosted.org/packages/5c/93/83d5610d259feb1d4d2d37cc0e1781f0d1632c885f5e2f85808b5b196552/psycopg_binary-3.2.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ef341c556aeaa43a2729b07b04e20bfffdcf3d96c4a96e728ca94fe4ce632d8c", size = 3095074 },
- { url = "https://files.pythonhosted.org/packages/b6/94/3126db7a06fa9fe2ab3b1d6dd7a4add6bc1596b6864e01a77239702827b4/psycopg_binary-3.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66de2dd7d37bf66eb234ca9d907f5cd8caca43ff8d8a50dd5c15844d1cf0390c", size = 3184181 },
- { url = "https://files.pythonhosted.org/packages/6c/0e/6cce5ffaa25a25ede5ff08e757232bb425cacafe622627f29d286774073b/psycopg_binary-3.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2eb6f8f410dbbb71b8c633f283b8588b63bee0a7321f00ab76e9c800c593f732", size = 3229942 },
- { url = "https://files.pythonhosted.org/packages/10/31/951247b07205711115307f36ec3dbf6726101e086562febf6f989cbd6b95/psycopg_binary-3.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:b45553c6b614d02e1486585980afdfd18f0000aac668e2e87c6e32da1adb051a", size = 2912528 },
- { url = "https://files.pythonhosted.org/packages/87/e5/245f749abdfc33b42ec2bc4d89fe2cdb29cd40dca7156d0e09308c33f933/psycopg_binary-3.2.2-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:1ee891287c2da57e7fee31fbe2fbcdf57125768133d811b02e9523d5a052eb28", size = 3358682 },
- { url = "https://files.pythonhosted.org/packages/93/dc/047a90e2bfd80a8414f5a203c7ff1747e3b3f43231c3c8059e8be91849cc/psycopg_binary-3.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5e95e4a8076ac7611e571623e1113fa84fd48c0459601969ffbf534d7aa236e7", size = 3500354 },
- { url = "https://files.pythonhosted.org/packages/df/72/b905dec41c30a8aad21f7767b21d3e5d3b9a7e92c1844678e4083d79257b/psycopg_binary-3.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6269d79a3d7d76b6fcf0fafae8444da00e83777a6c68c43851351a571ad37155", size = 4445322 },
- { url = "https://files.pythonhosted.org/packages/aa/41/aef11d4cda1af4a8181fbd578af39d6920232624fc6222f6b2f9758cc0e0/psycopg_binary-3.2.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6dd5d21a298c3c53af20ced8da4ae4cd038c6fe88c80842a8888fa3660b2094", size = 4248626 },
- { url = "https://files.pythonhosted.org/packages/6c/75/39ed8598f44188e4985f31f2639aa9894851fdfbf061bf926744b08b5790/psycopg_binary-3.2.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cf64e41e238620f05aad862f06bc8424f8f320d8075f1499bd85a225d18bd57", size = 4485767 },
- { url = "https://files.pythonhosted.org/packages/00/5a/ecdc4cf957d0658f77cc6fa61f6ee2e5118c914e5f93497375023389a1e5/psycopg_binary-3.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c482c3236ded54add31136a91d5223b233ec301f297fa2db79747404222dca6", size = 4188840 },
- { url = "https://files.pythonhosted.org/packages/2d/71/af4c47a665d13d2477085f77fb64195da5d6463dd54fc3a8bdfd5c082d24/psycopg_binary-3.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0718be095cefdad712542169d16fa58b3bd9200a3de1b0217ae761cdec1cf569", size = 3114998 },
- { url = "https://files.pythonhosted.org/packages/38/8f/6d56168d2ce7e7d802e09a4288faceb52f28bd4023cde72ede9e848c9f9b/psycopg_binary-3.2.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fb303b03c243a9041e1873b596e246f7caaf01710b312fafa65b1db5cd77dd6f", size = 3095882 },
- { url = "https://files.pythonhosted.org/packages/8b/76/c77643d97292673d8a5e3eea643812d585993155658f840c86bfa855e077/psycopg_binary-3.2.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:705da5bc4364bd7529473225fca02b795653bc5bd824dbe43e1df0b1a40fe691", size = 3189435 },
- { url = "https://files.pythonhosted.org/packages/30/31/b4ea793bdf44acca51e3fa6f68cc80d03725e8ef87fc2ee2b332c49fa521/psycopg_binary-3.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:05406b96139912574571b1c56bb023839a9146cf4b57c4548f36251dd5909fa1", size = 3233951 },
- { url = "https://files.pythonhosted.org/packages/49/e3/633d6d05e40651acb30458e296c90e878fa4caf3b3c21bb9e6adc912b811/psycopg_binary-3.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:7c357cf87e8d7612cfe781225be7669f35038a765d1b53ec9605f6c5aef9ee85", size = 2913412 },
-]
-
[[package]]
name = "pydantic"
version = "2.9.2"
@@ -1044,6 +975,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850", size = 22344 },
]
+[[package]]
+name = "pymysql"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/ce59b5e5ed4ce8512f879ff1fa5ab699d211ae2495f1adaa5fbba2a1eada/pymysql-1.1.1.tar.gz", hash = "sha256:e127611aaf2b417403c60bf4dc570124aeb4a57f5f37b8e95ae399a42f904cd0", size = 47678 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0c/94/e4181a1f6286f545507528c78016e00065ea913276888db2262507693ce5/PyMySQL-1.1.1-py3-none-any.whl", hash = "sha256:4de15da4c61dc132f4fb9ab763063e693d521a80fd0e87943b9a453dd4c19d6c", size = 44972 },
+]
+
[[package]]
name = "pytest"
version = "7.4.4"
@@ -1346,15 +1286,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
]
-[[package]]
-name = "tzdata"
-version = "2024.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/74/5b/e025d02cb3b66b7b76093404392d4b44343c69101cc85f4d180dd5784717/tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", size = 190559 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/65/58/f9c9e6be752e9fcb8b6a0ee9fb87e6e7a1f6bcab2cdc73f02bb7ba91ada0/tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252", size = 345370 },
-]
-
[[package]]
name = "urllib3"
version = "2.2.3"
diff --git a/td_fronted/.editorconfig b/td_fronted/.editorconfig
new file mode 100644
index 0000000000..4fc13c7e08
--- /dev/null
+++ b/td_fronted/.editorconfig
@@ -0,0 +1,14 @@
+root = true
+
+[*]
+indent_style = space
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.{ts,js,vue,css}]
+indent_size = 2
diff --git a/td_fronted/.env b/td_fronted/.env
new file mode 100644
index 0000000000..2dd71fd488
--- /dev/null
+++ b/td_fronted/.env
@@ -0,0 +1,5 @@
+# 打包路径 根据项目不同按需配置
+VITE_BASE_URL = /
+VITE_IS_REQUEST_PROXY = true
+VITE_API_URL = https://service-bv448zsw-1257786608.gz.apigw.tencentcs.com
+VITE_API_URL_PREFIX = /api
\ No newline at end of file
diff --git a/td_fronted/.env.development b/td_fronted/.env.development
new file mode 100644
index 0000000000..d475e5c726
--- /dev/null
+++ b/td_fronted/.env.development
@@ -0,0 +1,5 @@
+# 打包路径
+VITE_BASE_URL = /
+VITE_IS_REQUEST_PROXY = true
+VITE_API_URL = https://service-exndqyuk-1257786608.gz.apigw.tencentcs.com
+VITE_API_URL_PREFIX = /api
\ No newline at end of file
diff --git a/td_fronted/.env.site b/td_fronted/.env.site
new file mode 100644
index 0000000000..7e1e855f22
--- /dev/null
+++ b/td_fronted/.env.site
@@ -0,0 +1,5 @@
+# 打包路径 根据项目不同按需配置
+VITE_BASE_URL = https://static.tdesign.tencent.com/starter/vue-next/
+VITE_IS_REQUEST_PROXY = true
+VITE_API_URL = https://service-bv448zsw-1257786608.gz.apigw.tencentcs.com
+VITE_API_URL_PREFIX = /api
\ No newline at end of file
diff --git a/td_fronted/.env.test b/td_fronted/.env.test
new file mode 100644
index 0000000000..d278ac28eb
--- /dev/null
+++ b/td_fronted/.env.test
@@ -0,0 +1,5 @@
+# 打包路径 根据项目不同按需配置
+VITE_BASE_URL = /
+VITE_IS_REQUEST_PROXY = true
+VITE_API_URL = https://service-exndqyuk-1257786608.gz.apigw.tencentcs.com
+VITE_API_URL_PREFIX = /api
\ No newline at end of file
diff --git a/td_fronted/.eslintignore b/td_fronted/.eslintignore
new file mode 100644
index 0000000000..66eb01a133
--- /dev/null
+++ b/td_fronted/.eslintignore
@@ -0,0 +1,14 @@
+snapshot*
+dist
+lib
+es
+esm
+node_modules
+src/_common
+static
+cypress
+script/test/cypress
+_site
+temp*
+static/
+!.prettierrc.js
\ No newline at end of file
diff --git a/td_fronted/.eslintrc b/td_fronted/.eslintrc
new file mode 100644
index 0000000000..0ebc597928
--- /dev/null
+++ b/td_fronted/.eslintrc
@@ -0,0 +1,112 @@
+{
+ "extends": [
+ "plugin:@typescript-eslint/recommended",
+ "eslint-config-airbnb-base",
+ "@vue/typescript/recommended",
+ "plugin:vue/vue3-recommended",
+ "plugin:vue-scoped-css/base",
+ "plugin:prettier/recommended"
+ ],
+ "env": {
+ "browser": true,
+ "node": true,
+ "jest": true,
+ "es6": true
+ },
+ "globals": {
+ "defineProps": "readonly",
+ "defineEmits": "readonly"
+ },
+ "plugins": ["vue", "@typescript-eslint", "simple-import-sort"],
+ "parserOptions": {
+ "parser": "@typescript-eslint/parser",
+ "sourceType": "module",
+ "allowImportExportEverywhere": true,
+ "ecmaFeatures": {
+ "jsx": true
+ }
+ },
+ "settings": {
+ "import/extensions": [".js", ".jsx", ".ts", ".tsx"]
+ },
+ "rules": {
+ "no-console": "off",
+ "no-continue": "off",
+ "no-restricted-syntax": "off",
+ "no-plusplus": "off",
+ "no-param-reassign": "off",
+ "no-shadow": "off",
+ "guard-for-in": "off",
+
+ "import/extensions": "off",
+ "import/no-unresolved": "off",
+ "import/no-extraneous-dependencies": "off",
+ "import/prefer-default-export": "off",
+ "import/first": "off", // https://github.com/vuejs/vue-eslint-parser/issues/58
+ "@typescript-eslint/no-explicit-any": "off",
+ "@typescript-eslint/explicit-module-boundary-types": "off",
+ "vue/first-attribute-linebreak": 0,
+
+
+ "@typescript-eslint/no-unused-vars": [
+ "error",
+ {
+ "argsIgnorePattern": "^_",
+ "varsIgnorePattern": "^_"
+ }
+ ],
+ "no-unused-vars": [
+ "error",
+ {
+ "argsIgnorePattern": "^_",
+ "varsIgnorePattern": "^_"
+ }
+ ],
+ "no-use-before-define": "off",
+ "@typescript-eslint/no-use-before-define": "off",
+ "@typescript-eslint/ban-ts-comment": "off",
+ "@typescript-eslint/ban-types": "off",
+ "class-methods-use-this": "off", // 因为AxiosCancel必须实例化而能静态化所以加的规则,如果有办法解决可以取消
+ "simple-import-sort/imports": "error",
+ "simple-import-sort/exports": "error"
+ },
+ "overrides": [
+ {
+ "files": ["*.vue"],
+ "rules": {
+ "vue/component-name-in-template-casing": [2, "kebab-case"],
+ "vue/require-default-prop": 0,
+ "vue/multi-word-component-names": 0,
+ "vue/no-reserved-props": 0,
+ "vue/no-v-html": 0,
+ "vue-scoped-css/enforce-style-type": ["error", { "allows": ["scoped"] }]
+ }
+ },
+ {
+ "files": ["*.ts", "*.tsx"], // https://github.com/typescript-eslint eslint-recommended
+ "rules": {
+ "constructor-super": "off", // ts(2335) & ts(2377)
+ "getter-return": "off", // ts(2378)
+ "no-const-assign": "off", // ts(2588)
+ "no-dupe-args": "off", // ts(2300)
+ "no-dupe-class-members": "off", // ts(2393) & ts(2300)
+ "no-dupe-keys": "off", // ts(1117)
+ "no-func-assign": "off", // ts(2539)
+ "no-import-assign": "off", // ts(2539) & ts(2540)
+ "no-new-symbol": "off", // ts(2588)
+ "no-obj-calls": "off", // ts(2349)
+ "no-redeclare": "off", // ts(2451)
+ "no-setter-return": "off", // ts(2408)
+ "no-this-before-super": "off", // ts(2376)
+ "no-undef": "off", // ts(2304)
+ "no-unreachable": "off", // ts(7027)
+ "no-unsafe-negation": "off", // ts(2365) & ts(2360) & ts(2358)
+ "no-var": "error", // ts transpiles let/const to var, so no need for vars any more
+ "prefer-const": "error", // ts provides better types with const
+ "prefer-rest-params": "error", // ts provides better types with rest args over arguments
+ "prefer-spread": "error", // ts transpiles spread to apply, so no need for manual apply
+ "valid-typeof": "off" // ts(2367)
+ }
+ }
+ ]
+}
diff --git a/td_fronted/.gitattributes b/td_fronted/.gitattributes
new file mode 100644
index 0000000000..326caacd7e
--- /dev/null
+++ b/td_fronted/.gitattributes
@@ -0,0 +1,6 @@
+*.ts text eol=lf
+*.vue text eol=lf
+*.tsx text eol=lf
+*.jsx text eol=lf
+*.html text eol=lf
+*.json text eol=lf
\ No newline at end of file
diff --git a/td_fronted/.gitignore b/td_fronted/.gitignore
new file mode 100755
index 0000000000..e31ba2c999
--- /dev/null
+++ b/td_fronted/.gitignore
@@ -0,0 +1,37 @@
+# OS specific files
+.DS_Store
+
+# dependencies manager
+node_modules/
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/sdks
+!.yarn/versions
+
+# build files
+es/
+lib/
+dist/
+typings/
+
+_site
+package
+tmp*
+temp*
+coverage
+test-report.html
+.idea/
+yarn-error.log
+*.zip
+.history
+.stylelintcache
+
+.env.local
+.env.*.local
+
+# lock文件 请根据自身项目或团队需求选择具体的包管理工具 并移除具体的ignore的lock文件
+yarn.lock
+pnpm-lock.yaml
diff --git a/td_fronted/.npmrc b/td_fronted/.npmrc
new file mode 100644
index 0000000000..d43847c547
--- /dev/null
+++ b/td_fronted/.npmrc
@@ -0,0 +1,3 @@
+shamefully-hoist = true
+hoist = true
+engine-strict =true
diff --git a/td_fronted/.prettierrc.js b/td_fronted/.prettierrc.js
new file mode 100644
index 0000000000..22227fe412
--- /dev/null
+++ b/td_fronted/.prettierrc.js
@@ -0,0 +1,39 @@
+export default {
+ // 一行最多 120 字符..
+ printWidth: 120,
+ // 使用 2 个空格缩进
+ tabWidth: 2,
+ // 不使用缩进符,而使用空格
+ useTabs: false,
+ // 行尾需要有分号
+ semi: true,
+ // 使用单引号
+ singleQuote: true,
+ // 对象的 key 仅在必要时用引号
+ quoteProps: 'as-needed',
+ // jsx 不使用单引号,而使用双引号
+ jsxSingleQuote: false,
+ // 末尾需要有逗号
+ trailingComma: 'all',
+ // 大括号内的首尾需要空格
+ bracketSpacing: true,
+ // jsx 标签的反尖括号需要换行
+ jsxBracketSameLine: false,
+ // 箭头函数,只有一个参数的时候,也需要括号
+ arrowParens: 'always',
+ // 每个文件格式化的范围是文件的全部内容
+ rangeStart: 0,
+ rangeEnd: Infinity,
+ // 不需要写文件开头的 @prettier
+ requirePragma: false,
+ // 不需要自动在文件开头插入 @prettier
+ insertPragma: false,
+ // 使用默认的折行标准
+ proseWrap: 'preserve',
+ // 根据显示样式决定 html 要不要折行
+ htmlWhitespaceSensitivity: 'css',
+ // vue 文件中的 script 和 style 内不用缩进
+ vueIndentScriptAndStyle: false,
+ // 换行符使用 lf
+ endOfLine: 'lf',
+};
diff --git a/td_fronted/.stylelintignore b/td_fronted/.stylelintignore
new file mode 100644
index 0000000000..1b7da3c984
--- /dev/null
+++ b/td_fronted/.stylelintignore
@@ -0,0 +1,8 @@
+# .stylelintignore
+# 旧的不需打包的样式库
+*.min.css
+
+# 其他类型文件
+*.js
+*.jpg
+*.woff
diff --git a/td_fronted/.yarnrc.yml b/td_fronted/.yarnrc.yml
new file mode 100644
index 0000000000..3186f3f079
--- /dev/null
+++ b/td_fronted/.yarnrc.yml
@@ -0,0 +1 @@
+nodeLinker: node-modules
diff --git a/td_fronted/CHANGELOG.md b/td_fronted/CHANGELOG.md
new file mode 100644
index 0000000000..e499d14c70
--- /dev/null
+++ b/td_fronted/CHANGELOG.md
@@ -0,0 +1,361 @@
+---
+title: 更新日志
+spline: explain
+toc: false
+docClass: timeline
+---
+
+## 🌈 0.12.0 `2025-01-06`
+### 🐞 Bug Fixes
+- `Vue`: 修复升级至 Vue 3.4 及 3.5 的生产模式下的问题 @uyarn ([#796](https://github.com/Tencent/tdesign-vue-next-starter/pull/796))
+### 📈 Performance
+- defineProps改为Vue3.5解构语法 @liect ([#799](https://github.com/Tencent/tdesign-vue-next-starter/pull/799))
+
+## 🌈 0.11.0 `2024-11-06`
+### 🚀 Features
+- `feat`: 调整默认lock文件配置 @timi137137 ([#717](https://github.com/Tencent/tdesign-vue-next-starter/pull/717))
+- `Router`: 路由跳转携带参数 @SuxueCode ([#720](https://github.com/Tencent/tdesign-vue-next-starter/pull/720))
+- `feat`: 新增菜单自动折叠 @RSS1102 ([#744](https://github.com/Tencent/tdesign-vue-next-starter/pull/744))
+### 🐞 Bug Fixes
+- `breadcrumb`: 修复多层级路由指向错误 @lz6060788 ([#749](https://github.com/Tencent/tdesign-vue-next-starter/pull/749))
+- `deps`: 修正因锁文件错误导致的编译失败 @timi137137 ([#777](https://github.com/Tencent/tdesign-vue-next-starter/pull/777))
+### 🚧 Others
+- `revert`: 回退Vue 3.3 @timi137137 ([#709](https://github.com/Tencent/tdesign-vue-next-starter/pull/709))
+- build(deps-dev): bump @types/lodash from 4.14.202 to 4.17.6 @dependabot[bot] ([#732](https://github.com/Tencent/tdesign-vue-next-starter/pull/732))
+- build(deps): bump tdesign-vue-next from 1.9.3 to 1.9.9 @dependabot[bot] ([#748](https://github.com/Tencent/tdesign-vue-next-starter/pull/748))
+
+## 🌈 0.10.0 `2024-04-02`
+### 🚀 Features
+- 优化整体代码风格 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/638 https://github.com/Tencent/tdesign-vue-next-starter/pull/650 https://github.com/Tencent/tdesign-vue-next-starter/pull/680 https://github.com/Tencent/tdesign-vue-next-starter/pull/684)
+- 新增侧边栏颜色切换 by @qingmang @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/681)
+- 使用 `t-descriptions` 替换详情页代码 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/707)
+
+### 🐞 Bug Fixes
+- 修复国际化配置缺失 by @liweijie0812 @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/614 https://github.com/Tencent/tdesign-vue-next-starter/pull/632 https://github.com/Tencent/tdesign-vue-next-starter/pull/636)
+- 修复 `ECharts` 图例缩放错误 by @lcosmos (https://github.com/Tencent/tdesign-vue-next-starter/pull/622)
+- 修复 `ECharts` 图样文字重叠 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/682)
+- 修复 `husky` 找不到npx命令 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/635)
+- 修复路由切换时过渡动画异常 by @mokeyjay (https://github.com/Tencent/tdesign-vue-next-starter/pull/666)
+- 修复mock环境下获取菜单异常 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/630)
+
+## 🌈 0.9.0 `2023-10-04`
+### 🚀 Features
+- 新增内置国际化配置,支持中英切换 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/607)
+- 新增 node 版本要求 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/605)
+
+### 🐞 Bug Fixes
+- 修复`t-link`在设置主题色时的样式异常 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/565)
+- 移除无效的 `stylelint` 规则 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/584)
+- 修复部分内置样式对 button 的影响 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/586)
+- 修正部分模板页面卡片组件操作插槽用法 by @ngyyuusora (https://github.com/Tencent/tdesign-vue-next-starter/pull/587)
+- 修改部分错别字 by @dufu1991 (https://github.com/Tencent/tdesign-vue-next-starter/pull/600)
+- 优化”暂无通知“的样式问题 by @Summer-Shen (https://github.com/Tencent/tdesign-vue-next-starter/pull/604)
+
+## 🌈 0.8.0 `2023-07-12`
+### ❗️ BREAKING CHANGES
+- 重构内置 axios 及请求相关逻辑,新增接口级防抖节流 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/556)
+- 更新 stylelint 相关配置 移除 stylelint-less 依赖 by @timi137137 @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/553 https://github.com/Tencent/tdesign-vue-next-starter/pull/558)
+
+### 🐞 Bug Fixes
+- 修复路由跳转表头闪烁的问题 by @tanhh326 (https://github.com/Tencent/tdesign-vue-next-starter/pull/550)
+- 修复筛选列表页,搜索合同状态显示object的异常 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/559)
+
+## 🌈 0.7.7 `2023-06-27`
+### 🚀 Features
+- Vite版本升级至4 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/533)
+- 组件库版本升级至 1.3.8 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/548)
+- Axios支持格式化Params by @ngyyuusora (https://github.com/Tencent/tdesign-vue-next-starter/pull/544)
+
+### 🐞 Bug Fixes
+- 修复登出后路由重置问题 by @ngyyuusora (https://github.com/Tencent/tdesign-vue-next-starter/pull/545)
+- 修复请求时204无内容判断异常 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/539)
+
+## 🌈 0.7.6 `2023-05-30`
+### 🚀 Features
+- 移除了将所有文件一并提交的代码 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/515)
+- 组件库版本升级至 1.3.4 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/518)
+- 禁止隐式Any类型声明 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/519)
+
+### 🐞 Bug Fixes
+- 修复多标签页中保活异常问题 by @ngyyuusora (https://github.com/Tencent/tdesign-vue-next-starter/pull/523)
+- 修复store存储token读取异常问题 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/526)
+
+## 🌈 0.7.5 `2023-05-18`
+### 🚀 Features
+- 站点引入主题生成器插件,支持在页面模板站点尝试及预览不同主题的效果 by @uyarn @timi137137
+- 优化路由守卫获取菜单异常的处理,跳转登录页并弹窗提示 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/502)
+- 规范不同系统中的结束符 by @SpringHgui @yunxifd (https://github.com/Tencent/tdesign-vue-next-starter/pull/505)
+
+### 🐞 Bug Fixes
+- 修复无法将通知设为未读的缺陷 by @izoyo (https://github.com/Tencent/tdesign-vue-next-starter/pull/511)
+- 修复 store 中并未对 localStorage 的 TOKEN_NAME 键进行赋值的缺陷 by @SpringHgui (https://github.com/Tencent/tdesign-vue-next-starter/pull/504)
+
+## 🌈 0.7.4 `2023-04-13`
+### 🚀 Features
+- Eslint 新增 `simple-import-sort` 插件规范引入 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/464)
+- 菜单路由支持`keepAlive`参数控制页面是否开启缓存 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/470)
+- 标签页可配置禁止拖拽 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/454)
+
+### 🐞 Bug Fixes
+- 修复拼音输入的问题 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/421)
+- 修复同级路由路径存着相同启始字符时菜单高亮异常的问题 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/450)
+- 修复部分`devDependencies`错误配置在`dependencies`的问题 by @PDieE (https://github.com/Tencent/tdesign-vue-next-starter/pull/456)
+- 修复请求出错重试后触发两次回调的问题 by @PDieE (https://github.com/Tencent/tdesign-vue-next-starter/pull/458)
+- 修复多级菜单高亮问题 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/459)
+
+## 🌈 0.7.3 `2023-03-15`
+### 🚀 Features
+- 优化菜单生成 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/413)
+- 优化修改主题色的逻辑 by @hzgotb (https://github.com/Tencent/tdesign-vue-next-starter/pull/428)
+- 接口配置硬编码调整到环境变量 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/445)
+
+### 🐞 Bug Fixes
+- 修复修改.html文件stylelint检查出错的问题 by @hmingv (https://github.com/Tencent/tdesign-vue-next-starter/pull/436)
+- 删除废弃的globEager by @hmingv (https://github.com/Tencent/tdesign-vue-next-starter/pull/439)
+
+## 🌈 0.7.2 `2023-02-21`
+### 🚀 Features
+- 优化菜单生成逻辑 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/413)
+- 多标签Tab栏支持拖拽排序 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/426)
+
+### 🐞 Bug Fixes
+- 修复列表页示例拼音输入的问题 by @liweijie0812 (https://github.com/Tencent/tdesign-vue-next-starter/pull/421)
+- 优化登录页及个人中心页样式 by @Wen1kang (https://github.com/Tencent/tdesign-vue-next-starter/pull/415)
+- 修复 tdesign-vue-next 1.0.8版本由于引入Teleport后drawer内样式穿透失效引起的样式错乱 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/425)
+
+## 🌈 0.7.1 `2023-02-08`
+### 🐞 Bug Fixes
+- 修复环境变量的问题 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/399)
+- 修复 stylelint 14的配置问题 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/404)
+- 修复dashboard&layout相关样式Bug by @Wen1kang (https://github.com/Tencent/tdesign-vue-next-starter/pull/403)
+- 修复菜单图标样式问题 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/402)
+
+## 🌈 0.7.0 `2023-01-16`
+### ❗️ BREAKING CHANGES
+- 移除所有内置主题色相关代码,全部通过 `tvision-color` 计算获取,调整颜色相关方法的目录结构 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/392)
+- 新增后端路由权限相关代码,默认菜单路由权限改为后端控制,具体使用可参考文档 [权限控制](https://tdesign.tencent.com/starter/docs/vue-next/permission-control) by @timi137137 @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/394)
+
+### 🚀 Features
+- 支持任意颜色作为初始化主题颜色 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/392)
+- 升级 `tvision-color` 至1.5.0 使用新的`getColorGradations`方法,修正部分选择的过曝主题色 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/392)
+- 升级相关依赖 `vite`需升级至`3.0`以上,支持图标后端配置等场景需求 by @timi137137 @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/394)
+
+### 🐞 Bug Fixes
+- 修复自定义颜色切换明亮暗黑模式时无法沿用的缺陷 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/392)
+
+`Tips: 此次发布 较 0.6.x 版本 删除了此前大量内置项目的色彩生成逻辑,权限控制相关逻辑也发生巨大变动 若打开预览无法访问请清除 localStorage 等缓存再尝试 跟进升级请慎重`
+
+## 🌈 0.6.1 `2022-12-19`
+### 🚀 Features
+- 优化登录跳转支持回跳带query参数的页面 by @PDieE (https://github.com/Tencent/tdesign-vue-next-starter/pull/374)
+- 引入类型声明为type 方便CLI工具做JS版本转换处理 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/375)
+- 新增打开外部页面(内嵌及外链)配置及示例 by @dianjie (https://github.com/Tencent/tdesign-vue-next-starter/pull/377)
+- 支持编辑器使用`volar`提示组件名称及对应API by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/378)
+
+### 🐞 Bug Fixes
+- 修复DateRangePicker组件内分页样式显示异常 by @wandoupeas (https://github.com/Tencent/tdesign-vue-next-starter/pull/373)
+- 修复组件升级引入的布局高度问题 by @dianjie (https://github.com/Tencent/tdesign-vue-next-starter/pull/367)
+
+## 🌈 0.6.0 `2022-11-25`
+### ❗️ BREAKING CHANGES
+- 废弃大量内置`less variables`, 尺寸、色彩、字体、圆角及阴影统一使用组件库内置变量 具体变量可参考 [Design Token](https://tdesign.tencent.com/starter/docs/vue-next/design-token) by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/365)
+- 升级默认主题色的配色方案 组件库升级至0.24.9及请参照改动 @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/365)
+
+### 🐞 Bug Fixes
+- 修复组件库升级至0.24.8及以上由于头部高度变化导致部分导航模式样式异常的问题 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/365)
+- 避免 Content-Type 被改为 `text/plain` by @TonyLuo (https://github.com/Tencent/tdesign-vue-next-starter/pull/361)
+
+## 🌈 0.5.6 `2022-11-18`
+### 🐞 Bug Fixes
+- 修正退出后 userStore.userInfo 存在残留的问题 by @PDieE (https://github.com/Tencent/tdesign-vue-next-starter/pull/357)
+- 修复0.5.5 头部高度在多标签页的样式异常 by @uyarn @dodu2014 (https://github.com/Tencent/tdesign-vue-next-starter/pull/360)
+
+## 🌈 0.5.5 `2022-11-16`
+### 🚀 Features
+- 升级axios至1.0版本 by @dependabot (https://github.com/Tencent/tdesign-vue-next-starter/pull/351)
+- 升级tdesign-vue-next至0.24版本 支持尺寸类Design Token 部分样式需调整 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/355)
+
+### 🐞 Bug Fixes
+- 修复导航布局`side`模式下小屏显示问题 by @dianjie (https://github.com/Tencent/tdesign-vue-next-starter/pull/348)
+
+## 🌈 0.5.4 `2022-10-26`
+### 🚀 Features
+- 升级`vue-router`至4.1+ by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/341)
+- 升级`vue-tsc`至 1.0+ by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/341)
+
+### 🐞 Bug Fixes
+- 修复系统设置事件绑定位置的错误(#344) by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/345)
+
+## 🌈 0.5.3 `2022-10-18`
+### 🚀 Features
+- 项目通用 less vars 设置为全局变量,不需要再手动引入 by @dianjie (https://github.com/Tencent/tdesign-vue-next-starter/pull/327)
+- 升级组件库依赖至0.24.2 优化下拉菜单高度及多级结构 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/339)
+
+## 🌈 0.5.2 `2022-09-27`
+### 🚀 Features
+- 升级组件库依赖至0.23 修复切换页面等场景下表格吸附效果未重新计算导致的样式异常 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/322)
+- 增加urlPrefix判断 避免undefined拼接到url导致请求无效 @kerwin612 (https://github.com/Tencent/tdesign-vue-next-starter/pull/311)
+
+### 🐞 Bug Fixes
+- 修复`Sidenav`参数错误导致跟随系统样式异常的问题 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/315)
+- 修复user持久化导致的问题 by @PDieE (https://github.com/Tencent/tdesign-vue-next-starter/pull/316)
+- 修复路径重复拼接的问题 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/319)
+
+## 🌈 0.5.1 `2022-09-14`
+### 🚀 Features
+- 多标签页的右键操作扩展支持非当前页进行操作 by @zhangpaopao0609 @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/297)
+- 使用插件将store数据持久化 by @PDieE (https://github.com/Tencent/tdesign-vue-next-starter/pull/291)
+- add README in English by @paiakarit @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/301 https://github.com/Tencent/tdesign-vue-next-starter/pull/305)
+
+### 🐞 Bug Fixes
+- 解决当打开多个标签后 退出会报错的问题 by @PDieE (https://github.com/Tencent/tdesign-vue-next-starter/pull/293)
+- 修复底部版权信息及面包屑导航垂直居中问题 by @zengqiu (https://github.com/Tencent/tdesign-vue-next-starter/pull/299 https://github.com/Tencent/tdesign-vue-next-starter/pull/298)
+- 修复浏览器不兼容页中浏览器推荐卡片遮挡页脚信息问题 by @zengqiu (https://github.com/Tencent/tdesign-vue-next-starter/pull/303)
+
+## 🌈 0.5.0 `2022-09-06`
+### ❗️ BREAKING CHANGES
+- jsx代码全部改完sfc(.vue) 统一全部页面及组件用sfc编写 by @zhangpaopao0609 (https://github.com/Tencent/tdesign-vue-next-starter/pull/279)
+
+### 🐞 Bug Fixes
+- 修复混合模式下选择分割菜单再点击顶部登录页出现空白页的异常 by @setli (https://github.com/Tencent/tdesign-vue-next-starter/pull/287)
+- 修复顶部布局头部缺失的问题 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/292)
+- 修复侧边栏折叠时版本号前显示 false 问题 by @zengqiu (https://github.com/Tencent/tdesign-vue-next-starter/pull/294)
+
+## 🌈 0.4.1 `2022-08-30`
+### 🚀 Features
+- 升级tdesign-vue-next至0.20.2版本 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/276)
+- tabs-router 支持存储路由的参数 by @dodu2014 (https://github.com/Tencent/tdesign-vue-next-starter/pull/269)
+
+### 🐞 Bug Fixes
+- 修复更新vue-router版本后的遗留问题 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/261)
+- 修正请求时formData类型的数据会被过滤的问题 by @PDieE (https://github.com/Tencent/tdesign-vue-next-starter/pull/272)
+- 修正store内数据提前被清理导致报错的问题 by @PDieE (https://github.com/Tencent/tdesign-vue-next-starter/pull/274)
+
+## 🌈 0.4.0 `2022-08-08`
+### ❗️ BREAKING CHANGES
+- 升级vue-router版本 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/257)
+
+### 🚀 Features
+- 处理代码中不符合规范的文件和写法 升级相关依赖 增加更多的规范 by @uyarn (https://github.com/Tencent/tdesign-vue-next-starter/pull/243)
+- 新增支持子菜单是否默认展开的配置 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/245)
+- 升级组件库依赖至0.19.0 组件圆角样式有变化 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/252)
+
+### 🐞 Bug Fixes
+- 修复变更颜色/模式时出现页面卡死的异常 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/254)
+- 修复侧边栏开合时图表没有刷新的问题 by @timi137137 (https://github.com/Tencent/tdesign-vue-next-starter/pull/253)
+- 填补登录页面缺失的手机号输入框及相关逻辑 by @hxywuya (https://github.com/Tencent/tdesign-vue-next-starter/pull/255)
+
+## 🌈 0.3.6 `2022-07-18`
+### 🚀 Features
+- 升级tdesign-vue-next至0.18.0版本
+- 增加apis目录 管理项目中使用到的api by @timi137137 ([#221](https://github.com/Tencent/tdesign-vue-next-starter/pull/221))
+- router调整为自动导入 by @timi137137 ([#223](https://github.com/Tencent/tdesign-vue-next-starter/pull/223))
+
+### 🐞 Bug Fixes
+- 部分选择器未随自定义样式前缀更改 by @wandoupeas ([#229](https://github.com/Tencent/tdesign-vue-next-starter/pull/229))
+
+## 🌈 0.3.5 `2022-06-27`
+### 🚀 Features
+- 调整类型相关问题的项目结构 by @timi137137 ([#184](https://github.com/Tencent/tdesign-vue-next-starter/pull/184))
+- 改造请求封装相关代码 by @timi137137 ([#185](https://github.com/Tencent/tdesign-vue-next-starter/pull/185))
+
+### 🐞 Bug Fixes
+- 修复首页TAB关闭其他时的异常 by @SadWood ([#180](https://github.com/Tencent/tdesign-vue-next-starter/pull/180))
+- 修复升级0.16版本后自定义设置中选项样式的异常 by @uyarn ([#193](https://github.com/Tencent/tdesign-vue-next-starter/pull/193))
+
+## 🌈 0.3.4 `2022-06-17`
+### 🚀 Features
+- 升级组件库依赖至0.16.0,`datepicker`、`dialog`组件的使用请参考改动 by @pengYYYYY ([#174](https://github.com/Tencent/tdesign-vue-next-starter/pull/174))
+
+### 🐞 Bug Fixes
+- 修复退出登录之后重新登陆新增了空Tab的缺陷 by @kerwin612 ([#168](https://github.com/Tencent/tdesign-vue-next-starter/pull/168))
+- 修复切换多标签Tab页时的告警问题 by @kerwin612 ([#173](https://github.com/Tencent/tdesign-vue-next-starter/pull/173))
+
+## 🌈 0.3.3 `2022-06-02`
+### 🚀 Features
+- 模板中使用颜色变量全部改造为CSS Token by @kerwin612 ([#157](https://github.com/Tencent/tdesign-vue-next-starter/pull/157))
+
+### 🐞 Bug Fixes
+- 升级组件库至0.15.4,修复菜单字重及顶部菜单箭头翻转方向、暗黑模式的颜色问题 by @uyarn @leejim ([#159](https://github.com/Tencent/tdesign-vue-next-starter/pull/159)) [tdesign-vue-next#916](https://github.com/Tencent/tdesign-vue-next/pull/916)
+
+## 🌈 0.3.2 `2022-05-27`
+### 🚀 Features
+- 升级组件库依赖至0.15.1 by @pengYYYYY ([#154](https://github.com/Tencent/tdesign-vue-next-starter/pull/154))
+- 增加多标签页增加支持指定路由不缓存的功能 by @uyarn ([#155](https://github.com/Tencent/tdesign-vue-next-starter/pull/155))
+
+### 🐞 Bug Fixes
+- 修复页面滚动条不重置的问题 by @kerwin612 ([#158](https://github.com/Tencent/tdesign-vue-next-starter/pull/158))
+- 修复多标签页关闭逻辑缺陷 by @uyarn ([#156](https://github.com/Tencent/tdesign-vue-next-starter/pull/156))
+
+## 🌈 0.3.1 `2022-05-13`
+### 🚀 Features
+- lint新增style scoped提示 by @kerwin612 ([#138](https://github.com/Tencent/tdesign-vue-next-starter/pull/138))
+- 新增维护中页面 by @uyarn ([#146](https://github.com/Tencent/tdesign-vue-next-starter/pull/146))
+- 升级组件库依赖至0.14+
+
+### 🐞 Bug Fixes
+- 修复多标签Tab页关闭左侧,关闭其他可能导致主页标签被删除 by @kerwin612 ([#148](https://github.com/Tencent/tdesign-vue-next-starter/pull/148))
+- 修复多个滚动列表之间切换时页面不刷新导致的样式缺陷 by @kerwin612 ([#152](https://github.com/Tencent/tdesign-vue-next-starter/pull/152))
+
+## 🌈 0.3.0 `2022-04-28`
+### 🚀 Features
+- 优化菜单选中判断逻辑 by @kerwin612 ([#132](https://github.com/Tencent/tdesign-vue-next-starter/pull/132))
+- 升级组件库依赖至0.13 + 版本 by @uyarn ([#133](https://github.com/Tencent/tdesign-vue-next-starter/pull/133))
+ - 替换全部Card为`t-card`卡片组件,减少重复代码实现
+ - 调整图表相关代码目录结构,图表部分代码调整至所在Page内,减少各页面模块的耦合
+ - 调整表格相关代码及展示,增加吸顶功能展示、去除minWidth的使用等
+
+### 🐞 Bug Fixes
+- 修复分步表单页底部居中问题
+- 修复顶部菜单栏下拉菜单与表单层级问题
+
+## 🌈 0.2.3 `2022-04-26`
+### 🚀 Features
+- 补充mock示例 by @kerwin612 ([#127](https://github.com/Tencent/tdesign-vue-next-starter/pull/127))
+
+### 🐞 Bug Fixes
+- 修复顶部菜单栏未选中项样式问题 by @kerwin612 ([#131](https://github.com/Tencent/tdesign-vue-next-starter/pull/131))
+- 修复搜索框样式异常问题 by @kerwin612 ([#130](https://github.com/Tencent/tdesign-vue-next-starter/pull/130))
+- 修复顶部布局布局菜单样式问题 by @kerwin612 ([#129](https://github.com/Tencent/tdesign-vue-next-starter/pull/129))
+
+## 🌈 0.2.2 `2022-04-06`
+### 🚀 Features
+- 支持多标签页支持持久化 by @uyarn ([#111](https://github.com/Tencent/tdesign-vue-next-starter/pull/111))
+- 升级组件库依赖tdesign-vue-next至0.11版本 by @pengYYYYY
+
+### 🐞 Bug Fixes
+- 修复图表文字颜色异常 by @uyarn ([#112](https://github.com/Tencent/tdesign-vue-next-starter/pull/112))
+- 修复mock roles模块错误 by @lscho ([#104](https://github.com/Tencent/tdesign-vue-next-starter/pull/104))
+
+## 🌈 0.2.1 `2022-03-25`
+### 🚀 Features
+- 新增多标签Tab页功能 ([#98](https://github.com/Tencent/tdesign-vue-next-starter/pull/98))
+
+## 🌈 0.2.0 `2022-03-04`
+### 🚀 Features
+- pinia替换vuex作为状态管理库 by @PengYYYYY
+- 升级组件库依赖tdesign-vue-next至0.9版本
+
+## 🌈 0.1.3 `2022-02-27`
+### 🚀 Features
+- 使用 `setup script` 重构了页面逻辑
+
+### 🐞 Bug Fixes
+- 修复菜单下拉与表格定位冲突
+
+## 🌈 0.1.2 `2022-02-18`
+### 🐞 Bug Fixes
+- 修复面包屑点击跳转当前页错误的问题 by @ccccpj
+
+## 🌈 0.1.1 `2022-01-27`
+### 🐞 Bug Fixes
+- 修复表单页检验提示未正常显示的问题
+
+## 🌈 0.1.0 `2022-01-10`
+### 🚀 Features
+- 升级 `tdesign-vue-next` 版本到 `0.6.3`
+
+### 🐞 Bug Fixes
+- 修复一级菜单收起出现多余 `1` 的 bug
+- 修复 `time-picker` 的文字覆盖
+- 修复版本图表渲染问题
diff --git a/td_fronted/LICENSE b/td_fronted/LICENSE
new file mode 100644
index 0000000000..81af071b6b
--- /dev/null
+++ b/td_fronted/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 TDesign
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/td_fronted/PUBLISH.md b/td_fronted/PUBLISH.md
new file mode 100644
index 0000000000..23320f645b
--- /dev/null
+++ b/td_fronted/PUBLISH.md
@@ -0,0 +1,10 @@
+# 版本发布流程
+
+## 发布流程
+
+- 从 `develop` 新建 `release/x.y.z` 分支,并修改 `package.json` 中的版本号,推送分支至远程仓库,并提交一个合入`develop`的 Pull Request 到仓库
+- 仓库的 Github Action 会自动整理上个版本至今 commit 对应的 CHANGELOG,并将 CHANGELOG 的 draft 作为一个评论推送到该 Pull Request 上
+- 发布人检查 CHANGELOG,并优化内容逻辑结构,确认无误后删除对于评论首行提示,Github Action 会将优化后的内容写入 CHANGELOG.md 内
+- 确认无误后,合并分支入`develop`
+
+合入 `develop` 后,仓库会触发 Github Action 合入 `main` 分支,并将版本号作为 `tag` 打在仓库上
diff --git a/td_fronted/README-zh_CN.md b/td_fronted/README-zh_CN.md
new file mode 100644
index 0000000000..6ea1b0c411
--- /dev/null
+++ b/td_fronted/README-zh_CN.md
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+简体中文 | [English](./README.md)
+
+### 项目简介
+
+TDesign Vue Next Starter 是一个基于 TDesign,使用 `Vue3`、`Vite`、`Pinia`、`TypeScript` 开发,可进行个性化主题配置,旨在提供项目开箱即用的、配置式的中后台项目。
+
+
+ 在线预览
+ ·
+ 使用文档
+
+
+
+
+
+### 特性
+
+- 内置多种常用的中后台页面
+- 完善的目录结构
+- 完善的代码规范配置
+- 支持暗黑模式
+- 自定义主题颜色
+- 多种空间布局
+- 内置 Mock 数据方案
+
+### 使用
+
+> 通过 `tdesign-starter-cli` 初始化项目仓库
+
+```bash
+## 1、安装 tdesign-starter-cli
+npm i tdesign-starter-cli@latest -g
+
+## 2、创建项目
+td-starter init
+```
+
+### 开发
+
+``` bash
+## 安装依赖
+npm install
+
+## 启动项目
+npm run dev
+```
+
+### 构建
+
+```bash
+## 构建正式环境
+npm run build
+
+## 构建测试环境
+npm run build:test
+```
+
+### 其他
+
+```bash
+## 预览构建产物
+npm run preview
+
+## 代码格式检查
+npm run lint
+
+## 代码格式检查与自动修复
+npm run lint:fix
+
+## style格式检查
+npm run stylelint
+
+## style格式检查与自动修复
+npm run stylelint:fix
+```
+
+### 如何贡献
+
+非常欢迎您的贡献!提交您的 [Issue](https://github.com/tencent/tdesign-vue-next-starter/issues/new/choose) 或者提交 [Pull Request](https://github.com/Tencent/tdesign-vue-next-starter/pulls)。
+
+#### 贡献提交规范
+
+- [Angular Convention](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular)
+- [Vue Style Guide](https://v3.vuejs.org/style-guide/#rule-categories)
+
+### 兼容性
+
+| [ ](http://godban.github.io/browsers-support-badges/) IE / Edge | [ ](http://godban.github.io/browsers-support-badges/)Firefox | [ ](http://godban.github.io/browsers-support-badges/)Chrome | [ ](http://godban.github.io/browsers-support-badges/)Safari |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Edge >=84 | Firefox >=83 | Chrome >=84 | Safari >=14.1 |
+
+### 社区版本
+
+基于 TDesign Vue Next 的 starter-kit 有多种社区版本,访问 [社区链接](https://tdesign.tencent.com/starter/docs/vue-next/community-link) 可以访问更多版本。
+如果您也开发了 TDesign Starter 的社区版本,可以提交 Issue 或者直接给我们提Pull Request 😊。
+
+### 开源协议
+
+TDesign 遵循 [MIT 协议](https://github.com/Tencent/tdesign-vue-next-starter/LICENSE)。
+
diff --git a/td_fronted/README.md b/td_fronted/README.md
new file mode 100644
index 0000000000..0b42ceebf0
--- /dev/null
+++ b/td_fronted/README.md
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+English | [简体中文](./README-zh_CN.md)
+### Introduction
+
+TDesign Vue Next Starter is a TDesign-based developed with `Vue 3`, `Vite`, `Pinia`, `TypeScript`. It can be customized theme configuration, and aims to provide project out-of-the-box, configuration-style middle and background projects.
+
+
+ Live Preview
+ ·
+ Documentation
+
+
+
+
+### Features
+
+- Various provided pages for develop
+- Complete directory structure for develop
+- Code specification configuration
+- Support dark mode
+- Custom theme colors
+- Various space layouts
+- Mock data scheme
+
+### Usage
+
+> Initialize project with our CLI tool `tdesign-starter-cli`
+
+```bash
+## install tdesign-starter-cli
+npm i tdesign-starter-cli@latest -g
+
+## create project
+td-starter init
+```
+
+### Develop
+
+```bash
+## install dependencies
+npm install
+
+## set up
+npm run dev
+```
+
+### Build
+
+```bash
+## build
+npm run build
+
+## build for test
+npm run build:test
+```
+
+
+### Contributing Guide
+
+We welcome contributions to our project. Create your [Issue](https://github.com/tencent/tdesign-vue-next-starter/issues/new/choose) or Submit your [Pull Request](https://github.com/Tencent/tdesign-vue-next-starter/pulls).
+
+#### Commit Specification
+
+- [Angular Convention](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular)
+- [Vue Style Guide](https://v3.vuejs.org/style-guide/#rule-categories)
+
+### Browser Support
+
+| [ ](http://godban.github.io/browsers-support-badges/) IE / Edge | [ ](http://godban.github.io/browsers-support-badges/)Firefox | [ ](http://godban.github.io/browsers-support-badges/)Chrome | [ ](http://godban.github.io/browsers-support-badges/)Safari |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Edge >=84 | Firefox >=83 | Chrome >=84 | Safari >=14.1 |
+
+### Community Versions
+
+There are kinds of community versions of starter-kit based on TDesign Vue Next, visit [community-link](https://tdesign.tencent.com/starter/docs/vue-next/community-link) for more detail. If you developed a community versions of tdesign starter, please create a issue or submit a pull request to let us know 😊.
+
+### License
+
+The MIT License. Please see [the license file](LICENSE) for more information.
diff --git a/td_fronted/commitlint.config.js b/td_fronted/commitlint.config.js
new file mode 100644
index 0000000000..b21d4519bc
--- /dev/null
+++ b/td_fronted/commitlint.config.js
@@ -0,0 +1,11 @@
+// commit-lint config
+export default {
+ extends: ['@commitlint/config-conventional'],
+ rules: {
+ 'type-enum': [
+ 2,
+ 'always',
+ ['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test', 'types'],
+ ],
+ },
+};
diff --git a/td_fronted/docs/starter.png b/td_fronted/docs/starter.png
new file mode 100644
index 0000000000..6c8d7e73eb
Binary files /dev/null and b/td_fronted/docs/starter.png differ
diff --git a/td_fronted/index.html b/td_fronted/index.html
new file mode 100644
index 0000000000..587b9b186d
--- /dev/null
+++ b/td_fronted/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ TDesign Vue Next Starter
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/mock/index.ts b/td_fronted/mock/index.ts
new file mode 100644
index 0000000000..d898fcc9ed
--- /dev/null
+++ b/td_fronted/mock/index.ts
@@ -0,0 +1,368 @@
+import Mock from 'mockjs';
+import { MockMethod } from 'vite-plugin-mock';
+
+export default [
+ {
+ url: '/api/get-purchase-list',
+ method: 'get',
+ response: () => ({
+ code: 0,
+ data: {
+ ...Mock.mock({
+ 'list|1-100': [
+ {
+ index: /S20201228115950[0-9][0-9][0-9]/,
+ pdName: 'Macbook',
+ pdNum: 'p_tmp_60a637cd0d',
+ 'purchaseNum|1-100': 100,
+ adminName: '财务部111',
+ updateTime: '2020-05-20@date("HH:mm:ss")',
+ pdType: '电子产品',
+ },
+ {
+ index: /S20201228115950[0-9][0-9][0-9]/,
+ pdName: 'Macbook',
+ pdNum: 'p_tmp_60a637cd0d',
+ 'purchaseNum|1-100': 100,
+ adminName: '财务部',
+ updateTime: '2020-05-20@date("HH:mm:ss")',
+ },
+ ],
+ }),
+ },
+ }),
+ },
+ {
+ url: '/api/get-list',
+ method: 'get',
+ response: () => ({
+ code: 0,
+ data: {
+ ...Mock.mock({
+ 'list|1-100': [
+ {
+ 'index|+1': 1,
+ 'status|1': '@natural(0, 4)',
+ no: 'BH00@natural(01, 100)',
+ name: '@city()办公用品采购项目',
+ 'paymentType|1': '@natural(0, 1)',
+ 'contractType|1': '@natural(0, 2)',
+ updateTime: '2020-05-30 @date("HH:mm:ss")',
+ amount: '@natural(10, 500),000,000',
+ adminName: '@cname()',
+ },
+ ],
+ }),
+ },
+ }),
+ },
+ {
+ url: '/api/detail-basic',
+ method: 'get',
+ response: () => ({
+ code: 0,
+ data: {
+ ...Mock.mock({
+ name: 'td_20023747',
+ loginType: 'Web',
+ currentRole: 'Admin',
+ rightsList: '通用权限',
+ userStatus: '启用',
+ language: '简体中文',
+ timeZone: '(GMT+08:00)中国时区—北京(Asia/Beijing)',
+ }),
+ },
+ }),
+ },
+ {
+ url: '/api/get-card-list',
+ method: 'get',
+ response: () => ({
+ code: 0,
+ data: {
+ ...Mock.mock({
+ 'list|48-50': [
+ {
+ 'index|+1': 1,
+ isSetup: '@boolean',
+ 'type|1': '@natural(1, 5)',
+ 'banner|1': [
+ 'https://tdesign.gtimg.com/starter/cloud-db.jpg',
+ 'https://tdesign.gtimg.com/starter/cloud-server.jpg',
+ 'https://tdesign.gtimg.com/starter/ssl.jpg',
+ 'https://tdesign.gtimg.com/starter/t-sec.jpg',
+ 'https://tdesign.gtimg.com/starter/face-recognition.jpg',
+ ],
+ 'name|1': ['人脸识别', 'SSL证书', 'CVM', '云数据库', 'T-Sec 云防火墙'],
+ 'description|1': [
+ '基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、五官定位、人脸搜索、人脸比对、人脸',
+ '云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗',
+ 'SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部',
+ '腾讯安全云防火墙产品,是腾讯云安全团队结合云原生的优势,自主研发的SaaS化防火墙产品,无需客无需客无需客无需客无需客无需客无需客',
+ '云数据库MySQL为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。',
+ ],
+ },
+ ],
+ }),
+ },
+ }),
+ },
+ {
+ url: '/api/get-project-list',
+ method: 'get',
+ response: () => ({
+ code: 0,
+ data: {
+ ...Mock.mock({
+ 'list|1-50': [
+ {
+ 'index|+1': 1,
+ adminPhone: '+86 13587609955',
+ updateTime: '2020-05-30 @date("HH:mm:ss")',
+ 'adminName|1': ['顾娟 ', '常刚', '郑洋'],
+ 'name|1': [
+ '沧州市办公用品采购项目',
+ '红河哈尼族彝族自治州办公用品采购项目 ',
+ '铜川市办公用品采购项目',
+ '陇南市办公用品采购项目 ',
+ '六安市办公用品采购项目 ',
+ ],
+ },
+ ],
+ }),
+ },
+ }),
+ },
+ {
+ url: '/api/post',
+ method: 'post',
+ timeout: 2000,
+ response: {
+ code: 0,
+ data: {
+ name: 'vben',
+ },
+ },
+ },
+ {
+ url: '/api/get-menu-list-i18n',
+ method: 'get',
+ timeout: 2000,
+ response: {
+ code: 0,
+ data: {
+ ...Mock.mock({
+ list: [
+ {
+ path: '/list',
+ name: 'list',
+ component: 'LAYOUT',
+ redirect: '/list/base',
+ meta: {
+ title: {
+ zh_CN: '列表页',
+ en_US: 'List',
+ },
+ icon: 'view-list',
+ },
+ children: [
+ {
+ path: 'base',
+ name: 'ListBase',
+ component: '/list/base/index',
+ meta: {
+ title: {
+ zh_CN: '基础列表页',
+ en_US: 'Base List',
+ },
+ },
+ },
+ {
+ path: 'card',
+ name: 'ListCard',
+ component: '/list/card/index',
+ meta: {
+ title: {
+ zh_CN: '卡片列表页',
+ en_US: 'Card List',
+ },
+ },
+ },
+ {
+ path: 'filter',
+ name: 'ListFilter',
+ component: '/list/filter/index',
+ meta: {
+ title: {
+ zh_CN: '筛选列表页',
+ en_US: 'Filter List',
+ },
+ },
+ },
+ {
+ path: 'tree',
+ name: 'ListTree',
+ component: '/list/tree/index',
+ meta: {
+ title: {
+ zh_CN: '树状筛选列表页',
+ en_US: 'Tree List',
+ },
+ },
+ },
+ ],
+ },
+ {
+ path: '/form',
+ name: 'form',
+ component: 'LAYOUT',
+ redirect: '/form/base',
+ meta: {
+ title: {
+ zh_CN: '表单页',
+ en_US: 'Form',
+ },
+ icon: 'edit-1',
+ },
+ children: [
+ {
+ path: 'base',
+ name: 'FormBase',
+ component: '/form/base/index',
+ meta: {
+ title: {
+ zh_CN: '基础表单页',
+ en_US: 'Base Form',
+ },
+ },
+ },
+ {
+ path: 'step',
+ name: 'FormStep',
+ component: '/form/step/index',
+ meta: {
+ title: {
+ zh_CN: '分步表单页',
+ en_US: 'Step Form',
+ },
+ },
+ },
+ ],
+ },
+ {
+ path: '/detail',
+ name: 'detail',
+ component: 'LAYOUT',
+ redirect: '/detail/base',
+ meta: {
+ title: {
+ zh_CN: '详情页',
+ en_US: 'Detail',
+ },
+ icon: 'layers',
+ },
+ children: [
+ {
+ path: 'base',
+ name: 'DetailBase',
+ component: '/detail/base/index',
+ meta: {
+ title: {
+ zh_CN: '基础详情页',
+ en_US: 'Base Detail',
+ },
+ },
+ },
+ {
+ path: 'advanced',
+ name: 'DetailAdvanced',
+ component: '/detail/advanced/index',
+ meta: {
+ title: {
+ zh_CN: '多卡片详情页',
+ en_US: 'Card Detail',
+ },
+ },
+ },
+ {
+ path: 'deploy',
+ name: 'DetailDeploy',
+ component: '/detail/deploy/index',
+ meta: {
+ title: {
+ zh_CN: '数据详情页',
+ en_US: 'Data Detail',
+ },
+ },
+ },
+ {
+ path: 'secondary',
+ name: 'DetailSecondary',
+ component: '/detail/secondary/index',
+ meta: {
+ title: {
+ zh_CN: '二级详情页',
+ en_US: 'Secondary Detail',
+ },
+ },
+ },
+ ],
+ },
+ {
+ path: '/frame',
+ name: 'Frame',
+ component: 'Layout',
+ redirect: '/frame/doc',
+ meta: {
+ icon: 'internet',
+ title: {
+ zh_CN: '外部页面',
+ en_US: 'External',
+ },
+ },
+ children: [
+ {
+ path: 'doc',
+ name: 'Doc',
+ component: 'IFrame',
+ meta: {
+ frameSrc: 'https://tdesign.tencent.com/starter/docs/vue-next/get-started',
+ title: {
+ zh_CN: '使用文档(内嵌)',
+ en_US: 'Documentation(IFrame)',
+ },
+ },
+ },
+ {
+ path: 'TDesign',
+ name: 'TDesign',
+ component: 'IFrame',
+ meta: {
+ frameSrc: 'https://tdesign.tencent.com/vue-next/getting-started',
+ title: {
+ zh_CN: 'TDesign 文档(内嵌)',
+ en_US: 'TDesign (IFrame)',
+ },
+ },
+ },
+ {
+ path: 'TDesign2',
+ name: 'TDesign2',
+ component: 'IFrame',
+ meta: {
+ frameSrc: 'https://tdesign.tencent.com/vue-next/getting-started',
+ frameBlank: true,
+ title: {
+ zh_CN: 'TDesign 文档(外链',
+ en_US: 'TDesign Doc(Link)',
+ },
+ },
+ },
+ ],
+ },
+ ],
+ }),
+ },
+ },
+ },
+] as MockMethod[];
diff --git a/td_fronted/package-lock.json b/td_fronted/package-lock.json
new file mode 100644
index 0000000000..5022543a48
--- /dev/null
+++ b/td_fronted/package-lock.json
@@ -0,0 +1,10719 @@
+{
+ "name": "td_fronted",
+ "version": "0.12.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "td_fronted",
+ "version": "0.12.0",
+ "dependencies": {
+ "@vueuse/core": "^12.3.0",
+ "axios": "^1.7.9",
+ "dayjs": "^1.11.13",
+ "echarts": "5.4.3",
+ "lodash": "^4.17.21",
+ "nprogress": "^0.2.0",
+ "pinia": "2.1.7",
+ "pinia-plugin-persistedstate": "^3.2.0",
+ "qrcode.vue": "^3.4.1",
+ "qs": "^6.11.2",
+ "tdesign-icons-vue-next": "^0.3.3",
+ "tdesign-vue-next": "^1.10.6",
+ "tvision-color": "^1.6.0",
+ "vue": "^3.5.0",
+ "vue-i18n": "^9.9.1",
+ "vue-router": "~4.3.0"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^18.6.0",
+ "@commitlint/config-conventional": "^18.6.0",
+ "@types/echarts": "^4.9.21",
+ "@types/lodash": "^4.17.6",
+ "@types/mockjs": "^1.0.10",
+ "@types/nprogress": "^0.2.3",
+ "@types/qs": "^6.9.11",
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
+ "@typescript-eslint/parser": "^6.21.0",
+ "@vitejs/plugin-vue": "^5.0.4",
+ "@vitejs/plugin-vue-jsx": "^3.0.2",
+ "@vue/compiler-sfc": "~3.3.8",
+ "@vue/eslint-config-typescript": "^12.0.0",
+ "commitizen": "^4.3.0",
+ "cz-conventional-changelog": "^3.3.0",
+ "eslint": "^8.56.0",
+ "eslint-config-airbnb-base": "^15.0.0",
+ "eslint-config-prettier": "^9.0.0",
+ "eslint-plugin-import": "^2.29.1",
+ "eslint-plugin-prettier": "^5.1.3",
+ "eslint-plugin-simple-import-sort": "^12.0.0",
+ "eslint-plugin-vue": "^9.21.1",
+ "eslint-plugin-vue-scoped-css": "^2.7.2",
+ "husky": "^9.1.7",
+ "less": "^4.2.0",
+ "lint-staged": "^15.2.2",
+ "mockjs": "^1.1.0",
+ "postcss-html": "^1.6.0",
+ "postcss-less": "^6.0.0",
+ "prettier": "^3.2.5",
+ "stylelint": "~16.2.1",
+ "stylelint-config-standard": "^36.0.0",
+ "stylelint-order": "~6.0.4",
+ "typescript": "~5.4.3",
+ "vite": "^5.1.0",
+ "vite-plugin-mock": "^3.0.1",
+ "vite-svg-loader": "^5.1.0",
+ "vue-tsc": "^1.8.27"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
+ "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
+ "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.0",
+ "@babel/generator": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.0",
+ "@babel/parser": "^7.26.0",
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.26.0",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
+ "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.26.2",
+ "@babel/types": "^7.26.0",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
+ "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
+ "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
+ "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
+ "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
+ "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
+ "dependencies": {
+ "@babel/types": "^7.26.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz",
+ "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-syntax-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
+ "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime-corejs3": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz",
+ "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==",
+ "dependencies": {
+ "core-js-pure": "^3.20.2",
+ "regenerator-runtime": "^0.13.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
+ "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/generator": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.25.9",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
+ "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@commitlint/cli": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-18.6.1.tgz",
+ "integrity": "sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/format": "^18.6.1",
+ "@commitlint/lint": "^18.6.1",
+ "@commitlint/load": "^18.6.1",
+ "@commitlint/read": "^18.6.1",
+ "@commitlint/types": "^18.6.1",
+ "execa": "^5.0.0",
+ "lodash.isfunction": "^3.0.9",
+ "resolve-from": "5.0.0",
+ "resolve-global": "1.0.0",
+ "yargs": "^17.0.0"
+ },
+ "bin": {
+ "commitlint": "cli.js"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-conventional": {
+ "version": "18.6.3",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-18.6.3.tgz",
+ "integrity": "sha512-8ZrRHqF6je+TRaFoJVwszwnOXb/VeYrPmTwPhf0WxpzpGTcYy1p0SPyZ2eRn/sRi/obnWAcobtDAq6+gJQQNhQ==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^18.6.1",
+ "conventional-changelog-conventionalcommits": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-validator": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-18.6.1.tgz",
+ "integrity": "sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^18.6.1",
+ "ajv": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/ensure": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-18.6.1.tgz",
+ "integrity": "sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^18.6.1",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.kebabcase": "^4.1.1",
+ "lodash.snakecase": "^4.1.1",
+ "lodash.startcase": "^4.4.0",
+ "lodash.upperfirst": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/execute-rule": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-18.6.1.tgz",
+ "integrity": "sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==",
+ "dev": true,
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/format": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-18.6.1.tgz",
+ "integrity": "sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^18.6.1",
+ "chalk": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/is-ignored": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-18.6.1.tgz",
+ "integrity": "sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^18.6.1",
+ "semver": "7.6.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/lint": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-18.6.1.tgz",
+ "integrity": "sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/is-ignored": "^18.6.1",
+ "@commitlint/parse": "^18.6.1",
+ "@commitlint/rules": "^18.6.1",
+ "@commitlint/types": "^18.6.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/load": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-18.6.1.tgz",
+ "integrity": "sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/config-validator": "^18.6.1",
+ "@commitlint/execute-rule": "^18.6.1",
+ "@commitlint/resolve-extends": "^18.6.1",
+ "@commitlint/types": "^18.6.1",
+ "chalk": "^4.1.0",
+ "cosmiconfig": "^8.3.6",
+ "cosmiconfig-typescript-loader": "^5.0.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "lodash.uniq": "^4.5.0",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/message": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-18.6.1.tgz",
+ "integrity": "sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==",
+ "dev": true,
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/parse": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-18.6.1.tgz",
+ "integrity": "sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^18.6.1",
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-commits-parser": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/read": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-18.6.1.tgz",
+ "integrity": "sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/top-level": "^18.6.1",
+ "@commitlint/types": "^18.6.1",
+ "git-raw-commits": "^2.0.11",
+ "minimist": "^1.2.6"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/resolve-extends": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-18.6.1.tgz",
+ "integrity": "sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/config-validator": "^18.6.1",
+ "@commitlint/types": "^18.6.1",
+ "import-fresh": "^3.0.0",
+ "lodash.mergewith": "^4.6.2",
+ "resolve-from": "^5.0.0",
+ "resolve-global": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/rules": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-18.6.1.tgz",
+ "integrity": "sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/ensure": "^18.6.1",
+ "@commitlint/message": "^18.6.1",
+ "@commitlint/to-lines": "^18.6.1",
+ "@commitlint/types": "^18.6.1",
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/to-lines": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-18.6.1.tgz",
+ "integrity": "sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/top-level": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-18.6.1.tgz",
+ "integrity": "sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/types": {
+ "version": "18.6.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-18.6.1.tgz",
+ "integrity": "sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
+ "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^2.4.1"
+ }
+ },
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
+ "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ }
+ },
+ "node_modules/@csstools/media-query-list-parser": {
+ "version": "2.1.13",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
+ "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^2.7.1",
+ "@csstools/css-tokenizer": "^2.4.1"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz",
+ "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^6.0.13"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
+ "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
+ "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
+ "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
+ "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
+ "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
+ "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
+ "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
+ "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
+ "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
+ "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
+ "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
+ "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
+ "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
+ "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
+ "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
+ "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
+ "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
+ "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
+ "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
+ "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "dev": true
+ },
+ "node_modules/@intlify/core-base": {
+ "version": "9.14.1",
+ "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.1.tgz",
+ "integrity": "sha512-rG5/hlNW6Qfve41go37szEf0mVLcfhYuOu83JcY0jZKasnwsrcZYYWDzebCcuO5I/6Sy1JFWo9p+nvkQS1Dy+w==",
+ "dependencies": {
+ "@intlify/message-compiler": "9.14.1",
+ "@intlify/shared": "9.14.1"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/message-compiler": {
+ "version": "9.14.1",
+ "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.1.tgz",
+ "integrity": "sha512-MY8hwukJBnXvGAncVKlHsqKDQ5ZcQx4peqEmI8wBUTXn4pezrtTGYXNoz81cLyEEHB+L/zlKWVBSh5TiX4gYoQ==",
+ "dependencies": {
+ "@intlify/shared": "9.14.1",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/shared": {
+ "version": "9.14.1",
+ "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.1.tgz",
+ "integrity": "sha512-XjHu6PEQup9MnP1x0W9y0nXXfq9jFftAYSfV11hryjtH4XqXP8HrzMvXI+ZVifF+jZLszaTzIhvukllplxTQTg==",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@material/material-color-utilities": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.1.2.tgz",
+ "integrity": "sha512-uKkkx7Xo1AZJR0eMjH902rAb0vEjDbb3tgXt0cC3SHbpDGkPNhkuDKtxnw147axOM6uKuI7vywHRQlDrjDGhCA=="
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgr/core": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
+ "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz",
+ "integrity": "sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz",
+ "integrity": "sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz",
+ "integrity": "sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz",
+ "integrity": "sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz",
+ "integrity": "sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz",
+ "integrity": "sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz",
+ "integrity": "sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz",
+ "integrity": "sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz",
+ "integrity": "sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz",
+ "integrity": "sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz",
+ "integrity": "sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz",
+ "integrity": "sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz",
+ "integrity": "sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz",
+ "integrity": "sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz",
+ "integrity": "sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz",
+ "integrity": "sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz",
+ "integrity": "sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz",
+ "integrity": "sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@types/echarts": {
+ "version": "4.9.22",
+ "resolved": "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.22.tgz",
+ "integrity": "sha512-7Fo6XdWpoi8jxkwP7BARUOM7riq8bMhmsCtSG8gzUcJmFhLo387tihoBYS/y5j7jl3PENT5RxeWZdN9RiwO7HQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/zrender": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.13",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz",
+ "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==",
+ "dev": true
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
+ "dev": true
+ },
+ "node_modules/@types/mockjs": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@types/mockjs/-/mockjs-1.0.10.tgz",
+ "integrity": "sha512-SXgrhajHG7boLv6oU93CcmdDm0HYRiceuz6b+7z+/2lCJPTWDv0V5YiwFHT2ejE4bQqgSXQiVPQYPWv7LGsK1g==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "22.8.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.6.tgz",
+ "integrity": "sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~6.19.8"
+ }
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true
+ },
+ "node_modules/@types/nprogress": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.3.tgz",
+ "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==",
+ "dev": true
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.16",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz",
+ "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==",
+ "dev": true
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.8",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
+ "dev": true
+ },
+ "node_modules/@types/sortablejs": {
+ "version": "1.15.8",
+ "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.8.tgz",
+ "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg=="
+ },
+ "node_modules/@types/tinycolor2": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz",
+ "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw=="
+ },
+ "node_modules/@types/validator": {
+ "version": "13.12.2",
+ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz",
+ "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA=="
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.20",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
+ "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
+ },
+ "node_modules/@types/zrender": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@types/zrender/-/zrender-4.0.6.tgz",
+ "integrity": "sha512-1jZ9bJn2BsfmYFPBHtl5o3uV+ILejAtGrDcYSpT4qaVKEI/0YY+arw3XHU04Ebd8Nca3SQ7uNcLaqiL+tTFVMg==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
+ "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/type-utils": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
+ "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
+ "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
+ "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
+ "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
+ "dev": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
+ "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "9.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
+ "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
+ "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz",
+ "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==",
+ "dev": true,
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue-jsx": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz",
+ "integrity": "sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.23.3",
+ "@babel/plugin-transform-typescript": "^7.23.3",
+ "@vue/babel-plugin-jsx": "^1.1.5"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.0.0 || ^5.0.0",
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@volar/language-core": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz",
+ "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==",
+ "dev": true,
+ "dependencies": {
+ "@volar/source-map": "1.11.1"
+ }
+ },
+ "node_modules/@volar/source-map": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz",
+ "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==",
+ "dev": true,
+ "dependencies": {
+ "muggle-string": "^0.3.1"
+ }
+ },
+ "node_modules/@volar/typescript": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz",
+ "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==",
+ "dev": true,
+ "dependencies": {
+ "@volar/language-core": "1.11.1",
+ "path-browserify": "^1.0.1"
+ }
+ },
+ "node_modules/@vue/babel-helper-vue-transform-on": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz",
+ "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==",
+ "dev": true
+ },
+ "node_modules/@vue/babel-plugin-jsx": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz",
+ "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/plugin-syntax-jsx": "^7.24.7",
+ "@babel/template": "^7.25.0",
+ "@babel/traverse": "^7.25.6",
+ "@babel/types": "^7.25.6",
+ "@vue/babel-helper-vue-transform-on": "1.2.5",
+ "@vue/babel-plugin-resolve-type": "1.2.5",
+ "html-tags": "^3.3.1",
+ "svg-tags": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz",
+ "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.8",
+ "@babel/parser": "^7.25.6",
+ "@vue/compiler-sfc": "^3.5.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-core": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz",
+ "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/shared": "3.5.12",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-dom": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz",
+ "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-core": "3.5.12",
+ "@vue/shared": "3.5.12"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-sfc": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz",
+ "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/compiler-core": "3.5.12",
+ "@vue/compiler-dom": "3.5.12",
+ "@vue/compiler-ssr": "3.5.12",
+ "@vue/shared": "3.5.12",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.11",
+ "postcss": "^8.4.47",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-ssr": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz",
+ "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.12",
+ "@vue/shared": "3.5.12"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/shared": {
+ "version": "3.5.12",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
+ "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==",
+ "dev": true
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.3.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.13.tgz",
+ "integrity": "sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.23.5",
+ "@vue/shared": "3.3.13",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.3.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.13.tgz",
+ "integrity": "sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-core": "3.3.13",
+ "@vue/shared": "3.3.13"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.3.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.13.tgz",
+ "integrity": "sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.23.5",
+ "@vue/compiler-core": "3.3.13",
+ "@vue/compiler-dom": "3.3.13",
+ "@vue/compiler-ssr": "3.3.13",
+ "@vue/reactivity-transform": "3.3.13",
+ "@vue/shared": "3.3.13",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.5",
+ "postcss": "^8.4.32",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.3.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.13.tgz",
+ "integrity": "sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.3.13",
+ "@vue/shared": "3.3.13"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
+ },
+ "node_modules/@vue/eslint-config-typescript": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz",
+ "integrity": "sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "^6.7.0",
+ "@typescript-eslint/parser": "^6.7.0",
+ "vue-eslint-parser": "^9.3.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0",
+ "eslint-plugin-vue": "^9.0.0",
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/language-core": {
+ "version": "1.8.27",
+ "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz",
+ "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==",
+ "dev": true,
+ "dependencies": {
+ "@volar/language-core": "~1.11.1",
+ "@volar/source-map": "~1.11.1",
+ "@vue/compiler-dom": "^3.3.0",
+ "@vue/shared": "^3.3.0",
+ "computeds": "^0.0.1",
+ "minimatch": "^9.0.3",
+ "muggle-string": "^0.3.1",
+ "path-browserify": "^1.0.1",
+ "vue-template-compiler": "^2.7.14"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz",
+ "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
+ "dependencies": {
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/reactivity-transform": {
+ "version": "3.3.13",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.13.tgz",
+ "integrity": "sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.23.5",
+ "@vue/compiler-core": "3.3.13",
+ "@vue/shared": "3.3.13",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.5"
+ }
+ },
+ "node_modules/@vue/reactivity/node_modules/@vue/shared": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+ "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/runtime-core/node_modules/@vue/shared": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+ "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
+ "dependencies": {
+ "@vue/reactivity": "3.5.13",
+ "@vue/runtime-core": "3.5.13",
+ "@vue/shared": "3.5.13",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/runtime-dom/node_modules/@vue/shared": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+ "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.13",
+ "@vue/shared": "3.5.13"
+ },
+ "peerDependencies": {
+ "vue": "3.5.13"
+ }
+ },
+ "node_modules/@vue/server-renderer/node_modules/@vue/compiler-core": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+ "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/shared": "3.5.13",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/server-renderer/node_modules/@vue/compiler-dom": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+ "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/server-renderer/node_modules/@vue/compiler-ssr": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+ "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/@vue/server-renderer/node_modules/@vue/shared": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.3.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.13.tgz",
+ "integrity": "sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==",
+ "dev": true
+ },
+ "node_modules/@vueuse/core": {
+ "version": "12.5.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-12.5.0.tgz",
+ "integrity": "sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.20",
+ "@vueuse/metadata": "12.5.0",
+ "@vueuse/shared": "12.5.0",
+ "vue": "^3.5.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "12.5.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-12.5.0.tgz",
+ "integrity": "sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "12.5.0",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-12.5.0.tgz",
+ "integrity": "sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==",
+ "dependencies": {
+ "vue": "^3.5.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
+ "dev": true
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.2.1",
+ "get-intrinsic": "^1.2.3",
+ "is-array-buffer": "^3.0.4",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true,
+ "bin": {
+ "atob": "bin/atob.js"
+ },
+ "engines": {
+ "node": ">= 4.5.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.7.9",
+ "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/bezier-easing": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz",
+ "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig=="
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
+ "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001669",
+ "electron-to-chromium": "^1.5.41",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/bundle-require": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.2.1.tgz",
+ "integrity": "sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==",
+ "dev": true,
+ "dependencies": {
+ "load-tsconfig": "^0.2.3"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.17"
+ }
+ },
+ "node_modules/cachedir": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
+ "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001676",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001676.tgz",
+ "integrity": "sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chroma-js": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.1.2.tgz",
+ "integrity": "sha512-ri/ouYDWuxfus3UcaMxC1Tfp3IE9K5iQzxc2hSxbBRVNQFut1UuGAsZmiAf2mOUubzGJwgMSv9lHg+XqLaz1QQ==",
+ "dependencies": {
+ "cross-env": "^6.0.3"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+ "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true
+ },
+ "node_modules/cli-truncate/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/commitizen": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz",
+ "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==",
+ "dev": true,
+ "dependencies": {
+ "cachedir": "2.3.0",
+ "cz-conventional-changelog": "3.3.0",
+ "dedent": "0.7.0",
+ "detect-indent": "6.1.0",
+ "find-node-modules": "^2.1.2",
+ "find-root": "1.1.0",
+ "fs-extra": "9.1.0",
+ "glob": "7.2.3",
+ "inquirer": "8.2.5",
+ "is-utf8": "^0.2.1",
+ "lodash": "4.17.21",
+ "minimist": "1.2.7",
+ "strip-bom": "4.0.0",
+ "strip-json-comments": "3.1.1"
+ },
+ "bin": {
+ "commitizen": "bin/commitizen",
+ "cz": "bin/git-cz",
+ "git-cz": "bin/git-cz"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/commitizen/node_modules/minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/compare-func": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
+ "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
+ "dev": true,
+ "dependencies": {
+ "array-ify": "^1.0.0",
+ "dot-prop": "^5.1.0"
+ }
+ },
+ "node_modules/computeds": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz",
+ "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "dev": true
+ },
+ "node_modules/connect": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
+ "utils-merge": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/connect/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/connect/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/conventional-changelog-angular": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
+ "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==",
+ "dev": true,
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-changelog-conventionalcommits": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz",
+ "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==",
+ "dev": true,
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-commit-types": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz",
+ "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==",
+ "dev": true
+ },
+ "node_modules/conventional-commits-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
+ "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==",
+ "dev": true,
+ "dependencies": {
+ "is-text-path": "^2.0.0",
+ "JSONStream": "^1.3.5",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "conventional-commits-parser": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/copy-anything": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
+ "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "dependencies": {
+ "is-what": "^3.14.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.39.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz",
+ "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dev": true,
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cosmiconfig-typescript-loader": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.1.0.tgz",
+ "integrity": "sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==",
+ "dev": true,
+ "dependencies": {
+ "jiti": "^1.21.6"
+ },
+ "engines": {
+ "node": ">=v16"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "cosmiconfig": ">=8.2",
+ "typescript": ">=4"
+ }
+ },
+ "node_modules/cross-env": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz",
+ "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==",
+ "dependencies": {
+ "cross-spawn": "^7.0.0"
+ },
+ "bin": {
+ "cross-env": "src/bin/cross-env.js",
+ "cross-env-shell": "src/bin/cross-env-shell.js"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz",
+ "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "source-map": "^0.6.1",
+ "source-map-resolve": "^0.6.0"
+ }
+ },
+ "node_modules/css-functions-list": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
+ "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12 || >=16"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "dev": true,
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "dev": true
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/cz-conventional-changelog": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz",
+ "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.1",
+ "commitizen": "^4.0.3",
+ "conventional-commit-types": "^3.0.0",
+ "lodash.map": "^4.5.1",
+ "longest": "^2.0.1",
+ "word-wrap": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@commitlint/load": ">6.1.1"
+ }
+ },
+ "node_modules/cz-conventional-changelog/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cz-conventional-changelog/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cz-conventional-changelog/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/cz-conventional-changelog/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/cz-conventional-changelog/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/cz-conventional-changelog/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cz-conventional-changelog/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/dargs": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
+ "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.13",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+ },
+ "node_modules/de-indent": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+ "dev": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decamelize-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+ "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
+ "dev": true,
+ "dependencies": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decode-uri-component": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+ "dev": true
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
+ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/echarts": {
+ "version": "5.4.3",
+ "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz",
+ "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==",
+ "dependencies": {
+ "tslib": "2.3.0",
+ "zrender": "5.4.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.50",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz",
+ "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+ "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "arraybuffer.prototype.slice": "^1.0.3",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "data-view-buffer": "^1.0.1",
+ "data-view-byte-length": "^1.0.1",
+ "data-view-byte-offset": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.0.3",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.4",
+ "get-symbol-description": "^1.0.2",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.0.7",
+ "is-array-buffer": "^3.0.4",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.1",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.3",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.13",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.5",
+ "regexp.prototype.flags": "^1.5.2",
+ "safe-array-concat": "^1.1.2",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.trim": "^1.2.9",
+ "string.prototype.trimend": "^1.0.8",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-length": "^1.0.1",
+ "typed-array-byte-offset": "^1.0.2",
+ "typed-array-length": "^1.0.6",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.4",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
+ "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "peer": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.24.0",
+ "@esbuild/android-arm": "0.24.0",
+ "@esbuild/android-arm64": "0.24.0",
+ "@esbuild/android-x64": "0.24.0",
+ "@esbuild/darwin-arm64": "0.24.0",
+ "@esbuild/darwin-x64": "0.24.0",
+ "@esbuild/freebsd-arm64": "0.24.0",
+ "@esbuild/freebsd-x64": "0.24.0",
+ "@esbuild/linux-arm": "0.24.0",
+ "@esbuild/linux-arm64": "0.24.0",
+ "@esbuild/linux-ia32": "0.24.0",
+ "@esbuild/linux-loong64": "0.24.0",
+ "@esbuild/linux-mips64el": "0.24.0",
+ "@esbuild/linux-ppc64": "0.24.0",
+ "@esbuild/linux-riscv64": "0.24.0",
+ "@esbuild/linux-s390x": "0.24.0",
+ "@esbuild/linux-x64": "0.24.0",
+ "@esbuild/netbsd-x64": "0.24.0",
+ "@esbuild/openbsd-arm64": "0.24.0",
+ "@esbuild/openbsd-x64": "0.24.0",
+ "@esbuild/sunos-x64": "0.24.0",
+ "@esbuild/win32-arm64": "0.24.0",
+ "@esbuild/win32-ia32": "0.24.0",
+ "@esbuild/win32-x64": "0.24.0"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-compat-utils": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+ "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-config-airbnb-base": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
+ "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
+ "dev": true,
+ "dependencies": {
+ "confusing-browser-globals": "^1.0.10",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.32.0 || ^8.2.0",
+ "eslint-plugin-import": "^2.25.2"
+ }
+ },
+ "node_modules/eslint-config-airbnb-base/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
+ "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+ "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.31.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
+ "dev": true,
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.8",
+ "array.prototype.findlastindex": "^1.2.5",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.0",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.15.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.0",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.8",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz",
+ "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0",
+ "synckit": "^0.9.1"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-plugin-prettier"
+ },
+ "peerDependencies": {
+ "@types/eslint": ">=8.0.0",
+ "eslint": ">=8.0.0",
+ "eslint-config-prettier": "*",
+ "prettier": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/eslint": {
+ "optional": true
+ },
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-simple-import-sort": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz",
+ "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=5.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-vue": {
+ "version": "9.30.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.30.0.tgz",
+ "integrity": "sha512-CyqlRgShvljFkOeYK8wN5frh/OGTvkj1S7wlr2Q2pUvwq+X5VYiLd6ZjujpgSgLnys2W8qrBLkXQ41SUYaoPIQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "globals": "^13.24.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.1.1",
+ "postcss-selector-parser": "^6.0.15",
+ "semver": "^7.6.3",
+ "vue-eslint-parser": "^9.4.3",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-vue-scoped-css": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue-scoped-css/-/eslint-plugin-vue-scoped-css-2.8.1.tgz",
+ "integrity": "sha512-V6B+zZE60ykYvHTDzdhJ3xa4C83ntmGXqFsylc8l1jdVR9PSgod2+bGFNL7OwRKgZj82ij/o904xa04z1bfCRA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "eslint-compat-utils": "^0.5.0",
+ "lodash": "^4.17.21",
+ "postcss": "^8.4.31",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-scss": "^4.0.3",
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-styl": "^0.12.0"
+ },
+ "engines": {
+ "node": "^12.22 || ^14.17 || >=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "eslint": ">=5.0.0",
+ "vue-eslint-parser": ">=7.1.0"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "dev": true
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==",
+ "dev": true,
+ "dependencies": {
+ "homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dev": true,
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
+ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
+ "dev": true
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/figures/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/find-node-modules": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz",
+ "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==",
+ "dev": true,
+ "dependencies": {
+ "findup-sync": "^4.0.0",
+ "merge": "^2.1.1"
+ }
+ },
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
+ "dev": true
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/findup-sync": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
+ "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
+ "dev": true,
+ "dependencies": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "micromatch": "^4.0.2",
+ "resolve-dir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/git-raw-commits": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz",
+ "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==",
+ "dev": true,
+ "dependencies": {
+ "dargs": "^7.0.0",
+ "lodash": "^4.17.15",
+ "meow": "^8.0.0",
+ "split2": "^3.0.0",
+ "through2": "^4.0.0"
+ },
+ "bin": {
+ "git-raw-commits": "cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/git-raw-commits/node_modules/meow": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
+ "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/git-raw-commits/node_modules/split2": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
+ "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "^3.0.0"
+ }
+ },
+ "node_modules/git-raw-commits/node_modules/type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/git-raw-commits/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==",
+ "dev": true,
+ "dependencies": {
+ "ini": "^1.3.4"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globjoin": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
+ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
+ "dev": true
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "dependencies": {
+ "parse-passwd": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hosted-git-info/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hosted-git-info/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "9.1.7",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
+ "dev": true,
+ "bin": {
+ "husky": "bin.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/image-size": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+ "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "node_modules/inquirer": {
+ "version": "8.2.5",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz",
+ "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.1",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^5.4.1",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.5.5",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "dev": true,
+ "dependencies": {
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-text-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
+ "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
+ "dev": true,
+ "dependencies": {
+ "text-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "dev": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==",
+ "dev": true
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/jiti": {
+ "version": "1.21.6",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
+ "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ]
+ },
+ "node_modules/JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+ "dev": true,
+ "dependencies": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ },
+ "bin": {
+ "JSONStream": "bin.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/known-css-properties": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
+ "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
+ "dev": true
+ },
+ "node_modules/less": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
+ "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
+ "dev": true,
+ "dependencies": {
+ "copy-anything": "^2.0.1",
+ "parse-node-version": "^1.0.1",
+ "tslib": "^2.3.0"
+ },
+ "bin": {
+ "lessc": "bin/lessc"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "optionalDependencies": {
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "image-size": "~0.5.0",
+ "make-dir": "^2.1.0",
+ "mime": "^1.4.1",
+ "needle": "^3.1.0",
+ "source-map": "~0.6.0"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+ "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/lint-staged": {
+ "version": "15.2.10",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz",
+ "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "~5.3.0",
+ "commander": "~12.1.0",
+ "debug": "~4.3.6",
+ "execa": "~8.0.1",
+ "lilconfig": "~3.1.2",
+ "listr2": "~8.2.4",
+ "micromatch": "~4.0.8",
+ "pidtree": "~0.6.0",
+ "string-argv": "~0.3.2",
+ "yaml": "~2.5.0"
+ },
+ "bin": {
+ "lint-staged": "bin/lint-staged.js"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/lint-staged"
+ }
+ },
+ "node_modules/lint-staged/node_modules/chalk": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+ "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+ "dev": true,
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/lint-staged/node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/lint-staged/node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/lint-staged/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lint-staged/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/lint-staged/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/listr2": {
+ "version": "8.2.5",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz",
+ "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^4.0.0",
+ "colorette": "^2.0.20",
+ "eventemitter3": "^5.0.1",
+ "log-update": "^6.1.0",
+ "rfdc": "^1.4.1",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/listr2/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/listr2/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/listr2/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true
+ },
+ "node_modules/listr2/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/listr2/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/listr2/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/load-tsconfig": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
+ "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "dev": true
+ },
+ "node_modules/lodash.isfunction": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
+ "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==",
+ "dev": true
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "dev": true
+ },
+ "node_modules/lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+ "dev": true
+ },
+ "node_modules/lodash.map": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
+ "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "dev": true
+ },
+ "node_modules/lodash.snakecase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
+ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
+ "dev": true
+ },
+ "node_modules/lodash.sortedlastindex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortedlastindex/-/lodash.sortedlastindex-4.1.0.tgz",
+ "integrity": "sha512-s8xEQdsp2Tu5zUqVdFSe9C0kR8YlnAJYLqMdkh+pIRBRxF6/apWseLdHl3/+jv2I61dhPwtI/Ff+EqvCpc+N8w==",
+ "dev": true
+ },
+ "node_modules/lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+ "dev": true
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "dev": true
+ },
+ "node_modules/lodash.upperfirst": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
+ "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
+ "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^7.0.0",
+ "cli-cursor": "^5.0.0",
+ "slice-ansi": "^7.1.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-escapes": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
+ "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+ "dev": true,
+ "dependencies": {
+ "environment": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true
+ },
+ "node_modules/log-update/node_modules/is-fullwidth-code-point": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
+ "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
+ "dev": true,
+ "dependencies": {
+ "get-east-asian-width": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
+ "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "is-fullwidth-code-point": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/longest": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz",
+ "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.12",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
+ "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/map-obj": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mathml-tag-names": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+ "dev": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "dev": true
+ },
+ "node_modules/meow": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
+ "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz",
+ "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
+ "dev": true
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "dev": true,
+ "dependencies": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
+ },
+ "node_modules/mockjs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mockjs/-/mockjs-1.1.0.tgz",
+ "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
+ "dev": true,
+ "dependencies": {
+ "commander": "*"
+ },
+ "bin": {
+ "random": "bin/random"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/muggle-string": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz",
+ "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==",
+ "dev": true
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/needle": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
+ "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/needle/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
+ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
+ "dev": true
+ },
+ "node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nprogress": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
+ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+ "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "dev": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+ "dev": true
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-to-regexp": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pidtree": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "dev": true,
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pinia": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz",
+ "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.5.0",
+ "vue-demi": ">=0.14.5"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.4.0",
+ "typescript": ">=4.4.4",
+ "vue": "^2.6.14 || ^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pinia-plugin-persistedstate": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.3.tgz",
+ "integrity": "sha512-Cm819WBj/s5K5DGw55EwbXDtx+EZzM0YR5AZbq9XE3u0xvXwvX2JnWoFpWIcdzISBHqy9H1UiSIUmXyXqWsQRQ==",
+ "peerDependencies": {
+ "pinia": "^2.0.0"
+ }
+ },
+ "node_modules/pinia/node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.49",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
+ "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-html": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.7.0.tgz",
+ "integrity": "sha512-MfcMpSUIaR/nNgeVS8AyvyDugXlADjN9AcV7e5rDfrF1wduIAGSkL4q2+wgrZgA3sHVAHLDO9FuauHhZYW2nBw==",
+ "dev": true,
+ "dependencies": {
+ "htmlparser2": "^8.0.0",
+ "js-tokens": "^9.0.0",
+ "postcss": "^8.4.0",
+ "postcss-safe-parser": "^6.0.0"
+ },
+ "engines": {
+ "node": "^12 || >=14"
+ }
+ },
+ "node_modules/postcss-html/node_modules/js-tokens": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz",
+ "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==",
+ "dev": true
+ },
+ "node_modules/postcss-less": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz",
+ "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.5"
+ }
+ },
+ "node_modules/postcss-resolve-nested-selector": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz",
+ "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==",
+ "dev": true
+ },
+ "node_modules/postcss-safe-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+ "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3"
+ }
+ },
+ "node_modules/postcss-scss": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz",
+ "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-scss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.29"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-sorting": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz",
+ "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==",
+ "dev": true,
+ "peerDependencies": {
+ "postcss": "^8.4.20"
+ }
+ },
+ "node_modules/postcss-styl": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/postcss-styl/-/postcss-styl-0.12.3.tgz",
+ "integrity": "sha512-8I7Cd8sxiEITIp32xBK4K/Aj1ukX6vuWnx8oY/oAH35NfQI4OZaY5nd68Yx8HeN5S49uhQ6DL0rNk0ZBu/TaLg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "fast-diff": "^1.2.0",
+ "lodash.sortedlastindex": "^4.1.0",
+ "postcss": "^7.0.27 || ^8.0.0",
+ "stylus": "^0.57.0"
+ },
+ "engines": {
+ "node": "^8.10.0 || ^10.13.0 || ^11.10.1 || >=12.13.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/stylus"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode.vue": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-3.5.1.tgz",
+ "integrity": "sha512-Mek5hpUgYP2KsRW4mnyPMUttknuXSe37UorUzymYi3rr/74rV0aTvejl2gF2phrxwAEm6zhpSvkGzIxftxj5Tg==",
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/read-pkg/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/regexp.prototype.flags": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
+ "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-global": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz",
+ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==",
+ "dev": true,
+ "dependencies": {
+ "global-dirs": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.24.3",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz",
+ "integrity": "sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.24.3",
+ "@rollup/rollup-android-arm64": "4.24.3",
+ "@rollup/rollup-darwin-arm64": "4.24.3",
+ "@rollup/rollup-darwin-x64": "4.24.3",
+ "@rollup/rollup-freebsd-arm64": "4.24.3",
+ "@rollup/rollup-freebsd-x64": "4.24.3",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.24.3",
+ "@rollup/rollup-linux-arm-musleabihf": "4.24.3",
+ "@rollup/rollup-linux-arm64-gnu": "4.24.3",
+ "@rollup/rollup-linux-arm64-musl": "4.24.3",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.24.3",
+ "@rollup/rollup-linux-riscv64-gnu": "4.24.3",
+ "@rollup/rollup-linux-s390x-gnu": "4.24.3",
+ "@rollup/rollup-linux-x64-gnu": "4.24.3",
+ "@rollup/rollup-linux-x64-musl": "4.24.3",
+ "@rollup/rollup-win32-arm64-msvc": "4.24.3",
+ "@rollup/rollup-win32-ia32-msvc": "4.24.3",
+ "@rollup/rollup-win32-x64-msvc": "4.24.3",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/sax": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/semver": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/sortablejs": {
+ "version": "1.15.3",
+ "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.3.tgz",
+ "integrity": "sha512-zdK3/kwwAK1cJgy1rwl1YtNTbRmc8qW/+vgXf75A7NHag5of4pyI6uK86ktmQETyWRH7IGaE73uZOOBcGxgqZg=="
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-resolve": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz",
+ "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==",
+ "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
+ "dev": true,
+ "dependencies": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.20",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
+ "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
+ "dev": true
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-argv": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+ "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+ "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stylelint": {
+ "version": "16.2.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.2.1.tgz",
+ "integrity": "sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA==",
+ "dev": true,
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^2.5.0",
+ "@csstools/css-tokenizer": "^2.2.3",
+ "@csstools/media-query-list-parser": "^2.1.7",
+ "@csstools/selector-specificity": "^3.0.1",
+ "balanced-match": "^2.0.0",
+ "colord": "^2.9.3",
+ "cosmiconfig": "^9.0.0",
+ "css-functions-list": "^3.2.1",
+ "css-tree": "^2.3.1",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "fastest-levenshtein": "^1.0.16",
+ "file-entry-cache": "^8.0.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.1.0",
+ "globjoin": "^0.1.4",
+ "html-tags": "^3.3.1",
+ "ignore": "^5.3.0",
+ "imurmurhash": "^0.1.4",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.29.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^13.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.33",
+ "postcss-resolve-nested-selector": "^0.1.1",
+ "postcss-safe-parser": "^7.0.0",
+ "postcss-selector-parser": "^6.0.15",
+ "postcss-value-parser": "^4.2.0",
+ "resolve-from": "^5.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^7.1.0",
+ "supports-hyperlinks": "^3.0.0",
+ "svg-tags": "^1.0.0",
+ "table": "^6.8.1",
+ "write-file-atomic": "^5.0.1"
+ },
+ "bin": {
+ "stylelint": "bin/stylelint.mjs"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ }
+ },
+ "node_modules/stylelint-config-recommended": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz",
+ "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/stylelint"
+ }
+ ],
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "peerDependencies": {
+ "stylelint": "^16.1.0"
+ }
+ },
+ "node_modules/stylelint-config-standard": {
+ "version": "36.0.1",
+ "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz",
+ "integrity": "sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/stylelint"
+ }
+ ],
+ "dependencies": {
+ "stylelint-config-recommended": "^14.0.1"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "peerDependencies": {
+ "stylelint": "^16.1.0"
+ }
+ },
+ "node_modules/stylelint-order": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz",
+ "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^8.4.32",
+ "postcss-sorting": "^8.0.2"
+ },
+ "peerDependencies": {
+ "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1"
+ }
+ },
+ "node_modules/stylelint/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/stylelint/node_modules/balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "dev": true
+ },
+ "node_modules/stylelint/node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/stylelint/node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/stylelint/node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/stylelint/node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stylelint/node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dev": true,
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stylelint/node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stylelint/node_modules/postcss-safe-parser": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz",
+ "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/stylelint/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/stylelint/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/stylus": {
+ "version": "0.57.0",
+ "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz",
+ "integrity": "sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==",
+ "dev": true,
+ "dependencies": {
+ "css": "^3.0.0",
+ "debug": "^4.3.2",
+ "glob": "^7.1.6",
+ "safer-buffer": "^2.1.2",
+ "sax": "~1.2.4",
+ "source-map": "^0.7.3"
+ },
+ "bin": {
+ "stylus": "bin/stylus"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/stylus/node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "node_modules/stylus/node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz",
+ "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+ "dev": true
+ },
+ "node_modules/svgo": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
+ "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
+ "dev": true,
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^2.3.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
+ "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
+ "dev": true,
+ "dependencies": {
+ "@pkgr/core": "^0.1.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/synckit/node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true
+ },
+ "node_modules/table": {
+ "version": "6.8.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
+ "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/table/node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/tdesign-icons-vue-next": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmmirror.com/tdesign-icons-vue-next/-/tdesign-icons-vue-next-0.3.4.tgz",
+ "integrity": "sha512-fKQ2GkZ1MxHw1BRGRJYcLhtpqRCndGctf0M1hOV9MHdFyasNNGatt81Kue6szRG9nWgYUktH7zHRwMsMK6fbWQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.16.3"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/tdesign-vue-next": {
+ "version": "1.10.7",
+ "resolved": "https://registry.npmmirror.com/tdesign-vue-next/-/tdesign-vue-next-1.10.7.tgz",
+ "integrity": "sha512-cbKd42Few8RXO2GMfZ/oJd8SaxzYWZQagpkHtSwTb6xh+E0vHyPOo/dr7h0u51zcVY/U9RhPRHsP01mvQrt2tQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.22.6",
+ "@popperjs/core": "^2.11.8",
+ "@types/lodash": "4.14.182",
+ "@types/sortablejs": "^1.15.1",
+ "@types/tinycolor2": "^1.4.3",
+ "@types/validator": "^13.7.17",
+ "dayjs": "1.11.10",
+ "lodash": "^4.17.21",
+ "mitt": "^3.0.1",
+ "sortablejs": "^1.15.0",
+ "tdesign-icons-vue-next": "^0.3.4",
+ "tinycolor2": "^1.6.0",
+ "validator": "^13.9.0"
+ },
+ "peerDependencies": {
+ "vue": ">=3.1.0"
+ }
+ },
+ "node_modules/tdesign-vue-next/node_modules/@types/lodash": {
+ "version": "4.14.182",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
+ "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="
+ },
+ "node_modules/tdesign-vue-next/node_modules/dayjs": {
+ "version": "1.11.10",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
+ "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+ },
+ "node_modules/text-extensions": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
+ "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "node_modules/through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "3"
+ }
+ },
+ "node_modules/tinycolor2": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/trim-newlines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz",
+ "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ },
+ "node_modules/tvision-color": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tvision-color/-/tvision-color-1.6.0.tgz",
+ "integrity": "sha512-pu8LkA4ZLBjbnmC9keqce4TLnExcQphKSoExauncSybmbqAhslXQvGdsI/FeWpxItGa4mcjGsHz5YE8bjpLjRw==",
+ "dependencies": {
+ "@babel/runtime-corejs3": "7.18.9",
+ "@material/material-color-utilities": "0.1.2",
+ "bezier-easing": "^2.1.0",
+ "chroma-js": "2.1.2"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+ "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
+ "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
+ "devOptional": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+ "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/validator": {
+ "version": "13.12.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz",
+ "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.10",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz",
+ "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-mock": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/vite-plugin-mock/-/vite-plugin-mock-3.0.2.tgz",
+ "integrity": "sha512-bD//HvkTygGmk+LsIAdf0jGNlCv4iWv0kZlH9UEgWT6QYoUwfjQAE4SKxHRw2tfLgVhbPQVv/+X3YlNWvueGUA==",
+ "dev": true,
+ "dependencies": {
+ "bundle-require": "^4.0.1",
+ "chokidar": "^3.5.3",
+ "connect": "^3.7.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.2.12",
+ "path-to-regexp": "^6.2.1",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.17",
+ "mockjs": ">=1.1.0",
+ "vite": ">=4.0.0"
+ }
+ },
+ "node_modules/vite-svg-loader": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/vite-svg-loader/-/vite-svg-loader-5.1.0.tgz",
+ "integrity": "sha512-M/wqwtOEjgb956/+m5ZrYT/Iq6Hax0OakWbokj8+9PXOnB7b/4AxESHieEtnNEy7ZpjsjYW1/5nK8fATQMmRxw==",
+ "dev": true,
+ "dependencies": {
+ "svgo": "^3.0.2"
+ },
+ "peerDependencies": {
+ "vue": ">=3.2.13"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz",
+ "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/compiler-sfc": "3.5.13",
+ "@vue/runtime-dom": "3.5.13",
+ "@vue/server-renderer": "3.5.13",
+ "@vue/shared": "3.5.13"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-eslint-parser": {
+ "version": "9.4.3",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
+ "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "eslint-scope": "^7.1.1",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.6"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/vue-i18n": {
+ "version": "9.14.1",
+ "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.1.tgz",
+ "integrity": "sha512-xjxV0LYc1xQ8TbAVfIyZiOSS8qoU1R0YwV7V5I8I6Fd64+zvsTsdPgtylPsie3Vdt9wekeYhr+smKDeaK6RBuA==",
+ "dependencies": {
+ "@intlify/core-base": "9.14.1",
+ "@intlify/shared": "9.14.1",
+ "@vue/devtools-api": "^6.5.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.3.tgz",
+ "integrity": "sha512-8Q+u+WP4N2SXY38FDcF2H1dUEbYVHVPtPCPZj/GTZx8RCbiB8AtJP9+YIxn4Vs0svMTNQcLIzka4GH7Utkx9xQ==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.5.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/vue-template-compiler": {
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
+ "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==",
+ "dev": true,
+ "dependencies": {
+ "de-indent": "^1.0.2",
+ "he": "^1.2.0"
+ }
+ },
+ "node_modules/vue-tsc": {
+ "version": "1.8.27",
+ "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz",
+ "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==",
+ "dev": true,
+ "dependencies": {
+ "@volar/typescript": "~1.11.1",
+ "@vue/language-core": "1.8.27",
+ "semver": "^7.5.4"
+ },
+ "bin": {
+ "vue-tsc": "bin/vue-tsc.js"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ }
+ },
+ "node_modules/vue/node_modules/@vue/compiler-core": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+ "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/shared": "3.5.13",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/vue/node_modules/@vue/compiler-dom": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+ "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/vue/node_modules/@vue/compiler-sfc": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
+ "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
+ "dependencies": {
+ "@babel/parser": "^7.25.3",
+ "@vue/compiler-core": "3.5.13",
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/compiler-ssr": "3.5.13",
+ "@vue/shared": "3.5.13",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.11",
+ "postcss": "^8.4.48",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/vue/node_modules/@vue/compiler-ssr": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+ "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.13",
+ "@vue/shared": "3.5.13"
+ }
+ },
+ "node_modules/vue/node_modules/@vue/shared": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
+ "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/write-file-atomic/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz",
+ "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==",
+ "dev": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zrender": {
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz",
+ "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==",
+ "dependencies": {
+ "tslib": "2.3.0"
+ }
+ }
+ }
+}
diff --git a/td_fronted/package.json b/td_fronted/package.json
new file mode 100644
index 0000000000..5028bce4d1
--- /dev/null
+++ b/td_fronted/package.json
@@ -0,0 +1,99 @@
+{
+ "name": "td_fronted",
+ "version": "0.12.0",
+ "type": "module",
+ "scripts": {
+ "dev:mock": "vite --open --mode mock",
+ "dev": "vite --open --mode development",
+ "dev:linux": "vite --mode development",
+ "build:test": "vite build --mode test",
+ "build": "vue-tsc --noEmit && vite build --mode release",
+ "build:type": "vue-tsc --noEmit",
+ "build:site": "vue-tsc --noEmit && vite build --mode site",
+ "preview": "vite preview",
+ "lint": "eslint --ext .vue,.js,.jsx,.ts,.tsx ./ --max-warnings 0",
+ "lint:fix": "eslint --ext .vue,.js,jsx,.ts,.tsx ./ --max-warnings 0 --fix",
+ "stylelint": "stylelint src/**/*.{html,vue,sass,less}",
+ "stylelint:fix": "stylelint --fix src/**/*.{html,vue,css,sass,less}",
+ "prepare": "node -e \"if(require('fs').existsSync('.git')){process.exit(1)}\" || is-ci || husky install",
+ "site:preview": "npm run build && cp -r dist _site",
+ "test": "echo \"no test specified,work in process\"",
+ "test:coverage": "echo \"no test:coverage specified,work in process\""
+ },
+ "dependencies": {
+ "@vueuse/core": "^12.3.0",
+ "axios": "^1.7.9",
+ "dayjs": "^1.11.13",
+ "echarts": "5.4.3",
+ "lodash": "^4.17.21",
+ "nprogress": "^0.2.0",
+ "pinia": "2.1.7",
+ "pinia-plugin-persistedstate": "^3.2.0",
+ "qrcode.vue": "^3.4.1",
+ "qs": "^6.11.2",
+ "tdesign-icons-vue-next": "^0.3.3",
+ "tdesign-vue-next": "^1.10.6",
+ "tvision-color": "^1.6.0",
+ "vue": "^3.5.0",
+ "vue-i18n": "^9.9.1",
+ "vue-router": "~4.3.0"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^18.6.0",
+ "@commitlint/config-conventional": "^18.6.0",
+ "@types/echarts": "^4.9.21",
+ "@types/lodash": "^4.17.6",
+ "@types/mockjs": "^1.0.10",
+ "@types/nprogress": "^0.2.3",
+ "@types/qs": "^6.9.11",
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
+ "@typescript-eslint/parser": "^6.21.0",
+ "@vitejs/plugin-vue": "^5.0.4",
+ "@vitejs/plugin-vue-jsx": "^3.0.2",
+ "@vue/compiler-sfc": "~3.3.8",
+ "@vue/eslint-config-typescript": "^12.0.0",
+ "commitizen": "^4.3.0",
+ "cz-conventional-changelog": "^3.3.0",
+ "eslint": "^8.56.0",
+ "eslint-config-airbnb-base": "^15.0.0",
+ "eslint-config-prettier": "^9.0.0",
+ "eslint-plugin-import": "^2.29.1",
+ "eslint-plugin-prettier": "^5.1.3",
+ "eslint-plugin-simple-import-sort": "^12.0.0",
+ "eslint-plugin-vue": "^9.21.1",
+ "eslint-plugin-vue-scoped-css": "^2.7.2",
+ "husky": "^9.1.7",
+ "less": "^4.2.0",
+ "lint-staged": "^15.2.2",
+ "mockjs": "^1.1.0",
+ "postcss-html": "^1.6.0",
+ "postcss-less": "^6.0.0",
+ "prettier": "^3.2.5",
+ "stylelint": "~16.2.1",
+ "stylelint-config-standard": "^36.0.0",
+ "stylelint-order": "~6.0.4",
+ "typescript": "~5.4.3",
+ "vite": "^5.1.0",
+ "vite-plugin-mock": "^3.0.1",
+ "vite-svg-loader": "^5.1.0",
+ "vue-tsc": "^1.8.27"
+ },
+ "config": {
+ "commitizen": {
+ "path": "./node_modules/cz-conventional-changelog"
+ }
+ },
+ "lint-staged": {
+ "*.{js,jsx,vue,ts,tsx}": [
+ "prettier --write",
+ "npm run lint:fix"
+ ],
+ "*.{html,vue,css,sass,less}": [
+ "npm run stylelint:fix"
+ ]
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "description": "admin tample"
+}
\ No newline at end of file
diff --git a/td_fronted/public/favicon.ico b/td_fronted/public/favicon.ico
new file mode 100644
index 0000000000..086ac804a6
Binary files /dev/null and b/td_fronted/public/favicon.ico differ
diff --git a/td_fronted/src/App.vue b/td_fronted/src/App.vue
new file mode 100644
index 0000000000..b291f91e5a
--- /dev/null
+++ b/td_fronted/src/App.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/td_fronted/src/api/detail.ts b/td_fronted/src/api/detail.ts
new file mode 100644
index 0000000000..858c7ffa1e
--- /dev/null
+++ b/td_fronted/src/api/detail.ts
@@ -0,0 +1,19 @@
+import type { ProjectListResult, PurchaseListResult } from '@/api/model/detailModel';
+import { request } from '@/utils/request';
+
+const Api = {
+ PurchaseList: '/get-purchase-list',
+ ProjectList: '/get-project-list',
+};
+
+export function getPurchaseList() {
+ return request.get({
+ url: Api.PurchaseList,
+ });
+}
+
+export function getProjectList() {
+ return request.get({
+ url: Api.ProjectList,
+ });
+}
diff --git a/td_fronted/src/api/list.ts b/td_fronted/src/api/list.ts
new file mode 100644
index 0000000000..ab30e2b6d4
--- /dev/null
+++ b/td_fronted/src/api/list.ts
@@ -0,0 +1,19 @@
+import type { CardListResult, ListResult } from '@/api/model/listModel';
+import { request } from '@/utils/request';
+
+const Api = {
+ BaseList: '/get-list',
+ CardList: '/get-card-list',
+};
+
+export function getList() {
+ return request.get({
+ url: Api.BaseList,
+ });
+}
+
+export function getCardList() {
+ return request.get({
+ url: Api.CardList,
+ });
+}
diff --git a/td_fronted/src/api/model/detailModel.ts b/td_fronted/src/api/model/detailModel.ts
new file mode 100644
index 0000000000..c144b48889
--- /dev/null
+++ b/td_fronted/src/api/model/detailModel.ts
@@ -0,0 +1,23 @@
+export interface PurchaseListResult {
+ list: Array;
+}
+export interface PurchaseInfo {
+ adminName: string;
+ index: string;
+ pdName: string;
+ pdNum: string;
+ pdType: string;
+ purchaseNum: number;
+ updateTime: Date;
+}
+
+export interface ProjectListResult {
+ list: Array;
+}
+export interface ProjectInfo {
+ adminName: string;
+ adminPhone: string;
+ index: number;
+ name: string;
+ updateTime: Date;
+}
diff --git a/td_fronted/src/api/model/listModel.ts b/td_fronted/src/api/model/listModel.ts
new file mode 100644
index 0000000000..453114db6f
--- /dev/null
+++ b/td_fronted/src/api/model/listModel.ts
@@ -0,0 +1,26 @@
+export interface ListResult {
+ list: Array;
+}
+export interface ListModel {
+ adminName: string;
+ amount: string;
+ contractType: number;
+ index: number;
+ name: string;
+ no: string;
+ paymentType: number;
+ status: number;
+ updateTime: Date;
+}
+
+export interface CardListResult {
+ list: Array;
+}
+export interface CardList {
+ banner: string;
+ description: string;
+ index: number;
+ isSetup: boolean;
+ name: string;
+ type: number;
+}
diff --git a/td_fronted/src/api/model/permissionModel.ts b/td_fronted/src/api/model/permissionModel.ts
new file mode 100644
index 0000000000..dad83b9498
--- /dev/null
+++ b/td_fronted/src/api/model/permissionModel.ts
@@ -0,0 +1,22 @@
+import { defineComponent } from 'vue';
+
+import { RouteMeta } from '@/types/interface';
+
+export interface MenuListResult {
+ list: Array;
+}
+
+export type Component =
+ | ReturnType
+ | (() => Promise)
+ | (() => Promise);
+
+export interface RouteItem {
+ path: string;
+ name: string;
+ component?: Component | string;
+ components?: Component;
+ redirect?: string;
+ meta: RouteMeta;
+ children?: Array;
+}
diff --git a/td_fronted/src/api/permission.ts b/td_fronted/src/api/permission.ts
new file mode 100644
index 0000000000..a6f50d8762
--- /dev/null
+++ b/td_fronted/src/api/permission.ts
@@ -0,0 +1,12 @@
+import type { MenuListResult } from '@/api/model/permissionModel';
+import { request } from '@/utils/request';
+
+const Api = {
+ MenuList: '/get-menu-list-i18n',
+};
+
+export function getMenuList() {
+ return request.get({
+ url: Api.MenuList,
+ });
+}
diff --git a/td_fronted/src/assets/assets-empty.svg b/td_fronted/src/assets/assets-empty.svg
new file mode 100644
index 0000000000..374d27dbdc
--- /dev/null
+++ b/td_fronted/src/assets/assets-empty.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/td_fronted/src/assets/assets-login-bg-black.png b/td_fronted/src/assets/assets-login-bg-black.png
new file mode 100644
index 0000000000..b4dde4b65e
Binary files /dev/null and b/td_fronted/src/assets/assets-login-bg-black.png differ
diff --git a/td_fronted/src/assets/assets-login-bg-white.png b/td_fronted/src/assets/assets-login-bg-white.png
new file mode 100644
index 0000000000..4275549f05
Binary files /dev/null and b/td_fronted/src/assets/assets-login-bg-white.png differ
diff --git a/td_fronted/src/assets/assets-logo-full.svg b/td_fronted/src/assets/assets-logo-full.svg
new file mode 100644
index 0000000000..94f0049fbe
--- /dev/null
+++ b/td_fronted/src/assets/assets-logo-full.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/assets/assets-product-1.svg b/td_fronted/src/assets/assets-product-1.svg
new file mode 100644
index 0000000000..07c105e45c
--- /dev/null
+++ b/td_fronted/src/assets/assets-product-1.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-product-2.svg b/td_fronted/src/assets/assets-product-2.svg
new file mode 100644
index 0000000000..f6a13ac33c
--- /dev/null
+++ b/td_fronted/src/assets/assets-product-2.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-product-3.svg b/td_fronted/src/assets/assets-product-3.svg
new file mode 100644
index 0000000000..96f8c0e913
--- /dev/null
+++ b/td_fronted/src/assets/assets-product-3.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-product-4.svg b/td_fronted/src/assets/assets-product-4.svg
new file mode 100644
index 0000000000..6005e4cfec
--- /dev/null
+++ b/td_fronted/src/assets/assets-product-4.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-result-403.svg b/td_fronted/src/assets/assets-result-403.svg
new file mode 100644
index 0000000000..343a25ebd0
--- /dev/null
+++ b/td_fronted/src/assets/assets-result-403.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-result-404.svg b/td_fronted/src/assets/assets-result-404.svg
new file mode 100644
index 0000000000..db1cb366c4
--- /dev/null
+++ b/td_fronted/src/assets/assets-result-404.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-result-500.svg b/td_fronted/src/assets/assets-result-500.svg
new file mode 100644
index 0000000000..08784afce7
--- /dev/null
+++ b/td_fronted/src/assets/assets-result-500.svg
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-result-ie.svg b/td_fronted/src/assets/assets-result-ie.svg
new file mode 100644
index 0000000000..ebaf5ba3e1
--- /dev/null
+++ b/td_fronted/src/assets/assets-result-ie.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-result-maintenance.svg b/td_fronted/src/assets/assets-result-maintenance.svg
new file mode 100644
index 0000000000..388fd0b64e
--- /dev/null
+++ b/td_fronted/src/assets/assets-result-maintenance.svg
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-result-wifi.svg b/td_fronted/src/assets/assets-result-wifi.svg
new file mode 100644
index 0000000000..eeee8b5e46
--- /dev/null
+++ b/td_fronted/src/assets/assets-result-wifi.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-setting-auto.svg b/td_fronted/src/assets/assets-setting-auto.svg
new file mode 100644
index 0000000000..66f57de029
--- /dev/null
+++ b/td_fronted/src/assets/assets-setting-auto.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-setting-dark.svg b/td_fronted/src/assets/assets-setting-dark.svg
new file mode 100644
index 0000000000..0f156495dd
--- /dev/null
+++ b/td_fronted/src/assets/assets-setting-dark.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-setting-light.svg b/td_fronted/src/assets/assets-setting-light.svg
new file mode 100644
index 0000000000..ffa8f34322
--- /dev/null
+++ b/td_fronted/src/assets/assets-setting-light.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/td_fronted/src/assets/assets-t-logo.svg b/td_fronted/src/assets/assets-t-logo.svg
new file mode 100644
index 0000000000..3f95cbad86
--- /dev/null
+++ b/td_fronted/src/assets/assets-t-logo.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/assets/assets-tencent-logo.png b/td_fronted/src/assets/assets-tencent-logo.png
new file mode 100644
index 0000000000..26fdb929bd
Binary files /dev/null and b/td_fronted/src/assets/assets-tencent-logo.png differ
diff --git a/td_fronted/src/components/color/index.vue b/td_fronted/src/components/color/index.vue
new file mode 100644
index 0000000000..3633e80565
--- /dev/null
+++ b/td_fronted/src/components/color/index.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
diff --git a/td_fronted/src/components/common-table/index.vue b/td_fronted/src/components/common-table/index.vue
new file mode 100644
index 0000000000..b733527214
--- /dev/null
+++ b/td_fronted/src/components/common-table/index.vue
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('components.commonTable.query') }}
+
+ {{ t('components.commonTable.reset') }}
+
+
+
+
+
+
+
+
+ {{ t('components.commonTable.contractStatusEnum.fail') }}
+
+
+ {{ t('components.commonTable.contractStatusEnum.audit') }}
+
+
+ {{ t('components.commonTable.contractStatusEnum.pending') }}
+
+
+ {{ t('components.commonTable.contractStatusEnum.executing') }}
+
+
+ {{ t('components.commonTable.contractStatusEnum.finish') }}
+
+
+
+ {{ t('pages.listBase.contractStatusEnum.fail') }}
+ {{ t('pages.listBase.contractStatusEnum.audit') }}
+
+ {{ t('pages.listBase.contractStatusEnum.pending') }}
+
+
+
+
+ {{ t('pages.listBase.pay') }}
+
+
+ {{ t('pages.listBase.receive') }}
+
+
+
+
+ {{ t('pages.listBase.detail') }}
+ {{ t('pages.listBase.delete') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/components/product-card/index.vue b/td_fronted/src/components/product-card/index.vue
new file mode 100644
index 0000000000..a847f9db2c
--- /dev/null
+++ b/td_fronted/src/components/product-card/index.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ product.isSetup ? t('components.isSetup.on') : t('components.isSetup.off')
+ }}
+
+
+ {{ product.name }}
+ {{ product.description }}
+
+
+
+ {{ typeMap[product.type - 1] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/components/result/index.vue b/td_fronted/src/components/result/index.vue
new file mode 100644
index 0000000000..f0848aab2f
--- /dev/null
+++ b/td_fronted/src/components/result/index.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
{{ title }}
+
{{ tip }}
+
+
+
+
+
diff --git a/td_fronted/src/components/thumbnail/index.vue b/td_fronted/src/components/thumbnail/index.vue
new file mode 100644
index 0000000000..fcb8c985a2
--- /dev/null
+++ b/td_fronted/src/components/thumbnail/index.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
diff --git a/td_fronted/src/components/trend/index.vue b/td_fronted/src/components/trend/index.vue
new file mode 100644
index 0000000000..cbf310499e
--- /dev/null
+++ b/td_fronted/src/components/trend/index.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ describe }}
+
+
+
+
+
diff --git a/td_fronted/src/config/color.ts b/td_fronted/src/config/color.ts
new file mode 100644
index 0000000000..300ac1d252
--- /dev/null
+++ b/td_fronted/src/config/color.ts
@@ -0,0 +1,30 @@
+export type TColorToken = Record;
+export type TColorSeries = Record;
+
+// TODO: 中性色暂时固定 待tvision-color生成带色彩倾向的中性色
+export const LIGHT_CHART_COLORS = {
+ textColor: 'rgba(0, 0, 0, 0.9)',
+ placeholderColor: 'rgba(0, 0, 0, 0.35)',
+ borderColor: '#dcdcdc',
+ containerColor: '#fff',
+};
+
+export const DARK_CHART_COLORS = {
+ textColor: 'rgba(255, 255, 255, 0.9)',
+ placeholderColor: 'rgba(255, 255, 255, 0.35)',
+ borderColor: '#5e5e5e',
+ containerColor: '#242424',
+};
+
+export type TChartColor = typeof LIGHT_CHART_COLORS;
+
+export const DEFAULT_COLOR_OPTIONS = [
+ '#0052D9',
+ '#0594FA',
+ '#00A870',
+ '#EBB105',
+ '#ED7B2F',
+ '#E34D59',
+ '#ED49B4',
+ '#834EC2',
+];
diff --git a/td_fronted/src/config/global.ts b/td_fronted/src/config/global.ts
new file mode 100644
index 0000000000..67aba60310
--- /dev/null
+++ b/td_fronted/src/config/global.ts
@@ -0,0 +1 @@
+export const prefix = 'tdesign-starter';
diff --git a/td_fronted/src/config/style.ts b/td_fronted/src/config/style.ts
new file mode 100644
index 0000000000..1d2e1f8ac9
--- /dev/null
+++ b/td_fronted/src/config/style.ts
@@ -0,0 +1,16 @@
+export default {
+ showFooter: true,
+ isSidebarCompact: false,
+ showBreadcrumb: false,
+ menuAutoCollapsed: false,
+ mode: 'light',
+ layout: 'side',
+ splitMenu: false,
+ sideMode: 'light',
+ isFooterAside: false,
+ isSidebarFixed: true,
+ isHeaderFixed: true,
+ isUseTabsRouter: false,
+ showHeader: true,
+ brandTheme: '#0052D9',
+};
diff --git a/td_fronted/src/constants/index.ts b/td_fronted/src/constants/index.ts
new file mode 100644
index 0000000000..6cea6f4220
--- /dev/null
+++ b/td_fronted/src/constants/index.ts
@@ -0,0 +1,37 @@
+// 合同状态枚举
+export const CONTRACT_STATUS = {
+ FAIL: 0,
+ AUDIT_PENDING: 1,
+ EXEC_PENDING: 2,
+ EXECUTING: 3,
+ FINISH: 4,
+};
+
+// 合同类型枚举
+export const CONTRACT_TYPES = {
+ MAIN: 0,
+ SUB: 1,
+ SUPPLEMENT: 2,
+};
+
+// 合同收付类型枚举
+export const CONTRACT_PAYMENT_TYPES = {
+ PAYMENT: 0,
+ RECEIPT: 1,
+};
+
+// 标签类型
+type TagTheme = 'default' | 'success' | 'primary' | 'warning' | 'danger';
+// 通知的优先级对应的标签类型
+export const NOTIFICATION_TYPES: Map = new Map([
+ ['low', 'primary'],
+ ['middle', 'warning'],
+ ['high', 'danger'],
+]);
+
+// 通用请求头
+export enum ContentTypeEnum {
+ Json = 'application/json;charset=UTF-8',
+ FormURLEncoded = 'application/x-www-form-urlencoded;charset=UTF-8',
+ FormData = 'multipart/form-data;charset=UTF-8',
+}
diff --git a/td_fronted/src/hooks/index.ts b/td_fronted/src/hooks/index.ts
new file mode 100644
index 0000000000..cd5a8d04ce
--- /dev/null
+++ b/td_fronted/src/hooks/index.ts
@@ -0,0 +1,60 @@
+import * as echarts from 'echarts/core';
+import { onMounted, onUnmounted, Ref, ref, ShallowRef, shallowRef } from 'vue';
+
+/**
+ * eChart hook
+ * @param domId
+ */
+export const useChart = (domId: string): ShallowRef => {
+ let chartContainer: HTMLCanvasElement;
+ const selfChart = shallowRef();
+ const updateContainer = () => {
+ selfChart.value.resize({
+ width: chartContainer.clientWidth,
+ height: chartContainer.clientHeight,
+ });
+ };
+
+ onMounted(() => {
+ if (!chartContainer) {
+ chartContainer = document.getElementById(domId) as HTMLCanvasElement;
+ }
+ selfChart.value = echarts.init(chartContainer);
+ });
+
+ window.addEventListener('resize', updateContainer, false);
+
+ onUnmounted(() => {
+ window.removeEventListener('resize', updateContainer);
+ });
+
+ return selfChart;
+};
+
+/**
+ * counter utils
+ * @param duration
+ * @returns
+ */
+export const useCounter = (duration = 60): [Ref, () => void] => {
+ let intervalTimer: ReturnType;
+ onUnmounted(() => {
+ clearInterval(intervalTimer);
+ });
+ const countDown = ref(0);
+
+ return [
+ countDown,
+ () => {
+ countDown.value = duration;
+ intervalTimer = setInterval(() => {
+ if (countDown.value > 0) {
+ countDown.value -= 1;
+ } else {
+ clearInterval(intervalTimer);
+ countDown.value = 0;
+ }
+ }, 1000);
+ },
+ ];
+};
diff --git a/td_fronted/src/layouts/blank.vue b/td_fronted/src/layouts/blank.vue
new file mode 100644
index 0000000000..dcdc2171ab
--- /dev/null
+++ b/td_fronted/src/layouts/blank.vue
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/Breadcrumb.vue b/td_fronted/src/layouts/components/Breadcrumb.vue
new file mode 100644
index 0000000000..761f7e4f8c
--- /dev/null
+++ b/td_fronted/src/layouts/components/Breadcrumb.vue
@@ -0,0 +1,52 @@
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/Content.vue b/td_fronted/src/layouts/components/Content.vue
new file mode 100644
index 0000000000..f5b27d5de2
--- /dev/null
+++ b/td_fronted/src/layouts/components/Content.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/Footer.vue b/td_fronted/src/layouts/components/Footer.vue
new file mode 100644
index 0000000000..04eeccd196
--- /dev/null
+++ b/td_fronted/src/layouts/components/Footer.vue
@@ -0,0 +1,15 @@
+
+ Copyright © 2021-{{ new Date().getFullYear() }} Tencent. All Rights Reserved
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/FrameBlank.vue b/td_fronted/src/layouts/components/FrameBlank.vue
new file mode 100644
index 0000000000..b2844292a3
--- /dev/null
+++ b/td_fronted/src/layouts/components/FrameBlank.vue
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/td_fronted/src/layouts/components/FrameContent.vue b/td_fronted/src/layouts/components/FrameContent.vue
new file mode 100644
index 0000000000..413f0e61ba
--- /dev/null
+++ b/td_fronted/src/layouts/components/FrameContent.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/Header.vue b/td_fronted/src/layouts/components/Header.vue
new file mode 100644
index 0000000000..100591a4bb
--- /dev/null
+++ b/td_fronted/src/layouts/components/Header.vue
@@ -0,0 +1,329 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ changeLang(options.value as string)"
+ >{{ lang.content }}
+
+
+
+
+
+ {{ t('layout.header.user') }}
+
+
+ {{ t('layout.header.signOut') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/LayoutContent.vue b/td_fronted/src/layouts/components/LayoutContent.vue
new file mode 100644
index 0000000000..16adcbbfd5
--- /dev/null
+++ b/td_fronted/src/layouts/components/LayoutContent.vue
@@ -0,0 +1,173 @@
+
+
+ handleChangeCurrentTab(value as string)"
+ @remove="handleRemove"
+ @drag-sort="handleDragend"
+ >
+
+
+
+
+ {{ renderTitle(routeItem.title) }}
+
+
+
+
+ handleRefresh(routeItem, index)">
+
+ {{ t('layout.tagTabs.refresh') }}
+
+ handleCloseAhead(routeItem.path, index)">
+
+ {{ t('layout.tagTabs.closeLeft') }}
+
+ handleCloseBehind(routeItem.path, index)"
+ >
+
+ {{ t('layout.tagTabs.closeRight') }}
+
+ handleCloseOther(routeItem.path, index)">
+
+ {{ t('layout.tagTabs.closeOther') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/LayoutHeader.vue b/td_fronted/src/layouts/components/LayoutHeader.vue
new file mode 100644
index 0000000000..13864edb4d
--- /dev/null
+++ b/td_fronted/src/layouts/components/LayoutHeader.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/LayoutSideNav.vue b/td_fronted/src/layouts/components/LayoutSideNav.vue
new file mode 100644
index 0000000000..9dc50a22f6
--- /dev/null
+++ b/td_fronted/src/layouts/components/LayoutSideNav.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/MenuContent.vue b/td_fronted/src/layouts/components/MenuContent.vue
new file mode 100644
index 0000000000..297506d7a2
--- /dev/null
+++ b/td_fronted/src/layouts/components/MenuContent.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+ {{ renderMenuTitle(item.title) }}
+
+
+
+
+
+ {{ renderMenuTitle(item.title) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/Notice.vue b/td_fronted/src/layouts/components/Notice.vue
new file mode 100644
index 0000000000..526ecf0b95
--- /dev/null
+++ b/td_fronted/src/layouts/components/Notice.vue
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/Search.vue b/td_fronted/src/layouts/components/Search.vue
new file mode 100644
index 0000000000..3d66c2bf79
--- /dev/null
+++ b/td_fronted/src/layouts/components/Search.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/components/SideNav.vue b/td_fronted/src/layouts/components/SideNav.vue
new file mode 100644
index 0000000000..3eb6054e0b
--- /dev/null
+++ b/td_fronted/src/layouts/components/SideNav.vue
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+ {{ !collapsed ? 'TDesign Starter' : '' }} {{ pgk.version }}
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/frame/index.vue b/td_fronted/src/layouts/frame/index.vue
new file mode 100644
index 0000000000..193884782c
--- /dev/null
+++ b/td_fronted/src/layouts/frame/index.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/frame/useFrameKeepAlive.ts b/td_fronted/src/layouts/frame/useFrameKeepAlive.ts
new file mode 100644
index 0000000000..1fd228d421
--- /dev/null
+++ b/td_fronted/src/layouts/frame/useFrameKeepAlive.ts
@@ -0,0 +1,54 @@
+import uniqBy from 'lodash/uniqBy';
+import { computed, toRaw, unref } from 'vue';
+import { useRouter } from 'vue-router';
+
+import { useSettingStore, useTabsRouterStore } from '@/store';
+import type { MenuRoute } from '@/types/interface';
+
+export function useFrameKeepAlive() {
+ const router = useRouter();
+ const { currentRoute } = router;
+ const { isUseTabsRouter } = useSettingStore();
+ const tabStore = useTabsRouterStore();
+ const getFramePages = computed(() => {
+ const ret = getAllFramePages(toRaw(router.getRoutes()) as unknown as MenuRoute[]) || [];
+ return ret;
+ });
+
+ const getOpenTabList = computed((): string[] => {
+ return tabStore.tabRouters.reduce((prev: string[], next) => {
+ if (next.meta && Reflect.has(next.meta, 'frameSrc')) {
+ prev.push(next.name as string);
+ }
+ return prev;
+ }, []);
+ });
+
+ function getAllFramePages(routes: MenuRoute[]): MenuRoute[] {
+ let res: MenuRoute[] = [];
+ for (const route of routes) {
+ const { meta: { frameSrc, frameBlank } = {}, children } = route;
+ if (frameSrc && !frameBlank) {
+ res.push(route);
+ }
+ if (children && children.length) {
+ res.push(...getAllFramePages(children));
+ }
+ }
+ res = uniqBy(res, 'name');
+ return res;
+ }
+
+ function showIframe(item: MenuRoute) {
+ return item.name === unref(currentRoute).name;
+ }
+
+ function hasRenderFrame(name: string) {
+ if (!unref(isUseTabsRouter)) {
+ return router.currentRoute.value.name === name;
+ }
+ return unref(getOpenTabList).includes(name);
+ }
+
+ return { hasRenderFrame, getFramePages, showIframe, getAllFramePages };
+}
diff --git a/td_fronted/src/layouts/index.vue b/td_fronted/src/layouts/index.vue
new file mode 100644
index 0000000000..82e8961f0e
--- /dev/null
+++ b/td_fronted/src/layouts/index.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/layouts/setting.vue b/td_fronted/src/layouts/setting.vue
new file mode 100644
index 0000000000..d7f5ecb2d0
--- /dev/null
+++ b/td_fronted/src/layouts/setting.vue
@@ -0,0 +1,365 @@
+
+
+
+
+ {{ t('layout.setting.theme.mode') }}
+
+
+
+ {{ t('layout.setting.theme.color') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('layout.setting.navigationLayout') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('layout.setting.element.title') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('layout.setting.tips') }}
+
+ {{ t('layout.setting.copy.title') }}
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/locales/index.ts b/td_fronted/src/locales/index.ts
new file mode 100644
index 0000000000..33ba482685
--- /dev/null
+++ b/td_fronted/src/locales/index.ts
@@ -0,0 +1,67 @@
+import { useLocalStorage, usePreferredLanguages } from '@vueuse/core';
+import { DropdownOption } from 'tdesign-vue-next';
+import { computed } from 'vue';
+import { createI18n } from 'vue-i18n';
+
+// 导入语言文件
+const langModules = import.meta.glob('./lang/*/index.ts', { eager: true });
+
+const langModuleMap = new Map();
+
+export const langCode: Array = [];
+
+export const localeConfigKey = 'tdesign-starter-locale';
+
+// 获取浏览器默认语言环境
+const languages = usePreferredLanguages();
+
+// 生成语言模块列表
+const generateLangModuleMap = () => {
+ const fullPaths = Object.keys(langModules);
+ fullPaths.forEach((fullPath) => {
+ const k = fullPath.replace('./lang', '');
+ const startIndex = 1;
+ const lastIndex = k.lastIndexOf('/');
+ const code = k.substring(startIndex, lastIndex);
+ langCode.push(code);
+ langModuleMap.set(code, langModules[fullPath]);
+ });
+};
+
+// 导出 Message
+const importMessages = computed(() => {
+ generateLangModuleMap();
+
+ const message: Recordable = {};
+ langModuleMap.forEach((value: any, key) => {
+ message[key] = value.default;
+ });
+ return message;
+});
+
+export const i18n = createI18n({
+ legacy: false,
+ locale: useLocalStorage(localeConfigKey, 'zh_CN').value || languages.value[0] || 'zh_CN',
+ fallbackLocale: 'zh_CN',
+ messages: importMessages.value,
+ globalInjection: true,
+});
+
+export const langList = computed(() => {
+ if (langModuleMap.size === 0) generateLangModuleMap();
+
+ const list: DropdownOption[] = [];
+ langModuleMap.forEach((value: any, key) => {
+ list.push({
+ content: value.default.lang,
+ value: key,
+ });
+ });
+
+ return list;
+});
+
+// @ts-ignore
+export const { t } = i18n.global;
+
+export default i18n;
diff --git a/td_fronted/src/locales/lang/en_US/components.ts b/td_fronted/src/locales/lang/en_US/components.ts
new file mode 100644
index 0000000000..e4e09d5feb
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/components.ts
@@ -0,0 +1,37 @@
+export default {
+ isSetup: {
+ on: 'Enabled',
+ off: 'Disabled',
+ },
+ manage: 'Manage',
+ delete: 'Delete',
+ commonTable: {
+ contractName: 'Name',
+ contractStatus: 'Status',
+ contractNum: 'Number',
+ contractType: 'Type',
+ contractPayType: 'Pay Type',
+ contractAmount: 'Amount',
+ contractNamePlaceholder: 'enter contract name',
+ contractStatusPlaceholder: 'enter contract status',
+ contractNumPlaceholder: 'enter contract number',
+ contractTypePlaceholder: 'enter contract type',
+ operation: 'Operation',
+ detail: 'detail',
+ delete: 'delete',
+ contractStatusEnum: {
+ fail: 'fail',
+ audit: 'audit',
+ executing: 'executing',
+ pending: 'pending',
+ finish: 'finish',
+ },
+ contractTypeEnum: {
+ main: 'main',
+ sub: 'sub',
+ supplement: 'supplement',
+ },
+ reset: 'reset',
+ query: 'query',
+ },
+};
diff --git a/td_fronted/src/locales/lang/en_US/index.ts b/td_fronted/src/locales/lang/en_US/index.ts
new file mode 100644
index 0000000000..62d2f7c1a0
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/index.ts
@@ -0,0 +1,54 @@
+import merge from 'lodash/merge';
+import componentsLocale from 'tdesign-vue-next/es/locale/en_US';
+
+import components from './components';
+import layout from './layout';
+import pages from './pages';
+
+export default {
+ lang: 'English',
+ layout,
+ pages,
+ components,
+ constants: {
+ contract: {
+ name: 'Name',
+ status: 'Status',
+ num: 'Number',
+ type: 'Type',
+ typePlaceholder: 'Please enter type',
+ payType: 'Pay Type',
+ amount: 'Amount',
+ amountPlaceholder: 'Please enter amount',
+ signDate: 'Sign Date',
+ effectiveDate: 'Effective Date',
+ endDate: 'End Date',
+ createDate: 'Create Date',
+ attachment: 'Attachment',
+ company: 'Company',
+ employee: 'Employee',
+ pay: 'pay',
+ receive: 'received',
+ remark: 'remark',
+ statusOptions: {
+ fail: 'Failure',
+ auditPending: 'Pending audit',
+ execPending: 'Pending performance',
+ executing: 'Successful',
+ finish: 'Finish',
+ },
+ typeOptions: {
+ main: 'Master contract',
+ sub: 'Subcontract',
+ supplement: 'Supplementary contract',
+ },
+ },
+ },
+ componentsLocale: merge({}, componentsLocale, {
+ // 可以在此处定义更多自定义配置,具体可配置内容参看 API 文档
+ // https://tdesign.tencent.com/vue-next/config?tab=api
+ // pagination: {
+ // jumpTo: 'xxx'
+ // },
+ }),
+};
diff --git a/td_fronted/src/locales/lang/en_US/layout.ts b/td_fronted/src/locales/lang/en_US/layout.ts
new file mode 100644
index 0000000000..5c4a1d52c0
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/layout.ts
@@ -0,0 +1,54 @@
+export default {
+ header: {
+ code: 'Code Repository',
+ help: 'Document',
+ user: 'Profile',
+ signOut: 'Sign Out',
+ setting: 'Setting',
+ },
+ notice: {
+ title: 'Notification Center',
+ clear: 'Clear',
+ setRead: 'Set Read',
+ empty: 'Empty',
+ emptyNotice: 'No Notice',
+ viewAll: 'View All',
+ },
+ tagTabs: {
+ closeOther: 'close other',
+ closeLeft: 'close left',
+ closeRight: 'close right',
+ refresh: 'refresh',
+ },
+ searchPlaceholder: 'Enter search content',
+ setting: {
+ title: 'Setting',
+ theme: {
+ mode: 'Theme Mode',
+ color: 'Theme Color',
+ options: {
+ light: 'Light',
+ dark: 'Dark ',
+ auto: 'Follow System',
+ },
+ },
+ navigationLayout: 'Navigation Layout',
+ sideMode: 'Side Menu Mode',
+ splitMenu: 'Split Menu(Only Mix mode)',
+ fixedSidebar: 'Fixed Sidebar',
+ element: {
+ title: 'Element Switch',
+ showHeader: 'Show Header',
+ showBreadcrumb: 'Show Breadcrumb',
+ showFooter: 'Show Footer',
+ useTagTabs: 'Use Tag Tabs',
+ menuAutoCollapsed: 'Menu Auto Collapsed',
+ },
+ tips: 'Please copy and manually modify the configuration file: /src/config/style.ts',
+ copy: {
+ title: 'Copy',
+ success: 'copied',
+ fail: 'fail to copy',
+ },
+ },
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/dashboard-base.ts b/td_fronted/src/locales/lang/en_US/pages/dashboard-base.ts
new file mode 100644
index 0000000000..920c88f12b
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/dashboard-base.ts
@@ -0,0 +1,62 @@
+export default {
+ outputOverview: {
+ title: 'In/Out Overview',
+ subtitle: '(pieces)',
+ export: 'Export data',
+ month: {
+ input: 'Total in store this month',
+ output: 'Total out store this month',
+ },
+ since: 'Since last week',
+ },
+ rankList: {
+ title: 'Sales order ranking',
+ week: 'This week',
+ month: 'Latest 3 months',
+ info: 'Detail',
+ },
+ topPanel: {
+ card1: 'Total Revenue',
+ card2: 'Total Refund',
+ card3: 'Active User(s)',
+ card4: 'Generate Order(s)',
+ cardTips: 'since last week',
+ analysis: {
+ title: 'Analysis Data',
+ unit: 'ten thousand yuan',
+ series1: 'this month',
+ series2: 'last month',
+ channels: 'Sales Channels',
+ channel1: 'online',
+ channel2: 'shop',
+ channelTips: ' sales ratio',
+ },
+ },
+ saleColumns: {
+ index: 'Ranking',
+ productName: 'Customer',
+ growUp: 'Grow up',
+ count: 'Count',
+ operation: 'Operation',
+ },
+ buyColumns: {
+ index: 'Ranking',
+ productName: 'Supplier',
+ growUp: 'Grow up',
+ count: 'Count',
+ operation: 'Operation',
+ },
+ chart: {
+ week1: 'MON',
+ week2: 'TUE',
+ week3: 'WED',
+ week4: 'THU',
+ week5: 'FRI',
+ week6: 'SAT',
+ week7: 'SUN',
+ max: 'Max',
+ min: 'Min',
+ thisMonth: 'this month',
+ lastMonth: 'last month',
+ },
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/dashboard-detail.ts b/td_fronted/src/locales/lang/en_US/pages/dashboard-detail.ts
new file mode 100644
index 0000000000..2d5a479079
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/dashboard-detail.ts
@@ -0,0 +1,45 @@
+export default {
+ topPanel: {
+ title: 'Purchase applications for this month',
+ quarter: 'Quarter on quarter',
+ paneList: {
+ totalRequest: 'Apply count',
+ suppliers: 'Number of Suppliers',
+ productCategory: 'Product Category',
+ applicant: 'Number of Application',
+ completionRate: 'Completion Rate(%)',
+ arrivalRate: 'Arrival Rate(%)',
+ },
+ },
+ procurement: {
+ title: 'Trends in purchase requisitions for goods',
+ goods: {
+ cup: 'cup',
+ tea: 'tea',
+ honey: 'honey',
+ flour: 'flour',
+ coffeeMachine: 'coffee machine',
+ massageMachine: 'massage machine',
+ },
+ },
+ ssl: 'SSL certificate',
+ sslDescription:
+ 'SSL certificate, also known as a server certificate, is a digital certificate that authenticates the identity of a website and encrypts information sent to the server using SSL technology. Tencent Cloud provides you with a one-stop service for SSL certificates, including application, management, and deployment of both free and paid certificates.',
+ satisfaction: {
+ title: 'distribution of satisfaction levels for purchased goods',
+ export: 'export data',
+ },
+ chart: {
+ week1: 'MON',
+ week2: 'TUE',
+ week3: 'WED',
+ week4: 'THU',
+ week5: 'FRI',
+ week6: 'SAT',
+ week7: 'SUN',
+ max: 'Max',
+ min: 'Min',
+ thisMonth: 'this month',
+ lastMonth: 'last month',
+ },
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/detail-base.ts b/td_fronted/src/locales/lang/en_US/pages/detail-base.ts
new file mode 100644
index 0000000000..d40d1e1fde
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/detail-base.ts
@@ -0,0 +1,20 @@
+export default {
+ baseInfo: {
+ title: 'Base Info',
+ },
+ changelog: {
+ title: 'Changelog',
+ step1: {
+ title: 'upload file',
+ subtitle: 'subtitle',
+ },
+ step2: {
+ title: 'modify contract amount',
+ subtitle: 'subtitle',
+ },
+ step3: {
+ title: 'create contract',
+ desc: 'administrator',
+ },
+ },
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/detail-card.ts b/td_fronted/src/locales/lang/en_US/pages/detail-card.ts
new file mode 100644
index 0000000000..116a23904c
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/detail-card.ts
@@ -0,0 +1,43 @@
+export default {
+ baseInfo: {
+ title: 'Base Info',
+ },
+ invoice: {
+ title: 'Invoice Progress',
+ step1: {
+ title: 'Apply',
+ content: 'The electronic invoice has been submitted on December 21st',
+ },
+ step2: {
+ title: 'Electronic invoice',
+ content: 'expected to be processed within 1-3 business days.',
+ },
+ step3: {
+ title: 'Invoice is send',
+ content: 'we will contact you within 7 business days.',
+ },
+ step4: {
+ title: 'Finish',
+ },
+ },
+ product: {
+ title: 'Product Category',
+ add: 'add production',
+ month: 'month',
+ quarter: 'quarter',
+ },
+ detail: {
+ title: 'Product Procurement Detail',
+ form: {
+ applyNo: 'Apply no',
+ product: 'Name',
+ productNo: 'No.',
+ department: 'Department',
+ num: 'Num',
+ createTime: 'Create time',
+ operation: 'Operation',
+ manage: 'manage',
+ delete: 'delete',
+ },
+ },
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/detail-deploy.ts b/td_fronted/src/locales/lang/en_US/pages/detail-deploy.ts
new file mode 100644
index 0000000000..d639b3e1ed
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/detail-deploy.ts
@@ -0,0 +1,32 @@
+export default {
+ deployTrend: {
+ title: 'Deploy Trend',
+ warning: 'Warning',
+ thisMonth: 'this month',
+ thisWeek: 'this week',
+ lastMonth: 'last month',
+ thisYear: 'this year',
+ lastYear: 'last year',
+ week1: 'MON',
+ week2: 'TUE',
+ week3: 'WED',
+ week4: 'THU',
+ week5: 'FRI',
+ week6: 'SAT',
+ week7: 'SUN',
+ },
+ projectList: {
+ title: 'Project List',
+ dialog: {
+ title: 'Base Info',
+ },
+ table: {
+ name: 'Name',
+ admin: 'Admin',
+ createTime: 'Create time',
+ operation: 'Operation',
+ manage: 'manage',
+ delete: 'delete',
+ },
+ },
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/detail-secondary.ts b/td_fronted/src/locales/lang/en_US/pages/detail-secondary.ts
new file mode 100644
index 0000000000..b6b28b612b
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/detail-secondary.ts
@@ -0,0 +1,9 @@
+export default {
+ read: 'Read',
+ unread: 'Unread',
+ all: 'All',
+ setRead: 'set as read',
+ setUnread: 'set as unread',
+ delete: 'delete',
+ empty: 'Empty',
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/form-base.ts b/td_fronted/src/locales/lang/en_US/pages/form-base.ts
new file mode 100644
index 0000000000..7a26ce9966
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/form-base.ts
@@ -0,0 +1,27 @@
+export default {
+ title: 'Contract Info',
+ contractName: 'Name',
+ contractStatus: 'Status',
+ contractNum: 'Number',
+ contractType: 'Type',
+ contractTypePlaceholder: 'Please enter type',
+ contractPayType: 'Pay Type',
+ contractAmount: 'Amount',
+ contractAmountPlaceholder: 'Please enter amount',
+ contractSignDate: 'Sign Date',
+ contractEffectiveDate: 'Effective Date',
+ contractEndDate: 'End Date',
+ company: 'Company',
+ employee: 'Employee',
+ pay: 'pay',
+ receive: 'received',
+ upload: 'upload file',
+ uploadFile: 'upload contract file',
+ uploadTips: 'Please upload a PDF file, with a size limit of 60MB.',
+ otherInfo: 'Other Info',
+ remark: 'Remark',
+ remarkPlaceholder: 'please enter remark',
+ notaryPublic: 'Notary Public',
+ confirm: 'confirm',
+ cancel: 'cancel',
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/form-step.ts b/td_fronted/src/locales/lang/en_US/pages/form-step.ts
new file mode 100644
index 0000000000..3805f12538
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/form-step.ts
@@ -0,0 +1,53 @@
+export default {
+ step1: {
+ title: 'Submit Application',
+ subtitle: 'Submitted on December 21st',
+ rules: 'rules',
+ rule1:
+ '1. After applying for an invoice, the electronic invoice will be issued within 1-3 working days. If the qualification review is passed, the VAT special invoice (paper) will be mailed to you within 10 working days after the electronic invoice is issued;',
+ rule2: '2. The invoiced amount will be the actual amount you paid;',
+ rule3: '3. For any questions, please contact us directly at 13300001111.',
+ contractName: 'Name',
+ contractTips: 'Please select a contract name',
+ invoiceType: 'Invoice type',
+ amount: 'Amount',
+ submit: 'Submit Application',
+ },
+ step2: {
+ title: 'Electronic Information',
+ subtitle: 'Contact Customer Service if you have any questions',
+ invoiceTitle: 'Invoice Title',
+ taxNum: 'Tax Num',
+ address: 'Address',
+ bank: 'Bank',
+ bankAccount: 'Bank Account',
+ email: 'Email',
+ tel: 'Tel',
+ invoiceTitlePlaceholder: 'please enter invoice title',
+ taxNumPlaceholder: 'please enter tax num',
+ addressPlaceholder: 'please enter address',
+ bankPlaceholder: 'please enter bank',
+ bankAccountPlaceholder: 'please enter bank account',
+ emailPlaceholder: 'please enter email',
+ telPlaceholder: 'please enter tel',
+ },
+ step3: {
+ title: 'Invoice Mailed',
+ subtitle: 'Contact us after the electronic invoice is issued',
+ consignee: 'Consignee',
+ mobileNum: 'Mobile Num',
+ deliveryAddress: 'Address',
+ fullAddress: 'Full Address',
+ },
+ step4: {
+ title: 'Application Completed',
+ subtitle: 'Contact Customer Service if you have any questions',
+ finishTitle: 'Application is completed.',
+ finishTips:
+ 'The electronic invoice is expected to be sent to your email within 1-3 working days. Please be patient for the delivery of the paper invoice.',
+ reapply: 'reapply',
+ check: 'check progress',
+ },
+ preStep: 'pre step',
+ nextStep: 'next step',
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/index.ts b/td_fronted/src/locales/lang/en_US/pages/index.ts
new file mode 100644
index 0000000000..47da178be6
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/index.ts
@@ -0,0 +1,33 @@
+import dashboardBase from './dashboard-base';
+import dashboardDetail from './dashboard-detail';
+import detailBase from './detail-base';
+import detailCard from './detail-card';
+import detailDeploy from './detail-deploy';
+import detailSecondary from './detail-secondary';
+import formBase from './form-base';
+import formStep from './form-step';
+import listBase from './list-base';
+import listCard from './list-card';
+import listFilter from './list-filter';
+import listTree from './list-tree';
+import login from './login';
+import result from './result';
+import user from './user';
+
+export default {
+ dashboardBase,
+ dashboardDetail,
+ listBase,
+ listCard,
+ listFilter,
+ listTree,
+ detailBase,
+ detailCard,
+ detailDeploy,
+ detailSecondary,
+ formBase,
+ formStep,
+ user,
+ login,
+ result,
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/list-base.ts b/td_fronted/src/locales/lang/en_US/pages/list-base.ts
new file mode 100644
index 0000000000..c5de9ae4cf
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/list-base.ts
@@ -0,0 +1,25 @@
+export default {
+ export: 'export',
+ create: 'create',
+ select: 'select',
+ items: 'items',
+ contractName: 'Name',
+ contractStatus: 'Status',
+ contractNum: 'Number',
+ contractType: 'Type',
+ contractPayType: 'Pay Type',
+ contractAmount: 'Amount',
+ operation: 'Operation',
+ detail: 'detail',
+ delete: 'delete',
+ pay: 'pay',
+ receive: 'received',
+ placeholder: 'please enter to search',
+ contractStatusEnum: {
+ fail: 'fail',
+ audit: 'audit',
+ executing: 'executing',
+ pending: 'pending',
+ finish: 'finish',
+ },
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/list-card.ts b/td_fronted/src/locales/lang/en_US/pages/list-card.ts
new file mode 100644
index 0000000000..ac86551f93
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/list-card.ts
@@ -0,0 +1,13 @@
+export default {
+ create: 'Create Product',
+ placeholder: 'please enter to search',
+ productName: 'Name',
+ productStatus: 'Status',
+ productDescription: 'Description',
+ productType: 'Type',
+ productRemark: 'Remark',
+ productStatusEnum: {
+ off: 'off',
+ on: 'on',
+ },
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/list-filter.ts b/td_fronted/src/locales/lang/en_US/pages/list-filter.ts
new file mode 100644
index 0000000000..ff8b4c5632
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/list-filter.ts
@@ -0,0 +1 @@
+export default {};
diff --git a/td_fronted/src/locales/lang/en_US/pages/list-tree.ts b/td_fronted/src/locales/lang/en_US/pages/list-tree.ts
new file mode 100644
index 0000000000..1186fd64af
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/list-tree.ts
@@ -0,0 +1,3 @@
+export default {
+ placeholder: 'please enter to search',
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/login.ts b/td_fronted/src/locales/lang/en_US/pages/login.ts
new file mode 100644
index 0000000000..c52a048ffc
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/login.ts
@@ -0,0 +1,26 @@
+export default {
+ loginTitle: 'Login in',
+ noAccount: 'No Account?',
+ createAccount: 'Create Account',
+ remember: 'Remember Account',
+ forget: 'Forget Account',
+ signIn: 'Sign in',
+ existAccount: 'Exist Account?',
+ refresh: 'refresh',
+ wechatLogin: 'Login with WeChat',
+ accountLogin: 'Login with Account',
+ phoneLogin: 'Login with Mobile Phone',
+ input: {
+ account: 'please enter account',
+ password: 'please enter password',
+ phone: 'please enter phone',
+ verification: 'please enter verification code',
+ },
+ required: {
+ account: 'account is required',
+ phone: 'phone is required',
+ password: 'password is required',
+ verification: 'verification code is require',
+ },
+ sendVerification: 'send',
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/result.ts b/td_fronted/src/locales/lang/en_US/pages/result.ts
new file mode 100644
index 0000000000..df5fb51aa0
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/result.ts
@@ -0,0 +1,43 @@
+export default {
+ 403: {
+ tips: 'sorry, you don not have permission to access this page. Please contact the creator through WeCom',
+ back: 'Back to homepage',
+ },
+ 404: {
+ subtitle: 'Sorry, the page is not found',
+ back: 'Back to homepage',
+ },
+ 500: {
+ subtitle: 'Sorry, the server is error',
+ back: 'Back to homepage',
+ },
+ fail: {
+ title: 'Create fail',
+ subtitle: 'Sorry, your project creation has failed',
+ back: 'Back to homepage',
+ modify: 'Back to modify',
+ },
+ success: {
+ title: 'Project is created',
+ subtitle: 'Contact the person in charge of distributing the application',
+ back: 'Back to homepage',
+ progress: 'Check Progress',
+ },
+ maintenance: {
+ title: 'System maintenance',
+ subtitle: 'Please try again later',
+ back: 'Back to homepage',
+ },
+ browserIncompatible: {
+ title: 'browser is incompatible',
+ subtitle: 'the browser version you are using is too outdated to open the current webpage.',
+ back: 'Back to homepage',
+ recommend: 'TDesign Starter recommend the following browser',
+ },
+ networkError: {
+ title: 'Network Error',
+ subtitle: 'Network error, please try again later',
+ back: 'Back to homepage',
+ reload: 'Reload',
+ },
+};
diff --git a/td_fronted/src/locales/lang/en_US/pages/user.ts b/td_fronted/src/locales/lang/en_US/pages/user.ts
new file mode 100644
index 0000000000..5c49b18bf0
--- /dev/null
+++ b/td_fronted/src/locales/lang/en_US/pages/user.ts
@@ -0,0 +1,23 @@
+export default {
+ markDay: 'Good afternoon, today marks your 100th day at Tencent',
+ personalInfo: {
+ title: 'Personal Info',
+ position: 'Employee of the Hong Kong and Macau Business Expansion team',
+
+ desc: {
+ phone: 'Phone',
+ mobile: 'Mobile',
+ seat: 'Seat',
+ email: 'Email',
+ position: 'Position',
+ leader: 'Leader',
+ entity: 'Entity',
+ joinDay: 'Day of join',
+ group: 'Group',
+ },
+ },
+ contentList: 'Content List',
+ visitData: 'Visit Data',
+ teamMember: 'Team Member',
+ serviceProduction: 'Service Product',
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/components.ts b/td_fronted/src/locales/lang/zh_CN/components.ts
new file mode 100644
index 0000000000..ffdf918370
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/components.ts
@@ -0,0 +1,38 @@
+export default {
+ isSetup: {
+ on: '已启用',
+ off: '已停用',
+ },
+ manage: '管理',
+ delete: '删除',
+ commonTable: {
+ contractName: '合同名称',
+ contractNamePlaceholder: '请输入合同名称',
+ contractStatus: '合同状态',
+ contractStatusPlaceholder: '请输入合同状态',
+ contractNum: '合同编号',
+ contractNumPlaceholder: '请输入合同编号',
+ contractType: '合同类型',
+ contractTypePlaceholder: '请选择合同类型',
+ contractPayType: '合同支付类型',
+ contractAmount: '合同金额',
+ operation: '操作',
+ detail: '详情',
+ delete: '删除',
+ placeholder: '请输入内容搜索',
+ contractStatusEnum: {
+ fail: '审核失败',
+ audit: '待审核',
+ executing: '履行中',
+ pending: '待履行',
+ finish: '已完成',
+ },
+ contractTypeEnum: {
+ main: '主合同',
+ sub: '子合同',
+ supplement: '补充合同',
+ },
+ reset: '重置',
+ query: '查询',
+ },
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/index.ts b/td_fronted/src/locales/lang/zh_CN/index.ts
new file mode 100644
index 0000000000..f27b2dc807
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/index.ts
@@ -0,0 +1,47 @@
+import componentsLocale from 'tdesign-vue-next/es/locale/zh_CN';
+
+import components from './components';
+import layout from './layout';
+import pages from './pages';
+
+export default {
+ lang: '简体中文',
+ layout,
+ pages,
+ components,
+ constants: {
+ contract: {
+ name: '合同名称',
+ status: '合同状态',
+ num: '合同编号',
+ type: '合同类型',
+ typePlaceholder: '请输入类型',
+ payType: '合同收支类型',
+ amount: '合同金额',
+ amountPlaceholder: '请输入金额',
+ signDate: '合同签订日期',
+ effectiveDate: '合同生效日期',
+ endDate: '合同结束日期',
+ createDate: '合同创建时间',
+ company: '甲方',
+ employee: '乙方',
+ pay: '付款',
+ receive: '收款',
+ remark: '备注',
+ attachment: '附件',
+ statusOptions: {
+ fail: '审核失败',
+ auditPending: '待审核',
+ execPending: '待履行',
+ executing: '审核成功',
+ finish: '已完成',
+ },
+ typeOptions: {
+ main: '主合同',
+ sub: '子合同',
+ supplement: '补充合同',
+ },
+ },
+ },
+ componentsLocale,
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/layout.ts b/td_fronted/src/locales/lang/zh_CN/layout.ts
new file mode 100644
index 0000000000..caca055225
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/layout.ts
@@ -0,0 +1,54 @@
+export default {
+ header: {
+ code: '代码仓库',
+ help: '帮助文档',
+ user: '个人中心',
+ signOut: '退出登录',
+ setting: '系统设置',
+ },
+ notice: {
+ title: '通知中心',
+ clear: '清空',
+ setRead: '设为已读',
+ empty: '空',
+ emptyNotice: '暂无通知',
+ viewAll: '查看全部',
+ },
+ searchPlaceholder: '请输入搜索内容',
+ tagTabs: {
+ closeOther: '关闭其他',
+ closeLeft: '关闭左侧',
+ closeRight: '关闭右侧',
+ refresh: '刷新',
+ },
+ setting: {
+ title: '页面配置',
+ theme: {
+ mode: '主题模式',
+ color: '主题色',
+ options: {
+ light: '明亮',
+ dark: '暗黑',
+ auto: '跟随系统',
+ },
+ },
+ navigationLayout: '导航布局',
+ sideMode: '侧边栏模式',
+ splitMenu: '分割菜单(混合模式下有效)',
+ fixedSidebar: '固定侧边栏',
+ element: {
+ title: '元素开关',
+ showHeader: '显示顶栏',
+ showBreadcrumb: '显示面包屑',
+ showFooter: '显示页脚',
+ useTagTabs: '展示多标签Tab页',
+ menuAutoCollapsed: '菜单自动折叠',
+ },
+ tips: '请复制后手动修改配置文件: /src/config/style.ts',
+ copy: {
+ title: '复制配置项',
+ success: '复制成功',
+ fail: '复制失败',
+ },
+ },
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/dashboard-base.ts b/td_fronted/src/locales/lang/zh_CN/pages/dashboard-base.ts
new file mode 100644
index 0000000000..64cf01b69d
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/dashboard-base.ts
@@ -0,0 +1,63 @@
+export default {
+ title: '概览仪表盘',
+ outputOverview: {
+ title: '出入库概览',
+ subtitle: '(件)',
+ export: '导出数据',
+ month: {
+ input: '本月入库总计(件)',
+ output: '本月出库总计(件)',
+ },
+ since: '自从上周以来',
+ },
+ rankList: {
+ title: '销售订单排名',
+ week: '本周',
+ month: '近三月',
+ info: '详情',
+ },
+ topPanel: {
+ card1: '总收入',
+ card2: '总退款',
+ card3: '活跃用户(个)',
+ card4: '产生订单(个)',
+ cardTips: '自从上周以来',
+ analysis: {
+ title: '统计数据',
+ unit: '万元',
+ series1: '本月',
+ series2: '上月',
+ channels: '销售渠道',
+ channel1: '线上',
+ channel2: '门店',
+ channelTips: '销售占比',
+ },
+ },
+ saleColumns: {
+ index: '排名',
+ productName: '客户名称',
+ growUp: '较上周',
+ count: '订单量',
+ operation: '操作',
+ },
+ buyColumns: {
+ index: '排名',
+ productName: '供应商名称',
+ growUp: '较上周',
+ count: '订单量',
+ operation: '操作',
+ },
+ chart: {
+ week1: '周一',
+ week2: '周二',
+ week3: '周三',
+ week4: '周四',
+ week5: '周五',
+ week6: '周六',
+ week7: '周日',
+ max: '最大值',
+ min: '最小值',
+ thisMonth: '本月',
+ lastMonth: '上月',
+ },
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/dashboard-detail.ts b/td_fronted/src/locales/lang/zh_CN/pages/dashboard-detail.ts
new file mode 100644
index 0000000000..5e47ad8183
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/dashboard-detail.ts
@@ -0,0 +1,44 @@
+export default {
+ topPanel: {
+ title: '本月采购申请情况',
+ quarter: '环比',
+ paneList: {
+ totalRequest: '总申请数(次)',
+ suppliers: '供应商数量(个)',
+ productCategory: '采购商品品类(类)',
+ applicant: '申请人数量(人)',
+ completionRate: '申请完成率(%)',
+ arrivalRate: '到货及时率(%)',
+ },
+ },
+ procurement: {
+ title: '采购商品申请趋势',
+ goods: {
+ cup: '杯子',
+ tea: '茶叶',
+ honey: '蜂蜜',
+ flour: '面粉',
+ coffeeMachine: '咖啡机',
+ massageMachine: '按摩仪',
+ },
+ },
+ ssl: 'SSL证书',
+ sslDescription: 'SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部署',
+ satisfaction: {
+ title: '采购商品满意度分布',
+ export: '导出数据',
+ },
+ chart: {
+ week1: '周一',
+ week2: '周二',
+ week3: '周三',
+ week4: '周四',
+ week5: '周五',
+ week6: '周六',
+ week7: '周日',
+ max: '最大值',
+ min: '最小值',
+ thisMonth: '本月',
+ lastMonth: '上月',
+ },
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/detail-base.ts b/td_fronted/src/locales/lang/zh_CN/pages/detail-base.ts
new file mode 100644
index 0000000000..65ed5cd22c
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/detail-base.ts
@@ -0,0 +1,20 @@
+export default {
+ baseInfo: {
+ title: '基本信息',
+ },
+ changelog: {
+ title: '变更记录',
+ step1: {
+ title: '上传合同附件',
+ subtitle: '这里是提示文字',
+ },
+ step2: {
+ title: '修改合同金额',
+ subtitle: '这里是提示文字',
+ },
+ step3: {
+ title: '新建合同',
+ desc: '管理员-李川操作',
+ },
+ },
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/detail-card.ts b/td_fronted/src/locales/lang/zh_CN/pages/detail-card.ts
new file mode 100644
index 0000000000..88f81ce744
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/detail-card.ts
@@ -0,0 +1,43 @@
+export default {
+ baseInfo: {
+ title: '基本信息',
+ },
+ invoice: {
+ title: '发票进度',
+ step1: {
+ title: '申请提交',
+ content: '已于12月21日提交',
+ },
+ step2: {
+ title: '电子发票',
+ content: '预计1~3个工作日',
+ },
+ step3: {
+ title: '发票已邮寄',
+ content: '电子发票开出后7个工作日联系',
+ },
+ step4: {
+ title: '完成',
+ },
+ },
+ product: {
+ title: '产品目录',
+ add: '新增产品',
+ month: '月份',
+ quarter: '季度',
+ },
+ detail: {
+ title: '产品采购明细',
+ form: {
+ applyNo: '申请号',
+ product: '产品名称',
+ productNo: '产品编号',
+ operation: '操作',
+ department: '申请部门',
+ num: '采购数量',
+ createTime: '创建时间',
+ manage: '管理',
+ delete: '删除',
+ },
+ },
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/detail-deploy.ts b/td_fronted/src/locales/lang/zh_CN/pages/detail-deploy.ts
new file mode 100644
index 0000000000..12fc15a856
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/detail-deploy.ts
@@ -0,0 +1,32 @@
+export default {
+ deployTrend: {
+ title: '部署趋势',
+ warning: '告警情况',
+ thisMonth: '本月',
+ thisWeek: '本周',
+ lastMonth: '上月',
+ thisYear: '今年',
+ lastYear: '去年',
+ week1: '周一',
+ week2: '周二',
+ week3: '周三',
+ week4: '周四',
+ week5: '周五',
+ week6: '周六',
+ week7: '周日',
+ },
+ projectList: {
+ title: '项目列表',
+ dialog: {
+ title: '基本信息',
+ },
+ table: {
+ name: '名称',
+ admin: '管理员',
+ createTime: '创建时间',
+ operation: '操作',
+ manage: '管理',
+ delete: '删除',
+ },
+ },
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/detail-secondary.ts b/td_fronted/src/locales/lang/zh_CN/pages/detail-secondary.ts
new file mode 100644
index 0000000000..c66270d1de
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/detail-secondary.ts
@@ -0,0 +1,9 @@
+export default {
+ read: '已读通知',
+ unread: '未读通知',
+ all: '全部通知',
+ setRead: '设为已读',
+ setUnread: '设为未读',
+ delete: '删除通知',
+ empty: '暂无通知',
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/form-base.ts b/td_fronted/src/locales/lang/zh_CN/pages/form-base.ts
new file mode 100644
index 0000000000..1b119f8582
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/form-base.ts
@@ -0,0 +1,27 @@
+export default {
+ title: '合同信息',
+ contractName: '合同名称',
+ contractStatus: '合同状态',
+ contractNum: '合同编号',
+ contractType: '合同类型',
+ contractTypePlaceholder: '请输入类型',
+ contractPayType: '合同收支类型',
+ contractAmount: '合同金额',
+ contractAmountPlaceholder: '请输入金额',
+ contractSignDate: '合同签订日期',
+ contractEffectiveDate: '合同生效日期',
+ contractEndDate: '合同结束日期',
+ company: '甲方',
+ employee: '乙方',
+ pay: '付款',
+ receive: '收款',
+ upload: '上传文件',
+ uploadFile: '上传合同',
+ uploadTips: '请上传pdf文件,大小在60M以内',
+ otherInfo: '其他信息',
+ remark: '备注',
+ remarkPlaceholder: '请输入备注',
+ notaryPublic: '公证人',
+ confirm: '确认提交',
+ cancel: '取消',
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/form-step.ts b/td_fronted/src/locales/lang/zh_CN/pages/form-step.ts
new file mode 100644
index 0000000000..bad33a9cab
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/form-step.ts
@@ -0,0 +1,54 @@
+export default {
+ step1: {
+ title: '提交申请',
+ subtitle: '已于12月21日提交',
+ rules: '发票开具规则',
+ rule1:
+ '1、申请开票后,电子发票在1~3个工作日内开具;增值税专用发票(纸质)如资质审核通过,将在电子发票开具后10个工作日内为您寄出;',
+ rule2: '2、开票金额为您实际支付金额;',
+ rule3: '3、如有疑问请直接联系:13300001111。',
+ contractName: '合同名称',
+ contractTips: '请选择合同名称',
+ invoiceType: '发票类型',
+ amount: '开票金额',
+ submit: '提交申请',
+ },
+ step2: {
+ title: '电子信息',
+ subtitle: '如有疑问联系客服',
+ invoiceTitle: '发票抬头',
+ taxNum: '纳税人识别号',
+ address: '地址',
+ bank: '开户行',
+ bankAccount: '银行账号',
+ email: '邮箱',
+ tel: '手机号',
+ titlePlaceholder: '请输入电子信息',
+ subtitlePlaceholder: '请输入如有疑问联系客服',
+ invoiceTitlePlaceholder: '请输入发票抬头',
+ taxNumPlaceholder: '请输入纳税人识别号',
+ addressPlaceholder: '请输入地址',
+ bankPlaceholder: '请输入开户行',
+ bankAccountPlaceholder: '请输入银行账号',
+ emailPlaceholder: '请输入邮箱',
+ telPlaceholder: '请输入手机号',
+ },
+ step3: {
+ title: '发票已邮寄',
+ subtitle: '电子发票开出后联系',
+ consignee: '收货人',
+ mobileNum: '手机号码',
+ deliveryAddress: '收货地址',
+ fullAddress: '详细地址',
+ },
+ step4: {
+ title: '完成申请',
+ subtitle: '如有疑问联系客服',
+ finishTitle: '完成开票申请',
+ finishTips: '预计1~3个工作日会将电子发票发至邮箱,发票邮寄请耐心等待',
+ reapply: '再次申请',
+ check: '查看进度',
+ },
+ preStep: '上一步',
+ nextStep: '下一步',
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/index.ts b/td_fronted/src/locales/lang/zh_CN/pages/index.ts
new file mode 100644
index 0000000000..47da178be6
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/index.ts
@@ -0,0 +1,33 @@
+import dashboardBase from './dashboard-base';
+import dashboardDetail from './dashboard-detail';
+import detailBase from './detail-base';
+import detailCard from './detail-card';
+import detailDeploy from './detail-deploy';
+import detailSecondary from './detail-secondary';
+import formBase from './form-base';
+import formStep from './form-step';
+import listBase from './list-base';
+import listCard from './list-card';
+import listFilter from './list-filter';
+import listTree from './list-tree';
+import login from './login';
+import result from './result';
+import user from './user';
+
+export default {
+ dashboardBase,
+ dashboardDetail,
+ listBase,
+ listCard,
+ listFilter,
+ listTree,
+ detailBase,
+ detailCard,
+ detailDeploy,
+ detailSecondary,
+ formBase,
+ formStep,
+ user,
+ login,
+ result,
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/list-base.ts b/td_fronted/src/locales/lang/zh_CN/pages/list-base.ts
new file mode 100644
index 0000000000..5a96799d5c
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/list-base.ts
@@ -0,0 +1,25 @@
+export default {
+ export: '导出合同',
+ create: '新建合同',
+ select: '已选',
+ items: '项',
+ contractName: '合同名称',
+ contractStatus: '合同状态',
+ contractNum: '合同编号',
+ contractType: '合同类型',
+ contractPayType: '合同收支类型',
+ contractAmount: '合同金额',
+ operation: '操作',
+ detail: '详情',
+ delete: '删除',
+ pay: '付款',
+ receive: '收款',
+ placeholder: '请输入内容搜索',
+ contractStatusEnum: {
+ fail: '审核失败',
+ audit: '待审核',
+ executing: '履行中',
+ pending: '待履行',
+ finish: '已完成',
+ },
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/list-card.ts b/td_fronted/src/locales/lang/zh_CN/pages/list-card.ts
new file mode 100644
index 0000000000..38323f18f2
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/list-card.ts
@@ -0,0 +1,13 @@
+export default {
+ create: '新建产品',
+ placeholder: '请输入内容搜索',
+ productName: '产品名称',
+ productStatus: '产品状态',
+ productDescription: '产品描述',
+ productType: '产品类型',
+ productRemark: '备注',
+ productStatusEnum: {
+ off: '停用',
+ on: '启用',
+ },
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/list-filter.ts b/td_fronted/src/locales/lang/zh_CN/pages/list-filter.ts
new file mode 100644
index 0000000000..ff8b4c5632
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/list-filter.ts
@@ -0,0 +1 @@
+export default {};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/list-tree.ts b/td_fronted/src/locales/lang/zh_CN/pages/list-tree.ts
new file mode 100644
index 0000000000..c7d68a7dd1
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/list-tree.ts
@@ -0,0 +1,3 @@
+export default {
+ placeholder: '请输入内容进行搜索',
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/login.ts b/td_fronted/src/locales/lang/zh_CN/pages/login.ts
new file mode 100644
index 0000000000..3cbe5f230e
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/login.ts
@@ -0,0 +1,27 @@
+export default {
+ loginTitle: '登录到',
+ noAccount: '没有账号吗?',
+ existAccount: '已有账号?',
+ createAccount: '注册新账号',
+ remember: '记住账号',
+ forget: '忘记账号',
+ signIn: '登录',
+ register: '注册',
+ refresh: '刷新',
+ wechatLogin: '使用微信扫一扫登录',
+ accountLogin: '使用账号登录',
+ phoneLogin: '使用手机号登录',
+ input: {
+ account: '请输入账号',
+ password: '请输入登录密码',
+ phone: '请输入手机号',
+ verification: '请输入验证码',
+ },
+ required: {
+ account: '账号必填',
+ phone: '手机号必填',
+ password: '密码必填',
+ verification: '验证码必填',
+ },
+ sendVerification: '发送验证码',
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/result.ts b/td_fronted/src/locales/lang/zh_CN/pages/result.ts
new file mode 100644
index 0000000000..e00487c8b7
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/result.ts
@@ -0,0 +1,43 @@
+export default {
+ 403: {
+ tips: '抱歉,您无权限访问此页面,企业微信联系创建者',
+ back: '返回首页',
+ },
+ 404: {
+ subtitle: '抱歉,您访问的页面不存在',
+ back: '返回首页',
+ },
+ 500: {
+ subtitle: '抱歉,服务器出错啦',
+ back: '返回首页',
+ },
+ fail: {
+ title: '创建失败',
+ subtitle: '抱歉,您的项目创建失败,企业微信联系检查创建者权限,或返回修改。',
+ back: '回到首页',
+ modify: '返回修改',
+ },
+ success: {
+ title: '项目已创建成功',
+ subtitle: '可以联系负责人分发应用',
+ back: '回到首页',
+ progress: '查看进度',
+ },
+ maintenance: {
+ title: '系统维护中',
+ subtitle: '系统维护中,请稍后再试',
+ back: '回到首页',
+ },
+ browserIncompatible: {
+ title: '浏览器不兼容',
+ subtitle: '抱歉,您正在使用的浏览器版本过低,无法打开当前网页。',
+ back: '回到首页',
+ recommend: 'TDesign Starter 推荐以下主流浏览器',
+ },
+ networkError: {
+ title: '网络异常',
+ subtitle: '网络异常, 请稍后重试',
+ back: '回到首页',
+ reload: '重新加载',
+ },
+};
diff --git a/td_fronted/src/locales/lang/zh_CN/pages/user.ts b/td_fronted/src/locales/lang/zh_CN/pages/user.ts
new file mode 100644
index 0000000000..c1a8b2f9a1
--- /dev/null
+++ b/td_fronted/src/locales/lang/zh_CN/pages/user.ts
@@ -0,0 +1,22 @@
+export default {
+ markDay: '下午好,今天是你加入鹅厂的第 100 天',
+ personalInfo: {
+ title: '个人信息',
+ position: '港澳业务拓展组员工 直客销售 ',
+ desc: {
+ phone: '座机',
+ mobile: '手机',
+ seat: '座位',
+ email: '邮箱',
+ position: '职位',
+ leader: '上级',
+ entity: '主体',
+ joinDay: '入职时间',
+ group: '所属团队',
+ },
+ },
+ visitData: '首页访问数据',
+ contentList: '内容列表',
+ teamMember: '团队成员',
+ serviceProduction: '服务产品',
+};
diff --git a/td_fronted/src/locales/useLocale.ts b/td_fronted/src/locales/useLocale.ts
new file mode 100644
index 0000000000..0e7c5170eb
--- /dev/null
+++ b/td_fronted/src/locales/useLocale.ts
@@ -0,0 +1,28 @@
+import { useLocalStorage } from '@vueuse/core';
+import { computed } from 'vue';
+import { useI18n } from 'vue-i18n';
+
+import { i18n, langCode, localeConfigKey } from '@/locales/index';
+
+export function useLocale() {
+ const { locale } = useI18n({ useScope: 'global' });
+ function changeLocale(lang: string) {
+ // 如果切换的语言不在对应语言文件里则默认为简体中文
+ if (!langCode.includes(lang)) {
+ lang = 'zh_CN';
+ }
+
+ locale.value = lang;
+ useLocalStorage(localeConfigKey, 'zh_CN').value = lang;
+ }
+
+ const getComponentsLocale = computed(() => {
+ return i18n.global.getLocaleMessage(locale.value).componentsLocale;
+ });
+
+ return {
+ changeLocale,
+ getComponentsLocale,
+ locale,
+ };
+}
diff --git a/td_fronted/src/main.ts b/td_fronted/src/main.ts
new file mode 100644
index 0000000000..58ec99a98e
--- /dev/null
+++ b/td_fronted/src/main.ts
@@ -0,0 +1,21 @@
+/* eslint-disable simple-import-sort/imports */
+import TDesign from 'tdesign-vue-next';
+import { createApp } from 'vue';
+
+import App from './App.vue';
+import router from './router';
+import { store } from './store';
+import i18n from './locales';
+
+import 'tdesign-vue-next/es/style/index.css';
+import '@/style/index.less';
+import './permission';
+
+const app = createApp(App);
+
+app.use(TDesign);
+app.use(store);
+app.use(router);
+app.use(i18n);
+
+app.mount('#app');
diff --git a/td_fronted/src/pages/dashboard/base/components/MiddleChart.vue b/td_fronted/src/pages/dashboard/base/components/MiddleChart.vue
new file mode 100644
index 0000000000..6b90f3b872
--- /dev/null
+++ b/td_fronted/src/pages/dashboard/base/components/MiddleChart.vue
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+ onCurrencyChange(value as string[])"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/dashboard/base/components/OutputOverview.vue b/td_fronted/src/pages/dashboard/base/components/OutputOverview.vue
new file mode 100644
index 0000000000..2220205695
--- /dev/null
+++ b/td_fronted/src/pages/dashboard/base/components/OutputOverview.vue
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+ onStokeDataChange(value as string[])"
+ />
+
+
+
+
+
+
+
+ {{ t('pages.dashboardBase.outputOverview.export') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/dashboard/base/components/RankList.vue b/td_fronted/src/pages/dashboard/base/components/RankList.vue
new file mode 100644
index 0000000000..fd5e9dd157
--- /dev/null
+++ b/td_fronted/src/pages/dashboard/base/components/RankList.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+ {{ t('pages.dashboardBase.rankList.week') }}
+ {{ t('pages.dashboardBase.rankList.month') }}
+
+
+
+
+
+ {{ rowIndex + 1 }}
+
+
+
+
+
+
+
+
+ {{
+ t('pages.dashboardBase.rankList.info')
+ }}
+
+
+
+
+
+
+
+
+ {{ t('pages.dashboardBase.rankList.week') }}
+ {{ t('pages.dashboardBase.rankList.month') }}
+
+
+
+
+
+ {{ rowIndex + 1 }}
+
+
+
+
+
+
+ {{
+ t('pages.dashboardBase.rankList.info')
+ }}
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/dashboard/base/components/TopPanel.vue b/td_fronted/src/pages/dashboard/base/components/TopPanel.vue
new file mode 100644
index 0000000000..83815d0eab
--- /dev/null
+++ b/td_fronted/src/pages/dashboard/base/components/TopPanel.vue
@@ -0,0 +1,292 @@
+
+
+
+
+
+ {{ item.number }}
+
+
+
+
+
+ {{ t('pages.dashboardBase.topPanel.cardTips') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/dashboard/base/constants.ts b/td_fronted/src/pages/dashboard/base/constants.ts
new file mode 100644
index 0000000000..48b401ac88
--- /dev/null
+++ b/td_fronted/src/pages/dashboard/base/constants.ts
@@ -0,0 +1,84 @@
+interface TendItem {
+ growUp?: number;
+ productName: string;
+ count: number;
+ date: string;
+}
+
+export const SALE_TEND_LIST: Array = [
+ {
+ growUp: 1,
+ productName: '国家电网有限公司',
+ count: 7059,
+ date: '2021-09-01',
+ },
+ {
+ growUp: -1,
+ productName: '深圳燃气集团股份有限公司',
+ count: 6437,
+ date: '2021-09-01',
+ },
+ {
+ growUp: 4,
+ productName: '国家烟草专卖局',
+ count: 4221,
+ date: '2021-09-01',
+ },
+ {
+ growUp: 3,
+ productName: '中国电信集团有限公司',
+ count: 3317,
+ date: '2021-09-01',
+ },
+ {
+ growUp: -3,
+ productName: '中国移动通信集团有限公司',
+ count: 3015,
+ date: '2021-09-01',
+ },
+ {
+ growUp: -3,
+ productName: '新余市办公用户采购项目',
+ count: 2015,
+ date: '2021-09-12',
+ },
+];
+
+export const BUY_TEND_LIST: Array = [
+ {
+ growUp: 1,
+ productName: '腾讯科技(深圳)有限公司',
+ count: 3015,
+ date: '2021-09-01',
+ },
+ {
+ growUp: -1,
+ productName: '大润发有限公司',
+ count: 2015,
+ date: '2021-09-01',
+ },
+ {
+ growUp: 6,
+ productName: '四川海底捞股份有限公司',
+ count: 1815,
+ date: '2021-09-11',
+ },
+ {
+ growUp: -3,
+ productName: '索尼(中国)有限公司',
+ count: 1015,
+ date: '2021-09-21',
+ },
+ {
+ growUp: -4,
+ productName: '松下电器(中国)有限公司',
+ count: 445,
+ date: '2021-09-19',
+ },
+ {
+ growUp: -3,
+ productName: '新余市办公用户采购项目',
+ count: 2015,
+ date: '2021-09-12',
+ },
+];
diff --git a/td_fronted/src/pages/dashboard/base/index.ts b/td_fronted/src/pages/dashboard/base/index.ts
new file mode 100644
index 0000000000..1bbe05bda1
--- /dev/null
+++ b/td_fronted/src/pages/dashboard/base/index.ts
@@ -0,0 +1,399 @@
+import dayjs from 'dayjs';
+import { EChartsOption } from 'echarts';
+
+import { TChartColor } from '@/config/color';
+import { t } from '@/locales/index';
+import { getRandomArray } from '@/utils/charts';
+import { getChartListColor } from '@/utils/color';
+
+/** 首页 dashboard 折线图 */
+export function constructInitDashboardDataset(type: string) {
+ const dateArray: Array = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
+
+ const datasetAxis = {
+ xAxis: {
+ type: 'category',
+ show: false,
+ data: dateArray,
+ },
+ yAxis: {
+ show: false,
+ type: 'value',
+ },
+ grid: {
+ top: 0,
+ left: 0,
+ right: 0,
+ bottom: 0,
+ },
+ };
+
+ if (type === 'line') {
+ const lineDataset = {
+ ...datasetAxis,
+ color: ['#fff'],
+ series: [
+ {
+ data: [150, 230, 224, 218, 135, 147, 260],
+ type,
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 0,
+ markPoint: {
+ data: [
+ { type: 'max', name: '最大值' },
+ { type: 'min', name: '最小值' },
+ ],
+ },
+ lineStyle: {
+ width: 2,
+ },
+ },
+ ],
+ };
+ return lineDataset;
+ }
+ const barDataset = {
+ ...datasetAxis,
+ color: getChartListColor(),
+ series: [
+ {
+ data: [
+ 100,
+ 130,
+ 184,
+ 218,
+ {
+ value: 135,
+ itemStyle: {
+ opacity: 0.2,
+ },
+ },
+ {
+ value: 118,
+ itemStyle: {
+ opacity: 0.2,
+ },
+ },
+ {
+ value: 60,
+ itemStyle: {
+ opacity: 0.2,
+ },
+ },
+ ],
+ type,
+ barWidth: 9,
+ },
+ ],
+ };
+ return barDataset;
+}
+
+/** 柱状图数据源 */
+export function constructInitDataset({
+ dateTime = [],
+ placeholderColor,
+ borderColor,
+}: { dateTime: Array } & TChartColor) {
+ const divideNum = 10;
+ const timeArray = [];
+ const inArray = [];
+ const outArray = [];
+ for (let i = 0; i < divideNum; i++) {
+ if (dateTime.length > 0) {
+ const dateAbsTime: number = (new Date(dateTime[1]).getTime() - new Date(dateTime[0]).getTime()) / divideNum;
+ const enhandTime: number = new Date(dateTime[0]).getTime() + dateAbsTime * i;
+ timeArray.push(dayjs(enhandTime).format('YYYY-MM-DD'));
+ } else {
+ timeArray.push(
+ dayjs()
+ .subtract(divideNum - i, 'day')
+ .format('YYYY-MM-DD'),
+ );
+ }
+
+ inArray.push(getRandomArray().toString());
+ outArray.push(getRandomArray().toString());
+ }
+
+ const dataset = {
+ color: getChartListColor(),
+ tooltip: {
+ trigger: 'item',
+ },
+ xAxis: {
+ type: 'category',
+ data: timeArray,
+ axisLabel: {
+ color: placeholderColor,
+ },
+ axisLine: {
+ lineStyle: {
+ color: getChartListColor()[1],
+ width: 1,
+ },
+ },
+ },
+ yAxis: {
+ type: 'value',
+ axisLabel: {
+ color: placeholderColor,
+ },
+ splitLine: {
+ lineStyle: {
+ color: borderColor,
+ },
+ },
+ },
+ grid: {
+ top: '5%',
+ left: '25px',
+ right: 0,
+ bottom: '60px',
+ },
+ legend: {
+ icon: 'rect',
+ itemWidth: 12,
+ itemHeight: 4,
+ itemGap: 48,
+ textStyle: {
+ fontSize: 12,
+ color: placeholderColor,
+ },
+ left: 'center',
+ bottom: '0',
+ orient: 'horizontal',
+ data: [t('pages.dashboardBase.chart.thisMonth'), t('pages.dashboardBase.chart.lastMonth')],
+ },
+ series: [
+ {
+ name: t('pages.dashboardBase.chart.thisMonth'),
+ data: outArray,
+ type: 'bar',
+ },
+ {
+ name: t('pages.dashboardBase.chart.lastMonth'),
+ data: inArray,
+ type: 'bar',
+ },
+ ],
+ };
+
+ return dataset;
+}
+
+/**
+ * 线性图表数据源
+ *
+ * @export
+ * @param {Array} [dateTime=[]]
+ * @returns {*}
+ */
+export function getLineChartDataSet({
+ dateTime = [],
+ placeholderColor,
+ borderColor,
+}: { dateTime?: Array } & TChartColor) {
+ const divideNum = 10;
+ const timeArray = [];
+ const inArray = [];
+ const outArray = [];
+ for (let i = 0; i < divideNum; i++) {
+ if (dateTime.length > 0) {
+ const dateAbsTime: number = (new Date(dateTime[1]).getTime() - new Date(dateTime[0]).getTime()) / divideNum;
+ const enhandTime: number = new Date(dateTime[0]).getTime() + dateAbsTime * i;
+ // console.log('dateAbsTime..', dateAbsTime, enhandTime);
+ timeArray.push(dayjs(enhandTime).format('MM-DD'));
+ } else {
+ timeArray.push(
+ dayjs()
+ .subtract(divideNum - i, 'day')
+ .format('MM-DD'),
+ );
+ }
+
+ inArray.push(getRandomArray().toString());
+ outArray.push(getRandomArray().toString());
+ }
+
+ const dataSet = {
+ color: getChartListColor(),
+ tooltip: {
+ trigger: 'item',
+ },
+ grid: {
+ left: '0',
+ right: '20px',
+ top: '5px',
+ bottom: '36px',
+ containLabel: true,
+ },
+ legend: {
+ left: 'center',
+ bottom: '0',
+ orient: 'horizontal', // legend 横向布局。
+ data: [t('pages.dashboardBase.chart.thisMonth'), t('pages.dashboardBase.chart.lastMonth')],
+ textStyle: {
+ fontSize: 12,
+ color: placeholderColor,
+ },
+ },
+ xAxis: {
+ type: 'category',
+ data: timeArray,
+ boundaryGap: false,
+ axisLabel: {
+ color: placeholderColor,
+ },
+ axisLine: {
+ lineStyle: {
+ width: 1,
+ },
+ },
+ },
+ yAxis: {
+ type: 'value',
+ axisLabel: {
+ color: placeholderColor,
+ },
+ splitLine: {
+ lineStyle: {
+ color: borderColor,
+ },
+ },
+ },
+ series: [
+ {
+ name: t('pages.dashboardBase.chart.thisMonth'),
+ data: outArray,
+ type: 'line',
+ smooth: false,
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ itemStyle: {
+ borderColor,
+ borderWidth: 1,
+ },
+ areaStyle: {
+ opacity: 0.1,
+ },
+ },
+ {
+ name: t('pages.dashboardBase.chart.lastMonth'),
+ data: inArray,
+ type: 'line',
+ smooth: false,
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ itemStyle: {
+ borderColor,
+ borderWidth: 1,
+ },
+ },
+ ],
+ };
+ return dataSet;
+}
+
+/**
+ * 获取饼图数据
+ *
+ * @export
+ * @param {number} [radius=1]
+ * @returns {*}
+ */
+export function getPieChartDataSet({
+ radius = 42,
+ textColor,
+ placeholderColor,
+ containerColor,
+}: { radius?: number } & Record): EChartsOption {
+ return {
+ color: getChartListColor(),
+ tooltip: {
+ show: false,
+ trigger: 'axis',
+ position: null,
+ },
+ grid: {
+ top: '0',
+ right: '0',
+ },
+ legend: {
+ selectedMode: false,
+ itemWidth: 12,
+ itemHeight: 4,
+ textStyle: {
+ fontSize: 12,
+ color: placeholderColor,
+ },
+ left: 'center',
+ bottom: '0',
+ orient: 'horizontal', // legend 横向布局。
+ },
+ series: [
+ {
+ name: '销售渠道',
+ type: 'pie',
+ radius: ['48%', '60%'],
+ avoidLabelOverlap: true,
+ selectedMode: true,
+ silent: true,
+ itemStyle: {
+ borderColor: containerColor,
+ borderWidth: 1,
+ },
+ label: {
+ show: true,
+ position: 'center',
+ formatter: ['{value|{d}%}', '{name|{b}}'].join('\n'),
+ rich: {
+ value: {
+ color: textColor,
+ fontSize: 28,
+ fontWeight: 'normal',
+ lineHeight: 46,
+ },
+ name: {
+ color: '#909399',
+ fontSize: 12,
+ lineHeight: 14,
+ },
+ },
+ },
+ emphasis: {
+ scale: true,
+ label: {
+ show: false,
+ rich: {
+ value: {
+ color: textColor,
+ fontSize: 28,
+ fontWeight: 'normal',
+ lineHeight: 46,
+ },
+ name: {
+ color: '#909399',
+ fontSize: 14,
+ lineHeight: 14,
+ },
+ },
+ },
+ },
+ labelLine: {
+ show: false,
+ },
+ data: [
+ {
+ value: 1048,
+ name: t('pages.dashboardBase.topPanel.analysis.channel1'),
+ },
+ { value: radius * 7, name: t('pages.dashboardBase.topPanel.analysis.channel2') },
+ ],
+ },
+ ],
+ };
+}
diff --git a/td_fronted/src/pages/dashboard/base/index.vue b/td_fronted/src/pages/dashboard/base/index.vue
new file mode 100644
index 0000000000..0f791af803
--- /dev/null
+++ b/td_fronted/src/pages/dashboard/base/index.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/dashboard/detail/constants.ts b/td_fronted/src/pages/dashboard/detail/constants.ts
new file mode 100644
index 0000000000..e9782b9a40
--- /dev/null
+++ b/td_fronted/src/pages/dashboard/detail/constants.ts
@@ -0,0 +1,52 @@
+import { t } from '@/locales';
+
+export const PANE_LIST_DATA = [
+ {
+ title: t('pages.dashboardDetail.topPanel.paneList.totalRequest'),
+ number: '1126',
+ upTrend: '10%',
+ },
+ {
+ title: t('pages.dashboardDetail.topPanel.paneList.suppliers'),
+ number: '13',
+ downTrend: '13%',
+ },
+ {
+ title: t('pages.dashboardDetail.topPanel.paneList.productCategory'),
+ number: '4',
+ upTrend: '10%',
+ },
+ {
+ title: t('pages.dashboardDetail.topPanel.paneList.applicant'),
+ number: 90,
+ downTrend: '44%',
+ leftType: 'icon-file-paste',
+ },
+ {
+ title: t('pages.dashboardDetail.topPanel.paneList.completionRate'),
+ number: 80.5,
+ upTrend: '70%',
+ },
+ {
+ title: t('pages.dashboardDetail.topPanel.paneList.arrivalRate'),
+ number: 78,
+ upTrend: '16%',
+ },
+];
+
+export const PRODUCT_LIST = [
+ {
+ description: t('pages.dashboardDetail.sslDescription'),
+ index: 1,
+ isSetup: true,
+ name: t('pages.dashboardDetail.ssl'),
+ type: 4,
+ },
+ {
+ description: t('pages.dashboardDetail.sslDescription'),
+ index: 1,
+ isSetup: true,
+ name: t('pages.dashboardDetail.ssl'),
+ type: 4,
+ },
+];
diff --git a/td_fronted/src/pages/dashboard/detail/index.ts b/td_fronted/src/pages/dashboard/detail/index.ts
new file mode 100644
index 0000000000..e13587eec4
--- /dev/null
+++ b/td_fronted/src/pages/dashboard/detail/index.ts
@@ -0,0 +1,271 @@
+import dayjs from 'dayjs';
+
+import { TChartColor } from '@/config/color';
+import { t } from '@/locales';
+import { getDateArray, getRandomArray } from '@/utils/charts';
+import { getChartListColor } from '@/utils/color';
+/**
+ * 散点图数据
+ *
+ * @export
+ * @returns {}
+ */
+export function getScatterDataSet({
+ dateTime = [],
+ placeholderColor,
+ borderColor,
+}: { dateTime?: Array } & TChartColor) {
+ const divideNum = 40;
+ const timeArray = [];
+ const inArray = [];
+ const outArray = [];
+ for (let i = 0; i < divideNum; i++) {
+ // const [timeArray, inArray, outArray] = dataset;
+ if (dateTime.length > 0) {
+ const dateAbsTime: number = (new Date(dateTime[1]).getTime() - new Date(dateTime[0]).getTime()) / divideNum;
+ const endTime: number = new Date(dateTime[0]).getTime() + dateAbsTime * i;
+ timeArray.push(dayjs(endTime).format('MM-DD'));
+ } else {
+ timeArray.push(
+ dayjs()
+ .subtract(divideNum - i, 'day')
+ .format('MM-DD'),
+ );
+ }
+
+ inArray.push(getRandomArray().toString());
+ outArray.push(getRandomArray().toString());
+ }
+
+ return {
+ color: getChartListColor(),
+ xAxis: {
+ data: timeArray,
+ axisLabel: {
+ color: placeholderColor,
+ },
+ splitLine: { show: false },
+ axisLine: {
+ lineStyle: {
+ color: borderColor,
+ width: 1,
+ },
+ },
+ },
+ yAxis: {
+ type: 'value',
+ axisLabel: {
+ color: placeholderColor,
+ },
+ nameTextStyle: {
+ padding: [0, 0, 0, 60],
+ },
+ axisTick: {
+ show: false,
+ axisLine: {
+ show: false,
+ },
+ },
+ axisLine: {
+ show: false,
+ },
+ splitLine: {
+ lineStyle: {
+ color: borderColor,
+ },
+ },
+ },
+ tooltip: {
+ trigger: 'item',
+ },
+ grid: {
+ top: '5px',
+ left: '25px',
+ right: '5px',
+ bottom: '60px',
+ },
+ legend: {
+ left: 'center',
+ bottom: '0',
+ orient: 'horizontal', // legend 横向布局。
+ data: [
+ t(`pages.dashboardDetail.procurement.goods.massageMachine`),
+ t(`pages.dashboardDetail.procurement.goods.coffeeMachine`),
+ ],
+ itemHeight: 8,
+ itemWidth: 8,
+ textStyle: {
+ fontSize: 12,
+ color: placeholderColor,
+ },
+ },
+ series: [
+ {
+ name: t(`pages.dashboardDetail.procurement.goods.massageMachine`),
+ symbolSize: 10,
+ data: outArray.reverse(),
+ type: 'scatter',
+ },
+ {
+ name: t(`pages.dashboardDetail.procurement.goods.coffeeMachine`),
+ symbolSize: 10,
+ data: inArray.concat(inArray.reverse()),
+ type: 'scatter',
+ },
+ ],
+ };
+}
+
+/** 折线图数据 */
+export function getFolderLineDataSet({
+ dateTime = [],
+ placeholderColor,
+ borderColor,
+}: { dateTime?: Array } & TChartColor) {
+ let dateArray = [];
+ for (let i = 1; i < 7; i++) {
+ dateArray.push(t(`pages.dashboardDetail.chart.week${i}`));
+ }
+ if (dateTime.length > 0) {
+ const divideNum = 7;
+ dateArray = getDateArray(dateTime, divideNum);
+ }
+ return {
+ color: getChartListColor(),
+ grid: {
+ top: '5%',
+ right: '10px',
+ left: '30px',
+ bottom: '60px',
+ },
+ legend: {
+ left: 'center',
+ bottom: '0',
+ orient: 'horizontal', // legend 横向布局。
+ data: [
+ t(`pages.dashboardDetail.procurement.goods.cup`),
+ t(`pages.dashboardDetail.procurement.goods.tea`),
+ t(`pages.dashboardDetail.procurement.goods.honey`),
+ t(`pages.dashboardDetail.procurement.goods.flour`),
+ ],
+ textStyle: {
+ fontSize: 12,
+ color: placeholderColor,
+ },
+ },
+ xAxis: {
+ type: 'category',
+ data: dateArray,
+ boundaryGap: false,
+ axisLabel: {
+ color: placeholderColor,
+ },
+ axisLine: {
+ lineStyle: {
+ color: borderColor,
+ width: 1,
+ },
+ },
+ },
+ yAxis: {
+ type: 'value',
+ axisLabel: {
+ color: placeholderColor,
+ },
+ splitLine: {
+ lineStyle: {
+ color: borderColor,
+ },
+ },
+ },
+ tooltip: {
+ trigger: 'item',
+ },
+ series: [
+ {
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ name: t(`pages.dashboardDetail.procurement.goods.cup`),
+ stack: '总量',
+ data: [
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ ],
+ type: 'line',
+ itemStyle: {
+ borderColor,
+ borderWidth: 1,
+ },
+ },
+ {
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ name: t(`pages.dashboardDetail.procurement.goods.tea`),
+ stack: '总量',
+ data: [
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ ],
+ type: 'line',
+ itemStyle: {
+ borderColor,
+ borderWidth: 1,
+ },
+ },
+ {
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ name: t(`pages.dashboardDetail.procurement.goods.honey`),
+ stack: '总量',
+ data: [
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ ],
+ type: 'line',
+ itemStyle: {
+ borderColor,
+ borderWidth: 1,
+ },
+ },
+ {
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ name: t(`pages.dashboardDetail.procurement.goods.flour`),
+ stack: '总量',
+ data: [
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ ],
+ type: 'line',
+ itemStyle: {
+ borderColor,
+ borderWidth: 1,
+ },
+ },
+ ],
+ };
+}
diff --git a/td_fronted/src/pages/dashboard/detail/index.vue b/td_fronted/src/pages/dashboard/detail/index.vue
new file mode 100644
index 0000000000..81c234b0e1
--- /dev/null
+++ b/td_fronted/src/pages/dashboard/detail/index.vue
@@ -0,0 +1,277 @@
+
+
+
+
+
+
+ {{ item.number }}
+
+
+ {{ t('pages.dashboardDetail.topPanel.quarter') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ onMaterialChange(value as string[])"
+ />
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('pages.dashboardDetail.satisfaction.export') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/detail/advanced/components/Product.vue b/td_fronted/src/pages/detail/advanced/components/Product.vue
new file mode 100644
index 0000000000..685a423741
--- /dev/null
+++ b/td_fronted/src/pages/detail/advanced/components/Product.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
{{ data.name }}
+
+ {{ data.subtitle }}
+
+
+
+ {{ data.size }}
+
+
+ {{ data.cpu }}
+
+
+ {{ data.memory }}
+
+
+
+
+ {{ data.info }}
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/detail/advanced/constants.ts b/td_fronted/src/pages/detail/advanced/constants.ts
new file mode 100644
index 0000000000..51ffbf136e
--- /dev/null
+++ b/td_fronted/src/pages/detail/advanced/constants.ts
@@ -0,0 +1,103 @@
+import { t } from '@/locales';
+
+export const BASE_INFO_DATA = [
+ {
+ name: t('constants.contract.name'),
+ value: '总部办公用品采购项目',
+ type: null,
+ },
+ {
+ name: t('constants.contract.status'),
+ value: '履行中',
+ type: {
+ key: 'contractStatus',
+ value: 'inProgress',
+ },
+ },
+ {
+ name: t('constants.contract.num'),
+ value: 'BH00010',
+ type: null,
+ },
+ {
+ name: t('constants.contract.type'),
+ value: t('constants.contract.typeOptions.main'),
+ type: null,
+ },
+ {
+ name: t('constants.contract.payType'),
+ value: t('constants.contract.pay'),
+ type: null,
+ },
+ {
+ name: t('constants.contract.amount'),
+ value: '¥ 5,000,000',
+ type: null,
+ },
+ {
+ name: t('constants.contract.company'),
+ value: '腾讯科技(深圳)有限公司',
+ type: null,
+ },
+ {
+ name: t('constants.contract.employee'),
+ value: '欧尚',
+ type: null,
+ },
+ {
+ name: t('constants.contract.signDate'),
+ value: '2020-12-20',
+ type: null,
+ },
+ {
+ name: t('constants.contract.effectiveDate'),
+ value: '2021-01-20',
+ type: null,
+ },
+ {
+ name: t('constants.contract.endDate'),
+ value: '2022-12-20',
+ type: null,
+ },
+ {
+ name: t('constants.contract.attachment'),
+ value: '总部办公用品采购项目合同.pdf',
+ type: {
+ key: 'contractAnnex',
+ value: 'pdf',
+ },
+ },
+ {
+ name: t('constants.contract.remark'),
+ value: '--',
+ type: null,
+ },
+ {
+ name: t('constants.contract.createDate'),
+ value: '2020-12-22 10:00:00',
+ type: null,
+ },
+];
+
+export const PRODUCT_LIST = [
+ {
+ name: 'MacBook Pro 2021',
+ subtitle: '苹果公司(Apple Inc. )',
+ size: '13.3 英寸',
+ cpu: 'Apple M1',
+ memory: 'RAM 16GB',
+ info: '最高可选配 16GB 内存 · 最高可选配 2TB 存储设备 电池续航最长达 18 小时',
+ use: 1420,
+ stock: 1500,
+ },
+ {
+ name: 'Surface Laptop Go',
+ subtitle: '微软(Microsoft Corporation)',
+ size: '12.4 英寸',
+ cpu: 'Core i7',
+ memory: 'RAM 16GB',
+ info: '常规使用 Surface,续航时间最长可达13小时 随时伴您工作',
+ use: 120,
+ stock: 2000,
+ },
+];
diff --git a/td_fronted/src/pages/detail/advanced/index.less b/td_fronted/src/pages/detail/advanced/index.less
new file mode 100644
index 0000000000..588fdebc23
--- /dev/null
+++ b/td_fronted/src/pages/detail/advanced/index.less
@@ -0,0 +1,91 @@
+@import '../base/index.less';
+
+.detail-advanced {
+ :deep(.t-card) {
+ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl);
+ }
+
+ :deep(.t-card__header) {
+ padding: 0;
+ margin-bottom: var(--td-comp-margin-m);
+ }
+
+ :deep(.t-card__body) {
+ padding: 0;
+ }
+
+ :deep(.t-card__title) {
+ font: var(--td-font-title-large);
+ font-weight: 400;
+ }
+
+ .advanced-card {
+ margin-top: 0 !important;
+
+ .card-title-default {
+ margin-bottom: var(--td-comp-margin-m);
+ }
+ }
+}
+
+.container-base-margin-top {
+ :deep(.t-card__body) {
+ margin-top: var(--td-comp-margin-xxxl);
+ }
+
+ :deep(.t-text-ellipsis) {
+ width: auto;
+ }
+}
+
+.product-block-container {
+ .t-col-xl-4 + .t-col-xl-4 {
+ @media (max-width: @screen-lg-max) {
+ .operator-gap {
+ margin: var(--td-comp-margin-l) 0 0 0;
+ }
+ }
+ }
+
+ .product-add {
+ width: 100%;
+ height: 240px;
+ display: flex;
+ place-items: center center;
+ border: dashed 1px var(--td-component-border);
+ border-radius: var(--td-radius-medium);
+
+ .product-sub-icon {
+ background: var(--td-brand-color-light);
+ color: var(--td-brand-color);
+ font-size: var(--td-comp-size-xxxl);
+ padding: calc(var(--td-comp-size-xxxl) - var(--td-comp-size-xl));
+ border-radius: 100%;
+ }
+
+ .product-sub {
+ font: var(--td-font-body-medium);
+ color: var(--td-text-color-secondary);
+ margin: 0 auto;
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ cursor: pointer;
+
+ svg {
+ rect {
+ fill: var(--td-brand-color-light);
+ }
+
+ path {
+ fill: var(--td-brand-color);
+ }
+ }
+ }
+
+ span {
+ padding-top: var(--td-comp-margin-xxl);
+ }
+ }
+}
diff --git a/td_fronted/src/pages/detail/advanced/index.vue b/td_fronted/src/pages/detail/advanced/index.vue
new file mode 100644
index 0000000000..0cb7942a3a
--- /dev/null
+++ b/td_fronted/src/pages/detail/advanced/index.vue
@@ -0,0 +1,256 @@
+
+
+
+
+
+
+
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('pages.detailCard.product.quarter') }}
+ {{ t('pages.detailCard.product.month') }}
+
+
+
+
+
+
+
+ {{ t('pages.detailCard.product.add') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.pdName }}
+ {{ row.pdType }}
+
+
+
+
+
+ {{ row.purchaseNum }}
+ 超预算
+
+
+
+
+
+ {{ t('pages.detailCard.detail.form.manage') }}
+ {{
+ t('pages.detailCard.detail.form.delete')
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/detail/base/index.less b/td_fronted/src/pages/detail/base/index.less
new file mode 100644
index 0000000000..420e27f425
--- /dev/null
+++ b/td_fronted/src/pages/detail/base/index.less
@@ -0,0 +1,28 @@
+.t-descriptions {
+ span {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ margin-left: var(--td-comp-margin-xxl);
+ }
+
+ i {
+ display: inline-block;
+ width: 8px;
+ height: 8px;
+ border-radius: var(--td-radius-circle);
+ background: var(--td-success-color);
+ }
+
+ .inProgress {
+ color: var(--td-success-color);
+ }
+
+ .pdf {
+ color: var(--td-brand-color);
+
+ &:hover {
+ cursor: pointer;
+ }
+ }
+}
diff --git a/td_fronted/src/pages/detail/base/index.vue b/td_fronted/src/pages/detail/base/index.vue
new file mode 100644
index 0000000000..2c01bcd8af
--- /dev/null
+++ b/td_fronted/src/pages/detail/base/index.vue
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/detail/deploy/constants.ts b/td_fronted/src/pages/detail/deploy/constants.ts
new file mode 100644
index 0000000000..0c6c9a34f0
--- /dev/null
+++ b/td_fronted/src/pages/detail/deploy/constants.ts
@@ -0,0 +1,82 @@
+export const BASE_INFO_DATA = [
+ {
+ name: '集群名',
+ value: 'helloworld',
+ type: null,
+ },
+ {
+ name: '集群ID',
+ value: 'cls - 2ntelvxw',
+ type: {
+ key: 'color',
+ value: 'blue',
+ },
+ },
+ {
+ name: '状态',
+ value: '运行中',
+ type: {
+ key: 'color',
+ value: 'green',
+ },
+ },
+ {
+ name: 'K8S版本',
+ value: '1.7.8',
+ type: null,
+ },
+ {
+ name: '配置',
+ value: '6.73 核 10.30 GB',
+ type: null,
+ },
+ {
+ name: '所在地域',
+ value: '广州',
+ type: null,
+ },
+ {
+ name: '新增资源所属项目',
+ value: '默认项目',
+ type: null,
+ },
+ {
+ name: '节点数量',
+ value: '4 个',
+ type: null,
+ },
+ {
+ name: '节点网络',
+ value: 'vpc - 5frmkm1x',
+ type: {
+ key: 'color',
+ value: 'blue',
+ },
+ },
+ {
+ name: '容器网络',
+ value: '172.16.0.0 / 16',
+ type: null,
+ },
+ {
+ name: '集群凭证',
+ value: '显示凭证',
+ type: {
+ key: 'color',
+ value: 'blue',
+ },
+ },
+ {
+ name: '创建/更新',
+ value: '2018-05-31 22:11:44 2018-05-31 22:11:44',
+ type: {
+ key: 'contractAnnex',
+ value: 'pdf',
+ },
+ },
+ {
+ name: '描述',
+ value: 'istio_test',
+ type: null,
+ },
+];
diff --git a/td_fronted/src/pages/detail/deploy/index.ts b/td_fronted/src/pages/detail/deploy/index.ts
new file mode 100644
index 0000000000..57aa074a9f
--- /dev/null
+++ b/td_fronted/src/pages/detail/deploy/index.ts
@@ -0,0 +1,219 @@
+import { TChartColor } from '@/config/color';
+import { t } from '@/locales/index';
+import { getDateArray, getRandomArray } from '@/utils/charts';
+import { getChartListColor } from '@/utils/color';
+
+/** 平滑图数据 */
+export function getSmoothLineDataSet({
+ dateTime = [],
+ placeholderColor,
+ borderColor,
+}: { dateTime?: Array } & TChartColor) {
+ let dateArray: Array = ['00:00', '02:00', '04:00', '06:00'];
+ if (dateTime.length > 0) {
+ const divideNum = 7;
+ dateArray = getDateArray(dateTime, divideNum);
+ }
+
+ return {
+ color: getChartListColor(),
+ tooltip: {
+ trigger: 'item',
+ },
+ grid: {
+ top: '10px',
+ left: '0',
+ right: '20px',
+ bottom: '36px',
+ containLabel: true,
+ },
+ xAxis: {
+ type: 'category',
+ data: dateArray,
+ boundaryGap: false,
+ axisLabel: {
+ color: placeholderColor,
+ },
+ axisLine: {
+ lineStyle: {
+ color: borderColor,
+ width: 1,
+ },
+ },
+ },
+ yAxis: {
+ type: 'value',
+ axisLabel: {
+ color: placeholderColor,
+ },
+ splitLine: {
+ lineStyle: {
+ color: borderColor,
+ },
+ },
+ },
+ legend: {
+ data: [t('pages.detailDeploy.deployTrend.thisMonth'), t('pages.detailDeploy.deployTrend.lastMonth')],
+ icon: 'circle',
+ bottom: '0',
+ itemGap: 48,
+ itemHeight: 8,
+ itemWidth: 8,
+ textStyle: {
+ fontSize: 12,
+ color: placeholderColor,
+ },
+ },
+ series: [
+ {
+ name: t('pages.detailDeploy.deployTrend.lastMonth'),
+ data: [
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ ],
+ type: 'line',
+ smooth: true,
+ color: getChartListColor()[0],
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ areaStyle: {
+ opacity: 0.1,
+ },
+ },
+ {
+ name: t('pages.detailDeploy.deployTrend.thisMonth'),
+ data: [
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ ],
+ type: 'line',
+ smooth: true,
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ color: getChartListColor()[1],
+ },
+ ],
+ };
+}
+
+export const lastYearList: Array = [100, 120, 140, 160, 180, 200, 210];
+
+/**
+ * 柱状图数据结构
+ *
+ * @export
+ * @param {boolean} [isMonth=false]
+ * @returns {*}
+ */
+export function get2ColBarChartDataSet({
+ isMonth = false,
+ placeholderColor,
+ borderColor,
+}: { isMonth?: boolean } & TChartColor) {
+ let lastYearListCopy = lastYearList.concat([]);
+ let thisYearListCopy = lastYearList.concat([]);
+
+ if (isMonth) {
+ lastYearListCopy = lastYearListCopy.reverse();
+ thisYearListCopy = thisYearListCopy.reverse();
+ }
+
+ const data = [];
+ for (let i = 1; i < 7; i++) {
+ data.push(t(`pages.detailDeploy.deployTrend.week${i}`));
+ }
+
+ return {
+ color: getChartListColor(),
+ tooltip: {
+ trigger: 'item',
+ },
+ grid: {
+ top: '10px',
+ left: '0',
+ right: '0',
+ bottom: '36px',
+ containLabel: true,
+ },
+ xAxis: [
+ {
+ type: 'category',
+ data,
+ axisTick: {
+ alignWithLabel: true,
+ },
+ axisLabel: {
+ color: placeholderColor,
+ },
+ axisLine: {
+ lineStyle: {
+ color: borderColor,
+ width: 1,
+ },
+ },
+ },
+ ],
+ yAxis: [
+ {
+ type: 'value',
+ axisLabel: {
+ color: placeholderColor,
+ },
+ splitLine: {
+ lineStyle: {
+ color: borderColor,
+ },
+ },
+ },
+ ],
+ legend: {
+ data: [t('pages.detailDeploy.deployTrend.lastYear'), t('pages.detailDeploy.deployTrend.thisYear')],
+ bottom: '0',
+ icon: 'rect',
+ itemGap: 48,
+ itemHeight: 4,
+ itemWidth: 12,
+ textStyle: {
+ fontSize: 12,
+ color: placeholderColor,
+ },
+ },
+ series: [
+ {
+ name: t('pages.detailDeploy.deployTrend.lastYear'),
+ type: 'bar',
+ barWidth: '30%',
+ data: lastYearListCopy,
+ itemStyle: {
+ color: '#BCC4D0',
+ },
+ },
+ {
+ name: t('pages.detailDeploy.deployTrend.thisYear'),
+ type: 'bar',
+ barWidth: '30%',
+ data: thisYearListCopy,
+ itemStyle: {
+ color: (params: { value: number }) => {
+ if (params.value >= 200) {
+ return getChartListColor()[1];
+ }
+ return getChartListColor()[0];
+ },
+ },
+ },
+ ],
+ };
+}
diff --git a/td_fronted/src/pages/detail/deploy/index.vue b/td_fronted/src/pages/detail/deploy/index.vue
new file mode 100644
index 0000000000..0e22a7692c
--- /dev/null
+++ b/td_fronted/src/pages/detail/deploy/index.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('pages.detailDeploy.deployTrend.thisWeek') }}
+ {{ t('pages.detailDeploy.deployTrend.thisMonth') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.adminName }}
+ {{ row.adminPhone }}
+
+
+
+
+ {{ t('pages.detailDeploy.projectList.table.manage') }}
+ {{
+ t('pages.detailDeploy.projectList.table.delete')
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.name }}
+ {{ item.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/detail/secondary/index.less b/td_fronted/src/pages/detail/secondary/index.less
new file mode 100644
index 0000000000..cff9b98770
--- /dev/null
+++ b/td_fronted/src/pages/detail/secondary/index.less
@@ -0,0 +1,76 @@
+.secondary-notification {
+ background-color: var(--td-bg-color-container);
+ border-radius: var(--td-radius-medium);
+ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl);
+
+ .t-tabs__content {
+ padding-top: 0;
+ }
+}
+
+.secondary-msg-list {
+ height: 70vh;
+
+ .t-list-item {
+ cursor: pointer;
+ padding: var(--td-comp-paddingTB-l) 0;
+ transition: 0.2s linear;
+
+ &:hover {
+ background-color: var(--td-bg-color-container-hover);
+
+ .msg-date {
+ display: none;
+ }
+
+ .msg-action {
+ display: flex;
+ align-items: center;
+
+ &-icon {
+ display: flex;
+ align-items: center;
+ }
+ }
+ }
+
+ :deep(.t-tag) {
+ margin-right: var(--td-comp-margin-l);
+ }
+
+ .t-tag.t-size-s {
+ margin-right: var(--td-comp-margin-s);
+ margin-left: 0;
+ }
+ }
+
+ .content {
+ font: var(--td-font-body-medium);
+ color: var(--td-text-color-placeholder);
+ text-align: left;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .unread {
+ color: var(--td-text-color-primary);
+ }
+
+ .msg-action {
+ display: none;
+ margin-right: var(--td-comp-margin-xxl);
+ transition: 0.2s linear;
+
+ .set-read-icon {
+ margin-right: var(--td-comp-margin-l);
+ }
+ }
+
+ &__empty-list {
+ min-height: 443px;
+ padding-top: 170px;
+ text-align: center;
+ color: var(--td-text-color-primary);
+ }
+}
diff --git a/td_fronted/src/pages/detail/secondary/index.vue b/td_fronted/src/pages/detail/secondary/index.vue
new file mode 100644
index 0000000000..c586c3b41e
--- /dev/null
+++ b/td_fronted/src/pages/detail/secondary/index.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+ {{ item.type }}
+
+ {{ item.content }}
+
+
+ {{ item.date }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('pages.detailSecondary.empty') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/form/base/constants.ts b/td_fronted/src/pages/form/base/constants.ts
new file mode 100644
index 0000000000..0eccc6e4f9
--- /dev/null
+++ b/td_fronted/src/pages/form/base/constants.ts
@@ -0,0 +1,45 @@
+import type { FormRule, UploadFile } from 'tdesign-vue-next';
+
+export const FORM_RULES: Record = {
+ name: [{ required: true, message: '请输入合同名称', type: 'error' }],
+ type: [{ required: true, message: '请选择合同类型', type: 'error' }],
+ payment: [{ required: true, message: '请选择合同收付类型', type: 'error' }],
+ amount: [{ required: true, message: '请输入合同金额', type: 'error' }],
+ partyA: [{ required: true, message: '请选择甲方', type: 'error' }],
+ partyB: [{ required: true, message: '请选择乙方', type: 'error' }],
+ signDate: [{ required: true, message: '请选择日期', type: 'error' }],
+ startDate: [{ required: true, message: '请选择日期', type: 'error' }],
+ endDate: [{ required: true, message: '请选择日期', type: 'error' }],
+};
+
+export const INITIAL_DATA = {
+ name: '',
+ type: '',
+ partyA: '',
+ partyB: '',
+ signDate: '',
+ startDate: '',
+ endDate: '',
+ payment: '1',
+ amount: 0,
+ comment: '',
+ files: [] as Array,
+};
+
+export const TYPE_OPTIONS = [
+ { label: 'Type A', value: '1' },
+ { label: 'Type B', value: '2' },
+ { label: 'Type C', value: '3' },
+];
+
+export const PARTY_A_OPTIONS = [
+ { label: 'Company A', value: '1' },
+ { label: 'Company B', value: '2' },
+ { label: 'Company C', value: '3' },
+];
+
+export const PARTY_B_OPTIONS = [
+ { label: 'Company A', value: '1' },
+ { label: 'Company B', value: '2' },
+ { label: 'Company C', value: '3' },
+];
diff --git a/td_fronted/src/pages/form/base/index.less b/td_fronted/src/pages/form/base/index.less
new file mode 100644
index 0000000000..ba7122520e
--- /dev/null
+++ b/td_fronted/src/pages/form/base/index.less
@@ -0,0 +1,61 @@
+.form-basic-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: var(--td-bg-color-container);
+ border-radius: var(--td-radius-medium) var(--td-radius-medium) 0 0;
+ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl) 80px var(--td-comp-paddingLR-xxl);
+
+ @media (max-width: @screen-sm-max) {
+ padding: var(--td-comp-paddingTB-xl) var(--td-comp-paddingLR-xl) 80px var(--td-comp-paddingLR-xl);
+
+ .form-basic-container-title {
+ margin: 0 0 var(--td-comp-margin-xxxl) 0;
+ }
+ }
+
+ .form-basic-item {
+ width: 676px;
+
+ .form-basic-container-title {
+ font: var(--td-font-title-large);
+ font-weight: 400;
+ color: var(--td-text-color-primary);
+ margin: var(--td-comp-margin-xxl) 0 var(--td-comp-margin-xl) 0;
+ }
+
+ .form-title-gap {
+ margin: calc(var(--td-comp-margin-xxl) * 2) 0 var(--td-comp-margin-xl) 0;
+ }
+ }
+}
+
+.form-submit-container {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding-top: var(--td-comp-paddingLR-xl);
+ padding-bottom: var(--td-comp-paddingLR-xl);
+ background-color: var(--td-bg-color-secondarycontainer);
+ border-bottom-left-radius: var(--td-radius-medium);
+ border-bottom-right-radius: var(--td-radius-medium);
+ border-top: 1px solid var(--td-component-stroke);
+
+ .form-submit-sub {
+ width: 676px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ .form-submit-left {
+ .form-submit-upload-span {
+ font-size: 14px;
+ line-height: 22px;
+ color: var(--td-text-color-placeholder);
+ padding-top: 8px;
+ display: inline-block;
+ }
+ }
+ }
+}
diff --git a/td_fronted/src/pages/form/base/index.vue b/td_fronted/src/pages/form/base/index.vue
new file mode 100644
index 0000000000..2e7a7d74d6
--- /dev/null
+++ b/td_fronted/src/pages/form/base/index.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/form/step/constants.ts b/td_fronted/src/pages/form/step/constants.ts
new file mode 100644
index 0000000000..6de203cb19
--- /dev/null
+++ b/td_fronted/src/pages/form/step/constants.ts
@@ -0,0 +1,55 @@
+import { FormRule } from 'tdesign-vue-next';
+
+export const FORM_RULES: Record = {
+ name: [{ required: true, type: 'error' }],
+ type: [{ required: true, type: 'error' }],
+ title: [{ required: true, type: 'error' }],
+ taxNum: [{ required: true, type: 'error' }],
+ consignee: [{ required: true, type: 'error' }],
+ mobileNum: [{ required: true, type: 'error' }],
+ deliveryAddress: [{ required: true, type: 'error' }],
+ fullAddress: [{ required: true, type: 'error' }],
+};
+
+export const NAME_OPTIONS = [
+ { label: 'A', value: '1' },
+ { label: 'B', value: '2' },
+ { label: 'C', value: '3' },
+];
+
+export const TYPE_OPTIONS = [
+ { label: 'Type A', value: '1' },
+ { label: 'Type B', value: '2' },
+ { label: 'Type C', value: '3' },
+];
+
+export const ADDRESS_OPTIONS = [
+ { label: '广东省深圳市南山区', value: '1' },
+ { label: '北京市海淀区', value: '2' },
+ { label: '上海市徐汇区', value: '3' },
+ { label: '四川省成都市高新区', value: '4' },
+ { label: '广东省广州市天河区', value: '5' },
+ { label: '陕西省西安市高新区', value: '6' },
+];
+
+export const INITIAL_DATA1 = {
+ name: '',
+ type: '',
+};
+
+export const INITIAL_DATA2 = {
+ title: '',
+ taxNum: '',
+ address: '',
+ bank: '',
+ bankAccount: '',
+ email: '',
+ tel: '',
+};
+
+export const INITIAL_DATA3 = {
+ consignee: '',
+ mobileNum: '',
+ deliveryAddress: '',
+ fullAddress: '',
+};
diff --git a/td_fronted/src/pages/form/step/index.less b/td_fronted/src/pages/form/step/index.less
new file mode 100644
index 0000000000..2eec9f45fa
--- /dev/null
+++ b/td_fronted/src/pages/form/step/index.less
@@ -0,0 +1,19 @@
+.form-step-container {
+ background-color: var(--td-bg-color-container);
+ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl);
+ border-radius: var(--td-radius-medium);
+
+ .t-card {
+ :deep(.t-card__body) {
+ padding: 0;
+ }
+ }
+}
+
+.rule-tips {
+ margin-top: var(--td-comp-margin-xxxl);
+}
+
+.step-form {
+ margin-top: var(--td-comp-margin-xxxl);
+}
diff --git a/td_fronted/src/pages/form/step/index.vue b/td_fronted/src/pages/form/step/index.vue
new file mode 100644
index 0000000000..2c0638e8fb
--- /dev/null
+++ b/td_fronted/src/pages/form/step/index.vue
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/list/base/index.vue b/td_fronted/src/pages/list/base/index.vue
new file mode 100644
index 0000000000..d70cb79c07
--- /dev/null
+++ b/td_fronted/src/pages/list/base/index.vue
@@ -0,0 +1,283 @@
+
+
+
+
+
+
{{ t('pages.listBase.create') }}
+
+ {{ t('pages.listBase.export') }}
+
+ {{ t('pages.listBase.select') }} {{ selectedRowKeys.length }} {{ t('pages.listBase.items') }}
+
+
+
+
+
+
+
+
+
+
+ rehandleSelectChange(value)"
+ >
+
+
+ {{ t('pages.listBase.contractStatusEnum.fail') }}
+
+ {{ t('pages.listBase.contractStatusEnum.audit') }}
+
+
+ {{ t('pages.listBase.contractStatusEnum.pending') }}
+
+
+ {{ t('pages.listBase.contractStatusEnum.executing') }}
+
+
+ {{ t('pages.listBase.contractStatusEnum.finish') }}
+
+
+
+ {{ t('pages.listBase.contractStatusEnum.fail') }}
+ {{ t('pages.listBase.contractStatusEnum.audit') }}
+
+ {{ t('pages.listBase.contractStatusEnum.pending') }}
+
+
+
+
+ {{ t('pages.listBase.pay') }}
+
+
+ {{ t('pages.listBase.receive') }}
+
+
+
+
+
+ {{ t('pages.listBase.detail') }}
+ {{ t('pages.listBase.delete') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/list/card/components/DialogForm.vue b/td_fronted/src/pages/list/card/components/DialogForm.vue
new file mode 100644
index 0000000000..5ca9d94ad9
--- /dev/null
+++ b/td_fronted/src/pages/list/card/components/DialogForm.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+ {{ t('pages.listCard.productStatusEnum.off') }}
+ {{ t('pages.listCard.productStatusEnum.on') }}
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+ 取消
+ 确定
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/list/card/index.vue b/td_fronted/src/pages/list/card/index.vue
new file mode 100644
index 0000000000..fd26e37eaf
--- /dev/null
+++ b/td_fronted/src/pages/list/card/index.vue
@@ -0,0 +1,204 @@
+
+
+
+
{{ t('pages.listCard.create') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/list/filter/index.vue b/td_fronted/src/pages/list/filter/index.vue
new file mode 100644
index 0000000000..7bfb9bdbea
--- /dev/null
+++ b/td_fronted/src/pages/list/filter/index.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/td_fronted/src/pages/list/tree/constants.ts b/td_fronted/src/pages/list/tree/constants.ts
new file mode 100644
index 0000000000..33dc05c1b3
--- /dev/null
+++ b/td_fronted/src/pages/list/tree/constants.ts
@@ -0,0 +1,86 @@
+export const TREE_DATA = [
+ {
+ label: '深圳总部',
+ value: 0,
+ children: [
+ {
+ label: '总办',
+ value: '0-0',
+ },
+ {
+ label: '市场部',
+ value: '0-1',
+ children: [
+ {
+ label: '采购1组',
+ value: '0-1-0',
+ },
+ {
+ label: '采购2组',
+ value: '0-1-1',
+ },
+ ],
+ },
+ {
+ label: '技术部',
+ value: '0-2',
+ },
+ ],
+ },
+ {
+ label: '北京总部',
+ value: 1,
+ children: [
+ {
+ label: '总办',
+ value: '1-0',
+ },
+ {
+ label: '市场部',
+ value: '1-1',
+ children: [
+ {
+ label: '采购1组',
+ value: '1-1-0',
+ },
+ {
+ label: '采购2组',
+ value: '1-1-1',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ label: '上海总部',
+ value: 2,
+ children: [
+ {
+ label: '市场部',
+ value: '2-0',
+ },
+ {
+ label: '财务部',
+ value: '2-1',
+ children: [
+ {
+ label: '财务1组',
+ value: '2-1-0',
+ },
+ {
+ label: '财务2组',
+ value: '2-1-1',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ label: '湖南',
+ value: 3,
+ },
+ {
+ label: '湖北',
+ value: 4,
+ },
+];
diff --git a/td_fronted/src/pages/list/tree/index.vue b/td_fronted/src/pages/list/tree/index.vue
new file mode 100644
index 0000000000..5296951484
--- /dev/null
+++ b/td_fronted/src/pages/list/tree/index.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/login/components/Header.vue b/td_fronted/src/pages/login/components/Header.vue
new file mode 100644
index 0000000000..2bf17afe2b
--- /dev/null
+++ b/td_fronted/src/pages/login/components/Header.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/login/components/Login.vue b/td_fronted/src/pages/login/components/Login.vue
new file mode 100644
index 0000000000..1fa120a520
--- /dev/null
+++ b/td_fronted/src/pages/login/components/Login.vue
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('pages.login.remember') }}
+ {{ t('pages.login.forget') }}
+
+
+
+
+
+
+ {{ t('pages.login.wechatLogin') }}
+ {{ t('pages.login.refresh') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ countDown == 0 ? t('pages.login.sendVerification') : `${countDown}秒后可重发` }}
+
+
+
+
+
+ {{ t('pages.login.signIn') }}
+
+
+
+ {{
+ t('pages.login.accountLogin')
+ }}
+ {{ t('pages.login.wechatLogin') }}
+ {{ t('pages.login.phoneLogin') }}
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/login/components/Register.vue b/td_fronted/src/pages/login/components/Register.vue
new file mode 100644
index 0000000000..a329577d40
--- /dev/null
+++ b/td_fronted/src/pages/login/components/Register.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ countDown == 0 ? '发送验证码' : `${countDown}秒后可重发` }}
+
+
+
+
+
+ 我已阅读并同意 TDesign服务协议 和
+ TDesign 隐私声明
+
+
+
+ 注册
+
+
+
+ {{
+ type == 'phone' ? '使用邮箱注册' : '使用手机号注册'
+ }}
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/login/index.less b/td_fronted/src/pages/login/index.less
new file mode 100644
index 0000000000..b978dd5760
--- /dev/null
+++ b/td_fronted/src/pages/login/index.less
@@ -0,0 +1,194 @@
+.light {
+ &.login-wrapper {
+ background-color: white;
+ background-image: url('@/assets/assets-login-bg-white.png');
+ }
+}
+
+.dark {
+ &.login-wrapper {
+ background-color: var(--td-bg-color-page);
+ background-image: url('@/assets/assets-login-bg-black.png');
+ }
+}
+
+.login-wrapper {
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ background-size: cover;
+ background-position: 100%;
+ position: relative;
+}
+
+.login-container {
+ position: absolute;
+ top: 22%;
+ left: 5%;
+ min-height: 500px;
+}
+
+.title-container {
+ .title {
+ font: var(--td-font-headline-large);
+ color: var(--td-text-color-primary);
+ margin-top: var(--td-comp-margin-xs);
+
+ &.margin-no {
+ margin-top: 0;
+ }
+ }
+
+ .sub-title {
+ margin-top: var(--td-comp-margin-xxl);
+
+ .tip {
+ display: inline-block;
+ margin-right: var(--td-comp-margin-s);
+ font: var(--td-font-body-medium);
+
+ &:first-child {
+ color: var(--td-text-color-secondary);
+ }
+
+ &:last-child {
+ color: var(--td-text-color-primary);
+ cursor: pointer;
+ }
+ }
+ }
+}
+
+.item-container {
+ width: 400px;
+ margin-top: var(--td-comp-margin-xxxxl);
+
+ &.login-qrcode {
+ .tip-container {
+ margin-bottom: var(--td-comp-margin-l);
+ font: var(--td-font-body-medium);
+ display: flex;
+ align-items: flex-start;
+
+ .tip {
+ color: var(--td-text-color-primary);
+ margin-right: var(--td-comp-margin-s);
+ }
+
+ .refresh {
+ display: flex;
+ align-items: center;
+ color: var(--td-brand-color);
+
+ .t-icon {
+ font-size: var(--td-comp-size-xxxs);
+ margin-left: var(--td-comp-margin-xs);
+ }
+
+ &:hover {
+ cursor: pointer;
+ }
+ }
+ }
+
+ .bottom-container {
+ margin-top: 32px;
+ }
+ }
+
+ &.login-phone {
+ .bottom-container {
+ margin-top: 66px;
+ }
+ }
+
+ .check-container {
+ display: flex;
+ align-items: center;
+
+ &.remember-pwd {
+ margin-bottom: var(--td-comp-margin-l);
+ justify-content: space-between;
+ }
+
+ span {
+ color: var(--td-brand-color);
+
+ &:hover {
+ cursor: pointer;
+ }
+ }
+ }
+
+ .verification-code {
+ display: flex;
+ align-items: center;
+
+ :deep(.t-form__controls) {
+ width: 100%;
+
+ button {
+ flex-shrink: 0;
+ margin-left: var(--td-comp-margin-l);
+ width: 128px;
+ }
+ }
+ }
+
+ .btn-container {
+ margin-top: var(--td-comp-margin-xxxxl);
+ }
+}
+
+.switch-container {
+ margin-top: var(--td-comp-margin-xxl);
+
+ .tip {
+ font: var(--td-font-body-medium);
+ color: var(--td-brand-color);
+ cursor: pointer;
+ display: inline-flex;
+ align-items: center;
+ margin-right: var(--td-comp-margin-l);
+
+ &:last-child {
+ &::after {
+ display: none;
+ }
+ }
+
+ &::after {
+ content: '';
+ display: block;
+ width: 1px;
+ height: 12px;
+ background: var(--td-component-stroke);
+ margin-left: var(--td-comp-margin-l);
+ }
+ }
+}
+
+.check-container {
+ font: var(--td-font-body-medium);
+ color: var(--td-text-color-secondary);
+
+ .tip {
+ float: right;
+ font: var(--td-font-body-medium);
+ color: var(--td-brand-color);
+ }
+}
+
+.copyright {
+ font: var(--td-font-body-medium);
+ position: absolute;
+ left: 5%;
+ bottom: 64px;
+ color: var(--td-text-color-secondary);
+}
+
+@media screen and (height <= 700px) {
+ .copyright {
+ display: none;
+ }
+}
diff --git a/td_fronted/src/pages/login/index.vue b/td_fronted/src/pages/login/index.vue
new file mode 100644
index 0000000000..940109c484
--- /dev/null
+++ b/td_fronted/src/pages/login/index.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
{{ t('pages.login.loginTitle') }}
+
TDesign Starter
+
+
{{ type == 'register' ? t('pages.login.existAccount') : t('pages.login.noAccount') }}
+
+ {{ type == 'register' ? t('pages.login.signIn') : t('pages.login.createAccount') }}
+
+
+
+
+
+
+
+
+
+
Copyright @ 2021-2023 Tencent. All Rights Reserved
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/new_pages/index.vue b/td_fronted/src/pages/new_pages/index.vue
new file mode 100644
index 0000000000..8cde26b9ed
--- /dev/null
+++ b/td_fronted/src/pages/new_pages/index.vue
@@ -0,0 +1,16 @@
+
+
+ index.vue示例
+
+
+
diff --git a/td_fronted/src/pages/result/403/index.vue b/td_fronted/src/pages/result/403/index.vue
new file mode 100644
index 0000000000..9628902441
--- /dev/null
+++ b/td_fronted/src/pages/result/403/index.vue
@@ -0,0 +1,14 @@
+
+
+ $router.push('/')">{{ t('pages.result.403.back') }}
+
+
+
+
diff --git a/td_fronted/src/pages/result/404/index.vue b/td_fronted/src/pages/result/404/index.vue
new file mode 100644
index 0000000000..ae96e2c4da
--- /dev/null
+++ b/td_fronted/src/pages/result/404/index.vue
@@ -0,0 +1,16 @@
+
+
+ $router.push('/')">{{ t('pages.result.404.back') }}
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/result/500/index.vue b/td_fronted/src/pages/result/500/index.vue
new file mode 100644
index 0000000000..abc38b9c4d
--- /dev/null
+++ b/td_fronted/src/pages/result/500/index.vue
@@ -0,0 +1,14 @@
+
+
+ $router.push('/')">{{ t('pages.result.500.back') }}
+
+
+
+
diff --git a/td_fronted/src/pages/result/browser-incompatible/index.vue b/td_fronted/src/pages/result/browser-incompatible/index.vue
new file mode 100644
index 0000000000..2147dd1e74
--- /dev/null
+++ b/td_fronted/src/pages/result/browser-incompatible/index.vue
@@ -0,0 +1,81 @@
+
+
+
+
$router.push('/')">{{
+ t('pages.result.browserIncompatible.back')
+ }}
+
+
{{ t('pages.result.browserIncompatible.recommend') }}
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/result/fail/index.vue b/td_fronted/src/pages/result/fail/index.vue
new file mode 100644
index 0000000000..718f766b6e
--- /dev/null
+++ b/td_fronted/src/pages/result/fail/index.vue
@@ -0,0 +1,50 @@
+
+
+
+
{{ t('pages.result.fail.title') }}
+
{{ t('pages.result.fail.subtitle') }}
+
+ $router.push('/dashboard/base')">{{
+ t('pages.result.fail.back')
+ }}
+ $router.push('/form/base')">{{ t('pages.result.fail.modify') }}
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/result/maintenance/index.vue b/td_fronted/src/pages/result/maintenance/index.vue
new file mode 100644
index 0000000000..607810c647
--- /dev/null
+++ b/td_fronted/src/pages/result/maintenance/index.vue
@@ -0,0 +1,15 @@
+
+
+ $router.push('/')">{{ t('pages.result.maintenance.back') }}
+
+
+
+
+
diff --git a/td_fronted/src/pages/result/network-error/index.vue b/td_fronted/src/pages/result/network-error/index.vue
new file mode 100644
index 0000000000..d4d5f37e6c
--- /dev/null
+++ b/td_fronted/src/pages/result/network-error/index.vue
@@ -0,0 +1,18 @@
+
+
+
+ $router.push('/')">{{ t('pages.result.networkError.back') }}
+ $router.push('/')">{{ t('pages.result.networkError.reload') }}
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/result/success/index.vue b/td_fronted/src/pages/result/success/index.vue
new file mode 100644
index 0000000000..cc5d12a7b6
--- /dev/null
+++ b/td_fronted/src/pages/result/success/index.vue
@@ -0,0 +1,50 @@
+
+
+
+
{{ t('pages.result.success.title') }}
+
{{ t('pages.result.success.subtitle') }}
+
+ $router.push('/detail/advanced')">
+ {{ t('pages.result.success.progress') }}
+
+ $router.push('/dashboard/base')"> {{ t('pages.result.success.back') }}
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/pages/user/constants.ts b/td_fronted/src/pages/user/constants.ts
new file mode 100644
index 0000000000..74f03adc45
--- /dev/null
+++ b/td_fronted/src/pages/user/constants.ts
@@ -0,0 +1,70 @@
+export interface UserInfoListType {
+ title: string;
+ content: string;
+ span?: number;
+}
+
+export const USER_INFO_LIST: Array = [
+ {
+ title: 'pages.user.personalInfo.desc.mobile',
+ content: '+86 13923734567',
+ },
+ {
+ title: 'pages.user.personalInfo.desc.phone',
+ content: '734567',
+ },
+ {
+ title: 'pages.user.personalInfo.desc.email',
+ content: 'Account@qq.com',
+ },
+ {
+ title: 'pages.user.personalInfo.desc.seat',
+ content: 'T32F 012',
+ },
+ {
+ title: 'pages.user.personalInfo.desc.entity',
+ content: '腾讯集团',
+ },
+ {
+ title: 'pages.user.personalInfo.desc.leader',
+ content: 'Michael Wang',
+ },
+ {
+ title: 'pages.user.personalInfo.desc.position',
+ content: '高级 UI 设计师',
+ },
+ {
+ title: 'pages.user.personalInfo.desc.joinDay',
+ content: '2021-07-01',
+ },
+ {
+ title: 'pages.user.personalInfo.desc.group',
+ content: '腾讯/腾讯公司/某事业群/某产品部/某运营中心/商户服务组',
+ span: 6,
+ },
+];
+
+export const TEAM_MEMBERS = [
+ {
+ avatar: 'https://avatars.githubusercontent.com/Wen1kang',
+ title: 'Lovellzhong 钟某某',
+ description: '直客销售 港澳拓展组员工',
+ },
+ {
+ avatar: 'https://avatars.githubusercontent.com/pengYYYYY',
+ title: 'Jiajingwang 彭某某',
+ description: '前端开发 前台研发组员工',
+ },
+ {
+ avatar: 'https://avatars.githubusercontent.com/u/24469546?s=96&v=4',
+ title: 'cruisezhang 林某某',
+ description: '技术产品 产品组员工',
+ },
+ {
+ avatar: 'https://avatars.githubusercontent.com/u/88708072?s=96&v=4',
+ title: 'Lovellzhang 商某某',
+ description: '产品运营 港澳拓展组员工',
+ },
+];
+
+export const PRODUCT_LIST = ['a', 'b', 'c', 'd'];
diff --git a/td_fronted/src/pages/user/index.less b/td_fronted/src/pages/user/index.less
new file mode 100644
index 0000000000..33bf30e8b8
--- /dev/null
+++ b/td_fronted/src/pages/user/index.less
@@ -0,0 +1,191 @@
+:deep(.t-card__title) {
+ font: var(--td-font-title-large);
+ font-weight: 400;
+}
+
+.user-left-greeting {
+ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl);
+ font: var(--td-font-title-large);
+ background: var(--td-bg-color-container);
+ color: var(--td-text-color-primary);
+ text-align: left;
+ border-radius: var(--td-radius-medium);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .regular {
+ margin-left: var(--td-comp-margin-xl);
+ font: var(--td-font-body-medium);
+ }
+
+ .logo {
+ width: 168px;
+ }
+}
+
+.user-info-list {
+ margin-top: var(--td-comp-margin-l);
+ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl);
+
+ .content {
+ width: 90%;
+ }
+
+ :deep(.t-card__header) {
+ padding: 0;
+ }
+
+ :deep(.t-card__body) {
+ padding: 0;
+ }
+
+ .contract {
+ &-title {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ margin: var(--td-comp-margin-xxxl) 0 var(--td-comp-margin-l);
+ font: var(--td-font-body-medium);
+ color: var(--td-text-color-placeholder);
+ }
+
+ &-detail {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ font: var(--td-font-body-medium);
+ color: var(--td-text-color-primary);
+ }
+ }
+
+ .contract:last-child {
+ margin-bottom: 0;
+ }
+}
+
+.user-intro {
+ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl);
+ background: var(--td-brand-color);
+ border-radius: var(--td-radius-medium);
+ color: var(--td-text-color-primary);
+
+ :deep(.t-card__body) {
+ padding: 0;
+ }
+
+ .name {
+ font: var(--td-font-title-large);
+ margin-top: var(--td-comp-margin-xxxl);
+ color: var(--td-text-color-anti);
+ }
+
+ .position {
+ font: var(--td-font-body-medium);
+ margin-top: var(--td-comp-margin-s);
+ color: var(--td-text-color-anti);
+ }
+
+ .user-info {
+ line-height: 24px;
+ font-size: 14px;
+ color: var(--td-text-color-primary);
+
+ .hiredate,
+ .del,
+ .mail {
+ display: flex;
+ }
+
+ .t-icon {
+ height: 24px;
+ margin-right: 8px;
+ }
+
+ .del {
+ margin: 16px 0;
+ }
+ }
+}
+
+.product-container {
+ margin-top: var(--td-comp-margin-l);
+ border-radius: var(--td-radius-medium);
+ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl);
+
+ :deep(.t-card__header) {
+ padding: 0;
+ margin-bottom: var(--td-comp-margin-m);
+ }
+
+ :deep(.t-card__body) {
+ padding: 0;
+ }
+
+ .content {
+ width: 100%;
+ margin: var(--td-comp-margin-xxxl) 0 0;
+ }
+
+ .logo {
+ width: var(--td-comp-size-xxl);
+ }
+}
+
+.content-container {
+ margin-top: var(--td-comp-margin-l);
+ background: var(--td-bg-color-container);
+ border-radius: var(--td-radius-medium);
+ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl);
+
+ :deep(.t-card__header) {
+ padding: 0;
+ }
+
+ :deep(.t-card__body) {
+ padding: 0;
+ }
+
+ .card-padding-no {
+ margin-top: var(--td-comp-margin-xxxl);
+
+ :deep(.t-card__body) {
+ margin-top: var(--td-comp-margin-xxl);
+ }
+ }
+}
+
+.user-team {
+ margin-top: var(--td-comp-margin-l);
+ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl);
+
+ :deep(.t-card__header) {
+ padding: 0;
+ margin-bottom: var(--td-comp-margin-m);
+ }
+
+ :deep(.t-card__body) {
+ padding: 0;
+ }
+
+ .t-list-item {
+ margin-top: var(--td-comp-margin-xxl);
+ padding: 0;
+
+ :deep(.t-list-item__meta-avatar) {
+ height: var(--td-comp-size-xxl);
+ width: var(--td-comp-size-xxl);
+ margin-right: var(--td-comp-margin-xxl);
+ }
+
+ :deep(.t-list-item__meta-title) {
+ margin: 0 0 var(--td-comp-margin-xs);
+ }
+
+ :deep(.t-list-item__meta-description) {
+ display: inline-block;
+ color: var(--td-text-color-placeholder);
+ font: var(--td-font-body-medium);
+ }
+ }
+}
diff --git a/td_fronted/src/pages/user/index.ts b/td_fronted/src/pages/user/index.ts
new file mode 100644
index 0000000000..3d501cf429
--- /dev/null
+++ b/td_fronted/src/pages/user/index.ts
@@ -0,0 +1,149 @@
+import { TChartColor } from '@/config/color';
+import { getDateArray, getRandomArray } from '@/utils/charts';
+import { getChartListColor } from '@/utils/color';
+
+/** 折线图数据 */
+export function getFolderLineDataSet({
+ dateTime = [],
+ placeholderColor,
+ borderColor,
+}: { dateTime?: Array } & TChartColor) {
+ let dateArray: Array = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
+ if (dateTime.length > 0) {
+ const divideNum = 7;
+ dateArray = getDateArray(dateTime, divideNum);
+ }
+ return {
+ color: getChartListColor(),
+ grid: {
+ top: '5%',
+ right: '10px',
+ left: '30px',
+ bottom: '60px',
+ },
+ legend: {
+ left: 'center',
+ bottom: '0',
+ orient: 'horizontal', // legend 横向布局。
+ data: ['杯子', '茶叶', '蜂蜜', '面粉'],
+ textStyle: {
+ fontSize: 12,
+ color: placeholderColor,
+ },
+ },
+ xAxis: {
+ type: 'category',
+ data: dateArray,
+ boundaryGap: false,
+ axisLabel: {
+ color: placeholderColor,
+ },
+ axisLine: {
+ lineStyle: {
+ color: borderColor,
+ width: 1,
+ },
+ },
+ },
+ yAxis: {
+ type: 'value',
+ axisLabel: {
+ color: placeholderColor,
+ },
+ splitLine: {
+ lineStyle: {
+ color: borderColor,
+ },
+ },
+ },
+ tooltip: {
+ trigger: 'item',
+ },
+ series: [
+ {
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ name: '杯子',
+ stack: '总量',
+ data: [
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ ],
+ type: 'line',
+ itemStyle: {
+ borderColor,
+ borderWidth: 1,
+ },
+ },
+ {
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ name: '茶叶',
+ stack: '总量',
+ data: [
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ ],
+ type: 'line',
+ itemStyle: {
+ borderColor,
+ borderWidth: 1,
+ },
+ },
+ {
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ name: '蜂蜜',
+ stack: '总量',
+ data: [
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ ],
+ type: 'line',
+ itemStyle: {
+ borderColor,
+ borderWidth: 1,
+ },
+ },
+ {
+ showSymbol: true,
+ symbol: 'circle',
+ symbolSize: 8,
+ name: '面粉',
+ stack: '总量',
+ data: [
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ getRandomArray(),
+ ],
+ type: 'line',
+ itemStyle: {
+ borderColor,
+ borderWidth: 1,
+ },
+ },
+ ],
+ };
+}
diff --git a/td_fronted/src/pages/user/index.vue b/td_fronted/src/pages/user/index.vue
new file mode 100644
index 0000000000..e1d598e0e5
--- /dev/null
+++ b/td_fronted/src/pages/user/index.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+ Hi,Image
+ {{ t('pages.user.markDay') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.content }}
+
+
+
+
+
+
+
+ {{ t('pages.user.contentList') }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('pages.user.contentList') }}
+
+
+
+
+
+
+
+ T
+ My Account
+ {{ t('pages.user.personalInfo.position') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/td_fronted/src/permission.ts b/td_fronted/src/permission.ts
new file mode 100644
index 0000000000..0879f75ee0
--- /dev/null
+++ b/td_fronted/src/permission.ts
@@ -0,0 +1,82 @@
+import 'nprogress/nprogress.css'; // progress bar style
+
+import NProgress from 'nprogress'; // progress bar
+import { MessagePlugin } from 'tdesign-vue-next';
+import { RouteRecordRaw } from 'vue-router';
+
+import router from '@/router';
+import { getPermissionStore, useUserStore } from '@/store';
+import { PAGE_NOT_FOUND_ROUTE } from '@/utils/route/constant';
+
+NProgress.configure({ showSpinner: false });
+
+router.beforeEach(async (to, from, next) => {
+ NProgress.start();
+
+ const permissionStore = getPermissionStore();
+ const { whiteListRouters } = permissionStore;
+
+ const userStore = useUserStore();
+
+ if (userStore.token) {
+ if (to.path === '/login') {
+ next();
+ return;
+ }
+ try {
+ await userStore.getUserInfo();
+
+ const { asyncRoutes } = permissionStore;
+
+ if (asyncRoutes && asyncRoutes.length === 0) {
+ const routeList = await permissionStore.buildAsyncRoutes();
+ routeList.forEach((item: RouteRecordRaw) => {
+ router.addRoute(item);
+ });
+
+ if (to.name === PAGE_NOT_FOUND_ROUTE.name) {
+ // 动态添加路由后,此处应当重定向到fullPath,否则会加载404页面内容
+ next({ path: to.fullPath, replace: true, query: to.query });
+ } else {
+ const redirect = decodeURIComponent((from.query.redirect || to.path) as string);
+ next(to.path === redirect ? { ...to, replace: true } : { path: redirect, query: to.query });
+ return;
+ }
+ }
+ if (router.hasRoute(to.name)) {
+ next();
+ } else {
+ next(`/`);
+ }
+ } catch (error) {
+ MessagePlugin.error(error.message);
+ next({
+ path: '/login',
+ query: { redirect: encodeURIComponent(to.fullPath) },
+ });
+ NProgress.done();
+ }
+ } else {
+ /* white list router */
+ if (whiteListRouters.indexOf(to.path) !== -1) {
+ next();
+ } else {
+ next({
+ path: '/login',
+ query: { redirect: encodeURIComponent(to.fullPath) },
+ });
+ }
+ NProgress.done();
+ }
+});
+
+router.afterEach((to) => {
+ if (to.path === '/login') {
+ const userStore = useUserStore();
+ const permissionStore = getPermissionStore();
+
+ userStore.logout();
+ permissionStore.restoreRoutes();
+ }
+ NProgress.done();
+});
diff --git a/td_fronted/src/router/index.ts b/td_fronted/src/router/index.ts
new file mode 100644
index 0000000000..7b49f0bf38
--- /dev/null
+++ b/td_fronted/src/router/index.ts
@@ -0,0 +1,92 @@
+import uniq from 'lodash/uniq';
+import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
+
+const env = import.meta.env.MODE || 'development';
+
+// 导入homepage相关固定路由
+const homepageModules = import.meta.glob('./modules/**/homepage.ts', { eager: true });
+
+// 导入modules非homepage相关固定路由
+const fixedModules = import.meta.glob('./modules/**/!(homepage).ts', { eager: true });
+
+// 其他固定路由
+const defaultRouterList: Array = [
+ {
+ path: '/login',
+ name: 'login',
+ component: () => import('@/pages/login/index.vue'),
+ },
+ {
+ path: '/',
+ redirect: '/dashboard/base',
+ },
+];
+// 存放固定路由
+export const homepageRouterList: Array = mapModuleRouterList(homepageModules);
+export const fixedRouterList: Array = mapModuleRouterList(fixedModules);
+
+export const allRoutes = [...homepageRouterList, ...fixedRouterList, ...defaultRouterList];
+
+// 固定路由模块转换为路由
+export function mapModuleRouterList(modules: Record): Array {
+ const routerList: Array = [];
+ Object.keys(modules).forEach((key) => {
+ // @ts-ignore
+ const mod = modules[key].default || {};
+ const modList = Array.isArray(mod) ? [...mod] : [mod];
+ routerList.push(...modList);
+ });
+ return routerList;
+}
+
+/**
+ *
+ * @deprecated 未使用
+ */
+export const getRoutesExpanded = () => {
+ const expandedRoutes: Array = [];
+
+ fixedRouterList.forEach((item) => {
+ if (item.meta && item.meta.expanded) {
+ expandedRoutes.push(item.path);
+ }
+ if (item.children && item.children.length > 0) {
+ item.children
+ .filter((child) => child.meta && child.meta.expanded)
+ .forEach((child: RouteRecordRaw) => {
+ expandedRoutes.push(item.path);
+ expandedRoutes.push(`${item.path}/${child.path}`);
+ });
+ }
+ });
+ return uniq(expandedRoutes);
+};
+
+export const getActive = (maxLevel = 3): string => {
+ // 非组件内调用必须通过Router实例获取当前路由
+ const route = router.currentRoute.value;
+
+ if (!route.path) {
+ return '';
+ }
+
+ return route.path
+ .split('/')
+ .filter((_item: string, index: number) => index <= maxLevel && index > 0)
+ .map((item: string) => `/${item}`)
+ .join('');
+};
+
+const router = createRouter({
+ history: createWebHistory(env === 'site' ? '/starter/vue-next/' : import.meta.env.VITE_BASE_URL),
+ routes: allRoutes,
+ scrollBehavior() {
+ return {
+ el: '#app',
+ top: 0,
+ behavior: 'smooth',
+ };
+ },
+});
+
+export default router;
diff --git a/td_fronted/src/router/modules/homepage.ts b/td_fronted/src/router/modules/homepage.ts
new file mode 100644
index 0000000000..883738a2a8
--- /dev/null
+++ b/td_fronted/src/router/modules/homepage.ts
@@ -0,0 +1,45 @@
+import { DashboardIcon } from 'tdesign-icons-vue-next';
+import { shallowRef } from 'vue';
+
+import Layout from '@/layouts/index.vue';
+
+export default [
+ {
+ path: '/dashboard',
+ component: Layout,
+ redirect: '/dashboard/base',
+ name: 'dashboard',
+ meta: {
+ title: {
+ zh_CN: '仪表盘',
+ en_US: 'Dashboard',
+ },
+ icon: shallowRef(DashboardIcon),
+ orderNo: 0,
+ },
+ children: [
+ {
+ path: 'base',
+ name: 'DashboardBase',
+ component: () => import('@/pages/dashboard/base/index.vue'),
+ meta: {
+ title: {
+ zh_CN: '概览仪表盘',
+ en_US: 'Overview',
+ },
+ },
+ },
+ {
+ path: 'detail',
+ name: 'DashboardDetail',
+ component: () => import('@/pages/dashboard/detail/index.vue'),
+ meta: {
+ title: {
+ zh_CN: '统计报表',
+ en_US: 'Dashboard Detail',
+ },
+ },
+ },
+ ],
+ },
+];
diff --git a/td_fronted/src/router/modules/newpage.ts b/td_fronted/src/router/modules/newpage.ts
new file mode 100644
index 0000000000..7220c82dc0
--- /dev/null
+++ b/td_fronted/src/router/modules/newpage.ts
@@ -0,0 +1,30 @@
+import Layout from '@/layouts/index.vue';
+
+export default [
+ {
+ path: '/new',
+ name: 'new',
+ component: Layout,
+ redirect: '/new_pages/index',
+ meta: {
+ title: {
+ zh_CN: '新页面',
+ en_US: 'new pages',
+ },
+ icon: 'circle',
+ },
+ children: [
+ {
+ path: 'success',
+ name: 'ResultSuccess',
+ component: () => import('@/pages/result/success/index.vue'),
+ meta: {
+ title: {
+ zh_CN: '成功页',
+ en_US: 'Success',
+ },
+ },
+ },
+ ],
+ },
+];
diff --git a/td_fronted/src/router/modules/result.ts b/td_fronted/src/router/modules/result.ts
new file mode 100644
index 0000000000..0cc0f383f2
--- /dev/null
+++ b/td_fronted/src/router/modules/result.ts
@@ -0,0 +1,82 @@
+import Layout from '@/layouts/index.vue';
+
+export default [
+ {
+ path: '/result',
+ name: 'result',
+ component: Layout,
+ redirect: '/result/success',
+ meta: {
+ title: {
+ zh_CN: '结果页',
+ en_US: 'Result',
+ },
+ icon: 'check-circle',
+ },
+ children: [
+ {
+ path: 'success',
+ name: 'ResultSuccess',
+ component: () => import('@/pages/result/success/index.vue'),
+ meta: {
+ title: {
+ zh_CN: '成功页',
+ en_US: 'Success',
+ },
+ },
+ },
+ {
+ path: 'fail',
+ name: 'ResultFail',
+ component: () => import('@/pages/result/fail/index.vue'),
+ meta: {
+ title: {
+ zh_CN: '失败页',
+ en_US: 'Fail',
+ },
+ },
+ },
+ {
+ path: 'network-error',
+ name: 'ResultNetworkError',
+ component: () => import('@/pages/result/network-error/index.vue'),
+ meta: {
+ title: {
+ zh_CN: '网络异常',
+ en_US: 'Network Error',
+ },
+ },
+ },
+ {
+ path: '403',
+ name: 'Result403',
+ component: () => import('@/pages/result/403/index.vue'),
+ meta: { title: { zh_CN: '无权限', en_US: 'Forbidden' } },
+ },
+ {
+ path: '404',
+ name: 'Result404',
+ component: () => import('@/pages/result/404/index.vue'),
+ meta: { title: { zh_CN: '访问页面不存在页', en_US: 'Not Found' } },
+ },
+ {
+ path: '500',
+ name: 'Result500',
+ component: () => import('@/pages/result/500/index.vue'),
+ meta: { title: { zh_CN: '服务器出错页', en_US: 'Server Error' } },
+ },
+ {
+ path: 'browser-incompatible',
+ name: 'ResultBrowserIncompatible',
+ component: () => import('@/pages/result/browser-incompatible/index.vue'),
+ meta: { title: { zh_CN: '浏览器不兼容页', en_US: 'BrowserIncompatible' } },
+ },
+ {
+ path: 'maintenance',
+ name: 'ResultMaintenance',
+ component: () => import('@/pages/result/maintenance/index.vue'),
+ meta: { title: { zh_CN: '系统维护页', en_US: 'Maintenance' } },
+ },
+ ],
+ },
+];
diff --git a/td_fronted/src/router/modules/user.ts b/td_fronted/src/router/modules/user.ts
new file mode 100644
index 0000000000..df99231608
--- /dev/null
+++ b/td_fronted/src/router/modules/user.ts
@@ -0,0 +1,37 @@
+import { LogoutIcon } from 'tdesign-icons-vue-next';
+import { shallowRef } from 'vue';
+
+import Layout from '@/layouts/index.vue';
+
+export default [
+ {
+ path: '/user',
+ name: 'user',
+ component: Layout,
+ redirect: '/user/index',
+ meta: { title: { zh_CN: '个人中心', en_US: 'User Center' }, icon: 'user-circle' },
+ children: [
+ {
+ path: 'index',
+ name: 'UserIndex',
+ component: () => import('@/pages/user/index.vue'),
+ meta: { title: { zh_CN: '个人中心', en_US: 'User Center' } },
+ },
+ ],
+ },
+ {
+ path: '/loginRedirect',
+ name: 'loginRedirect',
+ redirect: '/login',
+ meta: { title: { zh_CN: '登录页', en_US: 'Login' }, icon: shallowRef(LogoutIcon) },
+ component: () => import('@/layouts/blank.vue'),
+ children: [
+ {
+ path: 'index',
+ redirect: '/login',
+ component: () => import('@/layouts/blank.vue'),
+ meta: { title: { zh_CN: '登录页', en_US: 'Login' } },
+ },
+ ],
+ },
+];
diff --git a/td_fronted/src/store/index.ts b/td_fronted/src/store/index.ts
new file mode 100644
index 0000000000..862341afb7
--- /dev/null
+++ b/td_fronted/src/store/index.ts
@@ -0,0 +1,15 @@
+import { createPinia } from 'pinia';
+import { createPersistedState } from 'pinia-plugin-persistedstate';
+
+const store = createPinia();
+store.use(createPersistedState());
+
+export { store };
+
+export * from './modules/notification';
+export * from './modules/permission';
+export * from './modules/setting';
+export * from './modules/tabs-router';
+export * from './modules/user';
+
+export default store;
diff --git a/td_fronted/src/store/modules/notification.ts b/td_fronted/src/store/modules/notification.ts
new file mode 100644
index 0000000000..c5fabd3b08
--- /dev/null
+++ b/td_fronted/src/store/modules/notification.ts
@@ -0,0 +1,60 @@
+import { defineStore } from 'pinia';
+
+import type { NotificationItem } from '@/types/interface';
+
+const msgData = [
+ {
+ id: '123',
+ content: '腾讯大厦一楼改造施工项目 已通过审核!',
+ type: '合同动态',
+ status: true,
+ collected: false,
+ date: '2021-01-01 08:00',
+ quality: 'high',
+ },
+ {
+ id: '124',
+ content: '三季度生产原材料采购项目 开票成功!',
+ type: '票务动态',
+ status: true,
+ collected: false,
+ date: '2021-01-01 08:00',
+ quality: 'low',
+ },
+ {
+ id: '125',
+ content: '2021-01-01 10:00的【国家电网线下签约】会议即将开始,请提前10分钟前往 会议室1 进行签到!',
+ type: '会议通知',
+ status: true,
+ collected: false,
+ date: '2021-01-01 08:00',
+ quality: 'middle',
+ },
+ {
+ id: '126',
+ content: '一季度生产原材料采购项目 开票成功!',
+ type: '票务动态',
+ status: true,
+ collected: false,
+ date: '2021-01-01 08:00',
+ quality: 'low',
+ },
+];
+
+type MsgDataType = typeof msgData;
+
+export const useNotificationStore = defineStore('notification', {
+ state: () => ({
+ msgData,
+ }),
+ getters: {
+ unreadMsg: (state) => state.msgData.filter((item: NotificationItem) => item.status),
+ readMsg: (state) => state.msgData.filter((item: NotificationItem) => !item.status),
+ },
+ actions: {
+ setMsgData(data: MsgDataType) {
+ this.msgData = data;
+ },
+ },
+ persist: true,
+});
diff --git a/td_fronted/src/store/modules/permission-fe.ts b/td_fronted/src/store/modules/permission-fe.ts
new file mode 100644
index 0000000000..2c08b61688
--- /dev/null
+++ b/td_fronted/src/store/modules/permission-fe.ts
@@ -0,0 +1,70 @@
+// 前端 roles 控制菜单权限 通过登录后的角色对菜单就行过滤处理
+// 如果需要前端 roles 控制菜单权限 请使用此文件代码替换 permission.ts 的内容
+
+import { defineStore } from 'pinia';
+import { RouteRecordRaw } from 'vue-router';
+
+import router, { allRoutes } from '@/router';
+import { store } from '@/store';
+
+function filterPermissionsRouters(routes: Array, roles: Array) {
+ const res: Array = [];
+ const removeRoutes: Array = [];
+ routes.forEach((route) => {
+ const children: Array = [];
+ route.children?.forEach((childRouter) => {
+ const roleCode = childRouter.meta?.roleCode || childRouter.name;
+ if (roles.indexOf(roleCode) !== -1) {
+ children.push(childRouter);
+ } else {
+ removeRoutes.push(childRouter);
+ }
+ });
+ if (children.length > 0) {
+ route.children = children;
+ res.push(route);
+ }
+ });
+ return { accessedRouters: res, removeRoutes };
+}
+
+export const usePermissionStore = defineStore('permission', {
+ state: () => ({
+ whiteListRouters: ['/login'],
+ routers: [],
+ removeRoutes: [],
+ }),
+ actions: {
+ async initRoutes(roles: Array) {
+ let accessedRouters = [];
+
+ let removeRoutes: Array = [];
+ // special token
+ if (roles.includes('all')) {
+ accessedRouters = allRoutes;
+ } else {
+ const res = filterPermissionsRouters(allRoutes, roles);
+ accessedRouters = res.accessedRouters;
+ removeRoutes = res.removeRoutes;
+ }
+
+ this.routers = accessedRouters;
+ this.removeRoutes = removeRoutes;
+
+ removeRoutes.forEach((item: RouteRecordRaw) => {
+ if (router.hasRoute(item.name)) {
+ router.removeRoute(item.name);
+ }
+ });
+ },
+ async restore() {
+ this.removeRoutes.forEach((item: RouteRecordRaw) => {
+ router.addRoute(item);
+ });
+ },
+ },
+});
+
+export function getPermissionStore() {
+ return usePermissionStore(store);
+}
diff --git a/td_fronted/src/store/modules/permission.ts b/td_fronted/src/store/modules/permission.ts
new file mode 100644
index 0000000000..b0e81b36dc
--- /dev/null
+++ b/td_fronted/src/store/modules/permission.ts
@@ -0,0 +1,53 @@
+import { defineStore } from 'pinia';
+import { RouteRecordRaw } from 'vue-router';
+
+import { RouteItem } from '@/api/model/permissionModel';
+import { getMenuList } from '@/api/permission';
+import router, { fixedRouterList, homepageRouterList } from '@/router';
+import { store } from '@/store';
+import { transformObjectToRoute } from '@/utils/route';
+
+export const usePermissionStore = defineStore('permission', {
+ state: () => ({
+ whiteListRouters: ['/login'],
+ routers: [],
+ removeRoutes: [],
+ asyncRoutes: [],
+ }),
+ actions: {
+ async initRoutes() {
+ const accessedRouters = this.asyncRoutes;
+
+ // 在菜单展示全部路由
+ this.routers = [...homepageRouterList, ...accessedRouters, ...fixedRouterList];
+ // 在菜单只展示动态路由和首页
+ // this.routers = [...homepageRouterList, ...accessedRouters];
+ // 在菜单只展示动态路由
+ // this.routers = [...accessedRouters];
+ },
+ async buildAsyncRoutes() {
+ try {
+ // 发起菜单权限请求 获取菜单列表
+ const asyncRoutes: Array = (await getMenuList()).list;
+ this.asyncRoutes = transformObjectToRoute(asyncRoutes);
+ await this.initRoutes();
+ return this.asyncRoutes;
+ } catch (error) {
+ throw new Error("Can't build routes");
+ }
+ },
+ async restoreRoutes() {
+ // 不需要在此额外调用initRoutes更新侧边导肮内容,在登录后asyncRoutes为空会调用
+ this.asyncRoutes.forEach((item: RouteRecordRaw) => {
+ if (item.name) {
+ router.removeRoute(item.name);
+ }
+ });
+ this.asyncRoutes = [];
+ },
+ },
+});
+
+export function getPermissionStore() {
+ return usePermissionStore(store);
+}
diff --git a/td_fronted/src/store/modules/setting.ts b/td_fronted/src/store/modules/setting.ts
new file mode 100644
index 0000000000..c7bf25e09c
--- /dev/null
+++ b/td_fronted/src/store/modules/setting.ts
@@ -0,0 +1,110 @@
+import keys from 'lodash/keys';
+import { defineStore } from 'pinia';
+import { Color } from 'tvision-color';
+
+import { DARK_CHART_COLORS, LIGHT_CHART_COLORS, TColorSeries } from '@/config/color';
+import STYLE_CONFIG from '@/config/style';
+import { store } from '@/store';
+import { ModeType } from '@/types/interface';
+import { generateColorMap, insertThemeStylesheet } from '@/utils/color';
+
+const state: Record = {
+ ...STYLE_CONFIG,
+ showSettingPanel: false,
+ colorList: {} as TColorSeries,
+ chartColors: LIGHT_CHART_COLORS,
+};
+
+export type TState = typeof state;
+export type TStateKey = keyof typeof state;
+
+export const useSettingStore = defineStore('setting', {
+ state: () => state,
+ getters: {
+ showSidebar: (state) => state.layout !== 'top',
+ showSidebarLogo: (state) => state.layout === 'side',
+ showHeaderLogo: (state) => state.layout !== 'side',
+ displayMode: (state): ModeType => {
+ if (state.mode === 'auto') {
+ const media = window.matchMedia('(prefers-color-scheme:dark)');
+ if (media.matches) {
+ return 'dark';
+ }
+ return 'light';
+ }
+ return state.mode as ModeType;
+ },
+ displaySideMode: (state): ModeType => {
+ return state.sideMode as ModeType;
+ },
+ },
+ actions: {
+ async changeMode(mode: ModeType | 'auto') {
+ let theme = mode;
+
+ if (mode === 'auto') {
+ theme = this.getMediaColor();
+ }
+ const isDarkMode = theme === 'dark';
+
+ document.documentElement.setAttribute('theme-mode', isDarkMode ? 'dark' : '');
+
+ this.chartColors = isDarkMode ? DARK_CHART_COLORS : LIGHT_CHART_COLORS;
+ },
+ async changeSideMode(mode: ModeType) {
+ const isDarkMode = mode === 'dark';
+
+ document.documentElement.setAttribute('side-mode', isDarkMode ? 'dark' : '');
+ },
+ getMediaColor() {
+ const media = window.matchMedia('(prefers-color-scheme:dark)');
+
+ if (media.matches) {
+ return 'dark';
+ }
+ return 'light';
+ },
+ changeBrandTheme(brandTheme: string) {
+ const mode = this.displayMode;
+ // 以主题色加显示模式作为键
+ const colorKey = `${brandTheme}[${mode}]`;
+ let colorMap = this.colorList[colorKey];
+ // 如果不存在色阶,就需要计算
+ if (colorMap === undefined) {
+ const [{ colors: newPalette, primary: brandColorIndex }] = Color.getColorGradations({
+ colors: [brandTheme],
+ step: 10,
+ remainInput: false, // 是否保留输入 不保留会矫正不合适的主题色
+ });
+ colorMap = generateColorMap(brandTheme, newPalette, mode, brandColorIndex);
+ this.colorList[colorKey] = colorMap;
+ }
+ // TODO 需要解决不停切换时有反复插入 style 的问题
+ insertThemeStylesheet(brandTheme, colorMap, mode);
+ document.documentElement.setAttribute('theme-color', brandTheme);
+ },
+ updateConfig(payload: Partial) {
+ for (const key in payload) {
+ if (payload[key as TStateKey] !== undefined) {
+ this[key as TStateKey] = payload[key as TStateKey];
+ }
+ if (key === 'mode') {
+ this.changeMode(payload[key] as ModeType);
+ }
+ if (key === 'sideMode') {
+ this.changeSideMode(payload[key] as ModeType);
+ }
+ if (key === 'brandTheme') {
+ this.changeBrandTheme(payload[key]);
+ }
+ }
+ },
+ },
+ persist: {
+ paths: [...keys(STYLE_CONFIG), 'colorList', 'chartColors'],
+ },
+});
+
+export function getSettingStore() {
+ return useSettingStore(store);
+}
diff --git a/td_fronted/src/store/modules/tabs-router.ts b/td_fronted/src/store/modules/tabs-router.ts
new file mode 100644
index 0000000000..00f7f51d85
--- /dev/null
+++ b/td_fronted/src/store/modules/tabs-router.ts
@@ -0,0 +1,89 @@
+import { defineStore } from 'pinia';
+
+import { store } from '@/store';
+import type { TRouterInfo, TTabRouterType } from '@/types/interface';
+
+const homeRoute: Array = [
+ {
+ path: '/dashboard/base',
+ routeIdx: 0,
+ title: '仪表盘',
+ name: 'DashboardBase',
+ isHome: true,
+ },
+];
+
+const state = {
+ tabRouterList: homeRoute,
+ isRefreshing: false,
+};
+
+// 不需要做多标签tabs页缓存的列表 值为每个页面对应的name 如 DashboardDetail
+// const ignoreCacheRoutes = ['DashboardDetail'];
+const ignoreCacheRoutes = ['login'];
+
+export const useTabsRouterStore = defineStore('tabsRouter', {
+ state: () => state,
+ getters: {
+ tabRouters: (state: TTabRouterType) => state.tabRouterList,
+ refreshing: (state: TTabRouterType) => state.isRefreshing,
+ },
+ actions: {
+ // 处理刷新
+ toggleTabRouterAlive(routeIdx: number) {
+ this.isRefreshing = !this.isRefreshing;
+ this.tabRouters[routeIdx].isAlive = !this.tabRouters[routeIdx].isAlive;
+ },
+ // 处理新增
+ appendTabRouterList(newRoute: TRouterInfo) {
+ // 不要将判断条件newRoute.meta.keepAlive !== false修改为newRoute.meta.keepAlive,starter默认开启保活,所以meta.keepAlive未定义时也需要进行保活,只有显式说明false才禁用保活。
+ const needAlive = !ignoreCacheRoutes.includes(newRoute.name as string) && newRoute.meta?.keepAlive !== false;
+ if (!this.tabRouters.find((route: TRouterInfo) => route.path === newRoute.path)) {
+ // eslint-disable-next-line no-param-reassign
+ this.tabRouterList = this.tabRouterList.concat({ ...newRoute, isAlive: needAlive });
+ }
+ },
+ // 处理关闭当前
+ subtractCurrentTabRouter(newRoute: TRouterInfo) {
+ const { routeIdx } = newRoute;
+ this.tabRouterList = this.tabRouterList.slice(0, routeIdx).concat(this.tabRouterList.slice(routeIdx + 1));
+ },
+ // 处理关闭右侧
+ subtractTabRouterBehind(newRoute: TRouterInfo) {
+ const { routeIdx } = newRoute;
+ const homeIdx: number = this.tabRouters.findIndex((route: TRouterInfo) => route.isHome);
+ let tabRouterList: Array = this.tabRouterList.slice(0, routeIdx + 1);
+ if (routeIdx < homeIdx) {
+ tabRouterList = tabRouterList.concat(homeRoute);
+ }
+ this.tabRouterList = tabRouterList;
+ },
+ // 处理关闭左侧
+ subtractTabRouterAhead(newRoute: TRouterInfo) {
+ const { routeIdx } = newRoute;
+ const homeIdx: number = this.tabRouters.findIndex((route: TRouterInfo) => route.isHome);
+ let tabRouterList: Array = this.tabRouterList.slice(routeIdx);
+ if (routeIdx > homeIdx) {
+ tabRouterList = homeRoute.concat(tabRouterList);
+ }
+ this.tabRouterList = tabRouterList;
+ },
+ // 处理关闭其他
+ subtractTabRouterOther(newRoute: TRouterInfo) {
+ const { routeIdx } = newRoute;
+ const homeIdx: number = this.tabRouters.findIndex((route: TRouterInfo) => route.isHome);
+ this.tabRouterList = routeIdx === homeIdx ? homeRoute : homeRoute.concat([this.tabRouterList?.[routeIdx]]);
+ },
+ removeTabRouterList() {
+ this.tabRouterList = [];
+ },
+ initTabRouterList(newRoutes: TRouterInfo[]) {
+ newRoutes?.forEach((route: TRouterInfo) => this.appendTabRouterList(route));
+ },
+ },
+ persist: true,
+});
+
+export function getTabsRouterStore() {
+ return useTabsRouterStore(store);
+}
diff --git a/td_fronted/src/store/modules/user.ts b/td_fronted/src/store/modules/user.ts
new file mode 100644
index 0000000000..f68b4edc2e
--- /dev/null
+++ b/td_fronted/src/store/modules/user.ts
@@ -0,0 +1,87 @@
+import { defineStore } from 'pinia';
+
+import { usePermissionStore } from '@/store';
+import type { UserInfo } from '@/types/interface';
+
+const InitUserInfo: UserInfo = {
+ name: '', // 用户名,用于展示在页面右上角头像处
+ roles: [], // 前端权限模型使用 如果使用请配置modules/permission-fe.ts使用
+};
+
+export const useUserStore = defineStore('user', {
+ state: () => ({
+ token: 'main_token', // 默认token不走权限
+ userInfo: { ...InitUserInfo },
+ }),
+ getters: {
+ roles: (state) => {
+ return state.userInfo?.roles;
+ },
+ },
+ actions: {
+ async login(userInfo: Record) {
+ const mockLogin = async (userInfo: Record) => {
+ // 登录请求流程
+ console.log(`用户信息:`, userInfo);
+ // const { account, password } = userInfo;
+ // if (account !== 'td') {
+ // return {
+ // code: 401,
+ // message: '账号不存在',
+ // };
+ // }
+ // if (['main_', 'dev_'].indexOf(password) === -1) {
+ // return {
+ // code: 401,
+ // message: '密码错误',
+ // };
+ // }
+ // const token = {
+ // main_: 'main_token',
+ // dev_: 'dev_token',
+ // }[password];
+ return {
+ code: 200,
+ message: '登录成功',
+ data: 'main_token',
+ };
+ };
+
+ const res = await mockLogin(userInfo);
+ if (res.code === 200) {
+ this.token = res.data;
+ } else {
+ throw res;
+ }
+ },
+ async getUserInfo() {
+ const mockRemoteUserInfo = async (token: string) => {
+ if (token === 'main_token') {
+ return {
+ name: 'Tencent',
+ roles: ['all'], // 前端权限模型使用 如果使用请配置modules/permission-fe.ts使用
+ };
+ }
+ return {
+ name: 'td_dev',
+ roles: ['UserIndex', 'DashboardBase', 'login'], // 前端权限模型使用 如果使用请配置modules/permission-fe.ts使用
+ };
+ };
+ const res = await mockRemoteUserInfo(this.token);
+
+ this.userInfo = res;
+ },
+ async logout() {
+ this.token = '';
+ this.userInfo = { ...InitUserInfo };
+ },
+ },
+ persist: {
+ afterRestore: () => {
+ const permissionStore = usePermissionStore();
+ permissionStore.initRoutes();
+ },
+ key: 'user',
+ paths: ['token'],
+ },
+});
diff --git a/td_fronted/src/style/font-family.less b/td_fronted/src/style/font-family.less
new file mode 100644
index 0000000000..67a31b4f37
--- /dev/null
+++ b/td_fronted/src/style/font-family.less
@@ -0,0 +1,7 @@
+@font-face {
+ font-family: 'TencentSansW7';
+ src: url('data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAusAA4AAAAAEJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAALkAAAABwAAAAchqPqzUdERUYAAAtwAAAAHgAAAB4AKQAbT1MvMgAAAbgAAABZAAAAYGmceoNjbWFwAAACYAAAAJcAAAHsPmfPZmdhc3AAAAtkAAAADAAAAAwACAAbZ2x5ZgAAAywAAAW8AAAG/Ivn/ztoZWFkAAABRAAAADYAAAA2E+AL5GhoZWEAAAF8AAAAIAAAACQIawJ9aG10eAAAAhQAAABMAAAATCG/Auxsb2NhAAADAAAAACwAAAAsDjIQIm1heHAAAAGcAAAAGgAAACAAfgBDbmFtZQAACOgAAAIUAAAEm0zGvtJwb3N0AAAK/AAAAGYAAAB/4wuGdnByZXAAAAL4AAAACAAAAAhwAgESAAEAAAABBR/xlpGAXw889QALA+gAAAAA2Ac3gwAAAADY+IxB//L/HAPPAwAAAAAIAAIAAAAAAAB42mNgZGBgWf7vFAMD84v/n/7vZD7PABRBAYIAwxQH7XjaY2BkYGAQZXBiYGEAAUYGGEiBUAAMEQDCAAB42mNgYepm2sPAysDA1MUUwcDA4A2hGeMYjBjNgKI8HMxMTCz8TCwLGJj2CzCAgRiI8PX382d0YGBMEmQ2+u/FcIJlOVA9CwMjSI6JlekwkFJgYAQAR1kL+QAAAAJYAHYAAAAAAU0AAAEEAAACUAAhAlYAFQJUACACKgAdAZUANgEUABUBYAAkA5wAFQINABsBqAA0AnAAKgJYACoD6ACF//YANP/yACN42mNgYGBmgGAZBkYGEHgG5DGC+SwMp4C0HIMAUISPQYEhiSGNIZMhl6GUoZJhgeIkfS6/N4GpQQuSBP//B+tMZEgByucwFGOT/7/4/6L/C/7P+z/z/7T/yffqLrJvVFu3Zm3xPJBtcgz4ADPFkIGRDWgMIcBAIWBhZWBj52Bg4GRg4OIGi/Dw8gFJfgYqA/JcCgA99Se8ALgB/4W4AAGNAAAAFAAUABQAFABSAIIAsgD6ASIBOAFYAYIBxgHwAhQCRAJaAogCygMYA3542k1Ua2xTZRj+LmtP23Vdz2lPz3pZb2dr1+u2nq2H0d3Z2OhI5mC4AZMBo0gM98E0oRn1AqgoIYDG4BAkakDkJ4iyiCZGAiISUH8YjIQfEhNUMCoJrme+bTfkx/nxveec53ne533eDxE0Nn0V/0V2I4oYhATWw1ZKrDiGx5Vfzp6NkXPZ7mH8ECGCPNNXiZWokANVIYRjFt7MUI83iuvrWnAzTWA5Xl/nC2G/SZJFr7oUq3mzBaf7F5S0Kt+F59i1aq0j0tbwJmXcwUtsz3HHhEtQaYr0RFUbL0sqB8yRClvcG2uwa7hKg4VLKdFjZmeEN5SwwM0Dd4DcRaXAXuAuxQYqekwSIxRoqRRrxjLevrK/RNCUhXt7lYevpQMf6StjW1sz/gCrIqqm+Z7krsjCmJU67/zexrvMykE+CniA7wb8oUf4EhW9vtm2qGQSvQY808+t9Ov/5ih0zlhfyytfbGodd/ht2rJiH7k7dTtP0NQTYpUo3qDzSnsSVpc5j18O+DzRIzeqyel34nwDOISZHGoCM6I3SvKMRJppKM8pxeIy3tbU4S4y6Oc231Sp3OFLgXMV7dV2xq8L9K9IUZvY5XAZi4wfms2U6K21PoHvnVfvchitXEorhH2O4K253RUTnIYt0Xv4ITanB6M4zPwm9GuBQ4GIEaloEmVJzvXM4JeqXaxWfYg7tCi9qIddqNZZg53yKEv2lLgkEWaDr6fERHfEnEL5/mA+uJzcLmTIJEsMNUl0t5AR7o+kR8jqTCa7nsjZS3nuCvg2DtwcpC3ftQzfgg1ODMRfBjt8eiP8ZLAE7HNDsRJPUKhYTmqy13osvJGm4H/gomsgh8Ksk2oGpM+kAHqAh0wmuitpSWO6SWer2NOX7vu8D2SouFCACSSVk3hgjmBllRp8Takhck6THTT9DZjVoMkPprfgmSE8igHzKNOJ//MX4X4rN6m0VF022lan02g4R11DNngDahqoPQe1YoZ31SRiKWN5fammqNgddMiRcNheAoXIbKGlKsoXo7w3daDjFDmNbOAiM+uJOONSbjoSIzEPI1owpyO0oL6twlAcSbI9zrTzKIePTdeaeZamOHe4zJtA06kTJ3J+BSF7vdCbKZ/swsbGZzyHZvCN9BrlzmN+vUVU2UsFq/CAcjJnVV5bcNpB2gCnPI9jILDquZ1rwflleQzwqx1ri8PJzh+4K3GnUcPsg32pSdfAJmYA+dPm+a61rBj0N3Z5ktio3Gu1uAqZ3IVW0R2Ar4GDwIiyp97jJ5MXLuzbn71IGvYT1fXrR545kvdp+p/pNB0nvyI7QiqR+A2UEZupLPmjOK/KIlg4On741U6xf3hj49Ha0e2bov3tVFd6oOx2uVvb9dlLeOTjxt1797XUvDBx+snTOv1Sk/2y0g7YRTCDNP2WIqSHhLqQCHQGnEuYmpHhhvFYBNHnV8UsUPJLpjjwYZNA8ZC+yv7Uxu5QiG/vMWOfNzzq9uH7XqFoyz3byRWUv1ClnNowsoqi+CYp248fhN0TC94YXrSkYyRod03dWkYOmpdOfUAetGWTiE7/CRomQYML+VG0kHOG5AjjpjjE0kAYMc7JubMsqZnK3GvqMQmNOHcR4u9t5Woai31t3xXxYVrcaZQXt+5cOWZZV7ZXp94Io6u1C5Q+rZzY+pP62YEdZEmpx6QcUb4ZnMJ2nXbs2uWtb+P57w6sSoYytQYnl62juhVEnT1e2HURtF0EbQnUBsrAD9AADglwhfgLHkWxX2TiMqPOeyQzftinXHjhbVwuJVIdiOY9fvBRstDzyh9Ys6B6W2h0HnvO85DbvMsa2xJhNPgiPzBkaN4W/NF+0PaOd/ug7Yz+DNfVp3/v5+Jx8yRdT3F5dLMorLXik6PrnhhYfKAxM/hyb0Oanycm3+86bHMPC6JyZfB8YJnN8sngi4xqqdq3nN0//vzOTNXq5YsR+g8984WfeNq1Us1qFEEQ/npnk0X8IQGJIjnUSRLYLLt7MMlFCHvNKRvMuTPTmZ1kdib0zAY3ePMFfAAvigi5+Ry+gA8iiOLFr3tbTFZWcnGgu76qrvqqpqoAPMQ3KMy+A3wMWOGBehRwAy31LOAIayoPuEmfdwEv4Z76HPAy7quvAbfwqvEz4BXcjd4EvIpG9J5sqnmH2gfP7LDCOn4E3CD/04AjtNXzgJtYV68DXsJj9SngZTxRXwJu4XtDBbyCtehlwKtoRm8xQIlzTGGRIcUINQRXPH100cMOtgLape0QBgVif9dBjxlTkCPnSckj2MCQNudzGeQmrS5PB22ifcYmxII9RuWUf3JXXjOUhvKCt/PEoDyf2iwd1XIl/W5vZ4vXrhyaIjZFTRmPijIv06lsDEemuOTZlEHZact+nXRkL8/FR1diTWXshUnIefNnhtCULv0Rtvk4ox7qopKjbbcNhhVOWK1mXTgw6STX9t8kMh91k1RuRfJXJS98Zyp2rKSbcDIdzqfPB2OrrCyk1+n2F3HOMzrC+aFmPrcOg0i9XvukbhhCbPmaUBv73zqjrcTJf1gPV7PL6PK4yGN6L6oq882IvaWm/0w/ZfOt9014x3yZta1yS/V7fbJKNBcjzaraWJNIbXVixtqeSXly6x3TRSJjPZVjc50qKyQ2ttaUpxObVUkW15xRtXD9rg8Hs3FxRr8ATJnl93jaY2BiAIP/zQxGDNiAKBAzMjAxMjG4MLgyuDN4MHgy+DD4MwQwhDGEM0QwxDAyM7IwsjKyMbKzl+ZlGhgYGHIlFhXllxdlpmeUgISM3AwcQbSJq6sziDY1cjQA0WZGhoYAgBwU3AAAAAEAAgAIAAr//wAPAAEAAAAMAAAAFgAAAAIAAQADABQAAQAEAAAAAgAAAAAAAAABAAAAANWkJwgAAAAA2Ac3gwAAAADY+IxB')
+ format('woff');
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/td_fronted/src/style/index.less b/td_fronted/src/style/index.less
new file mode 100644
index 0000000000..dfda36cf6b
--- /dev/null
+++ b/td_fronted/src/style/index.less
@@ -0,0 +1,2 @@
+@import './font-family.less';
+@import './reset.less';
diff --git a/td_fronted/src/style/layout.less b/td_fronted/src/style/layout.less
new file mode 100644
index 0000000000..ae52216bab
--- /dev/null
+++ b/td_fronted/src/style/layout.less
@@ -0,0 +1,219 @@
+@import './font-family.less';
+
+// layout rewrite
+
+.t-layout__sider {
+ width: fit-content;
+}
+
+.t-button + .t-button {
+ margin-left: var(--td-comp-margin-s);
+}
+
+.t-transfer,
+.t-jumper,
+.t-pagination-mini {
+ .t-button + .t-button {
+ margin-left: 0;
+ }
+}
+
+.@{starter-prefix}-link {
+ color: var(--td-brand-color);
+ text-decoration: none;
+ margin-right: 24px;
+ cursor: pointer;
+ transition: color 0.2s cubic-bezier(0.38, 0, 0.24, 1);
+}
+
+.left-operation-container,
+.operation-container {
+ .t-button + .t-button {
+ margin-left: var(--td-comp-margin-s);
+ }
+}
+
+.t-layout.t-layout--with-sider {
+ > .t-layout {
+ flex: 1;
+ min-width: 760px;
+ }
+}
+
+.t-menu--dark .t-menu__operations .t-icon {
+ color: rgb(255 255 255 / 55%);
+
+ &:hover {
+ cursor: pointer;
+ }
+}
+
+.t-default-menu.t-menu--dark {
+ background: var(--td-gray-color-13);
+}
+
+.@{starter-prefix} {
+ // 布局元素调整
+ &-wrapper {
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ }
+
+ &-main-wrapper {
+ height: 500px;
+ overflow: scroll;
+ }
+
+ &-side-nav-layout {
+ &-relative {
+ height: 100%;
+ }
+ }
+
+ &-content-layout {
+ padding: var(--td-comp-paddingTB-xl) var(--td-comp-paddingLR-xl);
+ }
+
+ &-layout {
+ height: calc(100vh - var(--td-comp-size-xxxl));
+ overflow-y: scroll;
+
+ &-tabs-nav {
+ max-width: 100%;
+ position: fixed;
+ overflow: visible;
+ z-index: 100;
+ }
+ &-tabs-nav + .@{starter-prefix}-content-layout {
+ padding-top: var(--td-comp-paddingTB-xxl);
+ }
+
+ &::-webkit-scrollbar {
+ width: 8px;
+ background: transparent;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ border-radius: 6px;
+ border: 2px solid transparent;
+ background-clip: content-box;
+ background-color: var(--td-scrollbar-color);
+ }
+ }
+
+ &-footer-layout {
+ padding: 0;
+ margin-bottom: var(--td-comp-margin-xxl);
+ }
+
+ // slideBar
+ &-sidebar-layout {
+ height: 100%;
+ }
+
+ &-sidebar-compact {
+ width: 64px;
+ }
+
+ &-sidebar-layout-side {
+ z-index: 100;
+ }
+
+ &-side-nav {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ z-index: 200;
+ transition: all 0.3s;
+ min-height: 100%;
+
+ &-mix {
+ top: var(--td-comp-size-xxxl);
+
+ &-fixed {
+ top: var(--td-comp-size-xxxl);
+ z-index: 0;
+ }
+ }
+
+ &-no-fixed {
+ position: relative;
+ z-index: 1;
+ }
+
+ &-no-logo {
+ z-index: 1;
+ }
+
+ &-logo-wrapper {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+
+ &:hover {
+ cursor: pointer;
+ }
+ }
+
+ &-logo-t-logo {
+ height: var(--td-comp-size-s);
+ width: 100%;
+ }
+
+ &-logo-tdesign-logo {
+ margin-right: var(--td-comp-margin-xxxl);
+ height: var(--td-comp-size-s);
+ width: 100%;
+ color: var(--td-text-color-primary);
+ }
+
+ &-logo-normal {
+ color: var(--td-brand-color);
+ font: var(--td-font-body-large);
+ transition: all 0.3s;
+ }
+ }
+
+ &-side-nav-dark {
+ color: var(--td-font-white-1) !important;
+ }
+
+ &-side-nav-placeholder {
+ flex: 1 1 232px;
+ min-width: 232px;
+ transition: all 0.3s;
+
+ &-hidden {
+ flex: 1 1 72px;
+ min-width: 72px;
+ transition: all 0.3s;
+ }
+ }
+}
+
+.route-tabs-dropdown {
+ .t-icon {
+ margin-right: 8px;
+ }
+}
+
+.logo-container {
+ cursor: pointer;
+ display: inline-flex;
+ margin-left: 24px;
+}
+
+.version-container {
+ color: var(--td-text-color-primary);
+ opacity: 0.4;
+}
+
+.t-menu__popup {
+ z-index: 1000;
+}
+
+.container-base-margin-top {
+ margin-top: 16px;
+}
diff --git a/td_fronted/src/style/reset.less b/td_fronted/src/style/reset.less
new file mode 100644
index 0000000000..96cb11fa78
--- /dev/null
+++ b/td_fronted/src/style/reset.less
@@ -0,0 +1,38 @@
+// 对部分样式进行重置
+body {
+ color: var(--td-text-color-secondary);
+ font: var(--td-font-body-medium);
+ font-family: -apple-system, BlinkMacSystemFont, var(--td-font-family);
+ -webkit-font-smoothing: antialiased;
+ padding: 0;
+ margin: 0;
+}
+
+pre {
+ font-family: var(--td-font-family);
+}
+
+ul,
+dl,
+li,
+dd,
+dt {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+figure,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p {
+ margin: 0;
+}
+
+* {
+ box-sizing: border-box;
+}
diff --git a/td_fronted/src/style/variables.less b/td_fronted/src/style/variables.less
new file mode 100644
index 0000000000..d0889f3033
--- /dev/null
+++ b/td_fronted/src/style/variables.less
@@ -0,0 +1,26 @@
+/** 公共前缀 */
+@starter-prefix: tdesign-starter;
+
+// 颜色、尺寸、阴影、圆角、字体 variables 请参考 https://tdesign.tencent.com/starter/docs/vue/design-token
+// 响应式断点
+@screen-sm: 768px;
+@screen-md: 992px;
+@screen-lg: 1200px;
+@screen-xl: 1400px;
+
+@screen-sm-min: @screen-sm;
+@screen-md-min: @screen-md;
+@screen-lg-min: @screen-lg;
+@screen-xl-min: @screen-xl;
+
+@screen-sm-max: calc(@screen-md-min - 1px);
+@screen-md-max: calc(@screen-lg-min - 1px);
+@screen-lg-max: calc(@screen-xl-min - 1px);
+
+// 动画
+@anim-time-fn-easing: cubic-bezier(0.38, 0, 0.24, 1);
+@anim-time-fn-ease-out: cubic-bezier(0, 0, 0.15, 1);
+@anim-time-fn-ease-in: cubic-bezier(0.82, 0, 1, 0.9);
+@anim-duration-base: 0.2s;
+@anim-duration-moderate: 0.24s;
+@anim-duration-slow: 0.28s;
diff --git a/td_fronted/src/types/axios.d.ts b/td_fronted/src/types/axios.d.ts
new file mode 100644
index 0000000000..1c90329bf8
--- /dev/null
+++ b/td_fronted/src/types/axios.d.ts
@@ -0,0 +1,98 @@
+import type { AxiosRequestConfig } from 'axios';
+
+/**
+ * Axios请求配置
+ */
+export interface RequestOptions {
+ /**
+ * 接口地址
+ *
+ * 例: http://www.baidu.com/api
+ */
+ apiUrl?: string;
+ /**
+ * 是否自动添加接口前缀
+ *
+ * 例: http://www.baidu.com/api
+ * urlPrefix: 'api'
+ */
+ isJoinPrefix?: boolean;
+ /**
+ * 接口前缀
+ */
+ urlPrefix?: string;
+ /**
+ * POST请求的时候添加参数到Url中
+ */
+ joinParamsToUrl?: boolean;
+ /**
+ * 格式化提交参数时间
+ */
+ formatDate?: boolean;
+ /**
+ * 是否需要对响应数据进行处理
+ */
+ isTransformResponse?: boolean;
+ /**
+ * 是否返回原生响应头
+ *
+ * 例: 需要获取响应头时使用该属性
+ */
+ isReturnNativeResponse?: boolean;
+ /**
+ * 是否忽略请求取消令牌
+ *
+ * 如果启用,则重复请求时不进行处理
+ *
+ * 如果禁用,则重复请求时会取消当前请求
+ */
+ ignoreCancelToken?: boolean;
+ /**
+ * 自动对请求添加时间戳参数
+ */
+ joinTime?: boolean;
+ /**
+ * 是否携带Token
+ */
+ withToken?: boolean;
+ /**
+ * 重试配置
+ */
+ retry?: {
+ /**
+ * 重试次数
+ */
+ count: number;
+ /**
+ * 隔多久重试
+ *
+ * 单位: 毫秒
+ */
+ delay: number;
+ };
+ /**
+ * 接口级节流
+ *
+ * 单位: 毫秒
+ */
+ throttle?: {
+ delay: number;
+ };
+ /**
+ * 接口级防抖
+ *
+ * 单位: 毫秒
+ */
+ debounce?: {
+ delay: number;
+ };
+}
+
+export interface Result {
+ code: number;
+ data: T;
+}
+
+export interface AxiosRequestConfigRetry extends AxiosRequestConfig {
+ retryCount?: number;
+}
diff --git a/td_fronted/src/types/env.d.ts b/td_fronted/src/types/env.d.ts
new file mode 100644
index 0000000000..6ca1ddbf5d
--- /dev/null
+++ b/td_fronted/src/types/env.d.ts
@@ -0,0 +1,5 @@
+export interface ImportMetaEnv {
+ readonly VITE_IS_REQUEST_PROXY: string;
+ readonly VITE_API_URL: string;
+ readonly VITE_API_URL_PREFIX: string;
+}
diff --git a/td_fronted/src/types/globals.d.ts b/td_fronted/src/types/globals.d.ts
new file mode 100644
index 0000000000..49efe8866b
--- /dev/null
+++ b/td_fronted/src/types/globals.d.ts
@@ -0,0 +1,18 @@
+// 通用声明
+
+// Vue
+declare module '*.vue' {
+ import { DefineComponent } from 'vue';
+
+ const component: DefineComponent<{}, {}, any>;
+ export default component;
+}
+
+declare type ClassName = { [className: string]: any } | ClassName[] | string;
+
+declare module '*.svg' {
+ const CONTENT: string;
+ export default CONTENT;
+}
+
+declare type Recordable = Record;
diff --git a/td_fronted/src/types/interface.d.ts b/td_fronted/src/types/interface.d.ts
new file mode 100644
index 0000000000..daf04123e8
--- /dev/null
+++ b/td_fronted/src/types/interface.d.ts
@@ -0,0 +1,69 @@
+import type { TabValue } from 'tdesign-vue-next';
+import { LocationQueryRaw, RouteRecordName } from 'vue-router';
+
+export interface RouteMeta {
+ title?: string | Record;
+ icon?: string;
+ expanded?: boolean;
+ orderNo?: number;
+ hidden?: boolean;
+ hiddenBreadcrumb?: boolean;
+ single?: boolean;
+ keepAlive?: boolean;
+ frameSrc?: string;
+ frameBlank?: boolean;
+}
+
+export interface MenuRoute {
+ // TODO: menuitem 组件实际支持 string 类型但是类型错误,暂时使用 any 类型避免打包错误待组件类型修复
+ path: any;
+ title?: string | Record;
+ name?: string;
+ icon?:
+ | string
+ | {
+ render: () => void;
+ };
+ redirect?: string;
+ children: MenuRoute[];
+ meta: RouteMeta;
+}
+
+export type ModeType = 'dark' | 'light';
+
+export interface UserInfo {
+ name: string;
+ roles: string[];
+}
+
+export interface NotificationItem {
+ id: string;
+ content: string;
+ type: string;
+ status: boolean;
+ collected: boolean;
+ date: string;
+ quality: string;
+}
+
+export interface TRouterInfo {
+ path: string;
+ query?: LocationQueryRaw;
+ routeIdx?: number;
+ title?: string;
+ name?: RouteRecordName;
+ isAlive?: boolean;
+ isHome?: boolean;
+ meta?: any;
+}
+
+export interface TTabRouterType {
+ isRefreshing: boolean;
+ tabRouterList: Array;
+}
+
+export interface TTabRemoveOptions {
+ value: TabValue;
+ index: number;
+ e: MouseEvent;
+}
diff --git a/td_fronted/src/utils/charts.ts b/td_fronted/src/utils/charts.ts
new file mode 100644
index 0000000000..93afaa8d7f
--- /dev/null
+++ b/td_fronted/src/utils/charts.ts
@@ -0,0 +1,40 @@
+import dayjs from 'dayjs';
+
+/**
+ * 获取表头数据
+ *
+ * @export
+ * @param {string[]} dateTime
+ * @param {number} divideNum
+ * @returns {string[]}
+ */
+export function getDateArray(dateTime: string[] = [], divideNum = 10): string[] {
+ const timeArray: string[] = [];
+ if (dateTime.length > 0) {
+ for (let i = 0; i < divideNum; i++) {
+ const dateAbsTime: number = (new Date(dateTime[1]).getTime() - new Date(dateTime[0]).getTime()) / divideNum;
+ const enhandTime: number = new Date(dateTime[0]).getTime() + dateAbsTime * i;
+ timeArray.push(dayjs(enhandTime).format('YYYY-MM-DD'));
+ }
+ }
+
+ return timeArray;
+}
+
+/**
+ * 获取随机数
+ *
+ * @param {number} [num=100]
+ * @returns
+ *
+ * @memberOf DashboardBase
+ */
+export function getRandomArray(num = 100): number {
+ let resultNum = Number((Math.random() * num).toFixed(0));
+
+ if (resultNum <= 1) {
+ resultNum = 1;
+ }
+
+ return resultNum;
+}
diff --git a/td_fronted/src/utils/color.ts b/td_fronted/src/utils/color.ts
new file mode 100644
index 0000000000..8843d7810d
--- /dev/null
+++ b/td_fronted/src/utils/color.ts
@@ -0,0 +1,115 @@
+import * as echarts from 'echarts/core';
+import trim from 'lodash/trim';
+import { Color } from 'tvision-color';
+
+import { TColorToken } from '@/config/color';
+import { ModeType } from '@/types/interface';
+
+/**
+ * 依据主题类型获取颜色
+ *
+ * @export
+ * @param {string} theme
+ * @returns {}
+ */
+export function getColorFromTheme(): Array {
+ const theme = trim(getComputedStyle(document.documentElement).getPropertyValue('--td-brand-color'));
+ const themeColorList = Color.getRandomPalette({
+ color: theme,
+ colorGamut: 'bright',
+ number: 8,
+ });
+
+ return themeColorList;
+}
+
+/** 图表颜色 */
+export function getChartListColor(): Array {
+ const res = getColorFromTheme();
+
+ return res;
+}
+
+/**
+ * 更改图表主题颜色
+ *
+ * @export
+ * @param {Array} chartsList
+ * @param {string} theme
+ */
+export function changeChartsTheme(chartsList: echarts.EChartsType[]): void {
+ if (chartsList && chartsList.length) {
+ const chartChangeColor = getChartListColor();
+
+ for (let index = 0; index < chartsList.length; index++) {
+ const elementChart = chartsList[index];
+
+ if (elementChart) {
+ const optionVal = elementChart.getOption();
+
+ // 更改主题颜色
+ optionVal.color = chartChangeColor;
+
+ elementChart.setOption(optionVal, true);
+ }
+ }
+ }
+}
+
+/**
+ * 根据当前主题色、模式等情景 计算最后生成的色阶
+ */
+export function generateColorMap(theme: string, colorPalette: Array, mode: ModeType, brandColorIdx: number) {
+ const isDarkMode = mode === 'dark';
+
+ if (isDarkMode) {
+ // eslint-disable-next-line no-use-before-define
+ colorPalette.reverse().map((color) => {
+ const [h, s, l] = Color.colorTransform(color, 'hex', 'hsl');
+ return Color.colorTransform([h, Number(s) - 4, l], 'hsl', 'hex');
+ });
+ brandColorIdx = 5;
+ colorPalette[0] = `${colorPalette[brandColorIdx]}20`;
+ }
+
+ const colorMap: TColorToken = {
+ '--td-brand-color': colorPalette[brandColorIdx], // 主题色
+ '--td-brand-color-1': colorPalette[0], // light
+ '--td-brand-color-2': colorPalette[1], // focus
+ '--td-brand-color-3': colorPalette[2], // disabled
+ '--td-brand-color-4': colorPalette[3],
+ '--td-brand-color-5': colorPalette[4],
+ '--td-brand-color-6': colorPalette[5],
+ '--td-brand-color-7': brandColorIdx > 0 ? colorPalette[brandColorIdx - 1] : theme, // hover
+ '--td-brand-color-8': colorPalette[brandColorIdx], // 主题色
+ '--td-brand-color-9': brandColorIdx > 8 ? theme : colorPalette[brandColorIdx + 1], // click
+ '--td-brand-color-10': colorPalette[9],
+ };
+ return colorMap;
+}
+
+/**
+ * 将生成的样式嵌入头部
+ */
+export function insertThemeStylesheet(theme: string, colorMap: TColorToken, mode: ModeType) {
+ const isDarkMode = mode === 'dark';
+ const root = !isDarkMode ? `:root[theme-color='${theme}']` : `:root[theme-color='${theme}'][theme-mode='dark']`;
+
+ const styleSheet = document.createElement('style');
+ styleSheet.type = 'text/css';
+ styleSheet.innerText = `${root}{
+ --td-brand-color: ${colorMap['--td-brand-color']};
+ --td-brand-color-1: ${colorMap['--td-brand-color-1']};
+ --td-brand-color-2: ${colorMap['--td-brand-color-2']};
+ --td-brand-color-3: ${colorMap['--td-brand-color-3']};
+ --td-brand-color-4: ${colorMap['--td-brand-color-4']};
+ --td-brand-color-5: ${colorMap['--td-brand-color-5']};
+ --td-brand-color-6: ${colorMap['--td-brand-color-6']};
+ --td-brand-color-7: ${colorMap['--td-brand-color-7']};
+ --td-brand-color-8: ${colorMap['--td-brand-color-8']};
+ --td-brand-color-9: ${colorMap['--td-brand-color-9']};
+ --td-brand-color-10: ${colorMap['--td-brand-color-10']};
+ }`;
+
+ document.head.appendChild(styleSheet);
+}
diff --git a/td_fronted/src/utils/date.ts b/td_fronted/src/utils/date.ts
new file mode 100644
index 0000000000..bbfa47a849
--- /dev/null
+++ b/td_fronted/src/utils/date.ts
@@ -0,0 +1,12 @@
+// 获取常用时间
+import dayjs from 'dayjs';
+
+export const LAST_7_DAYS = [
+ dayjs().subtract(7, 'day').format('YYYY-MM-DD'),
+ dayjs().subtract(1, 'day').format('YYYY-MM-DD'),
+];
+
+export const LAST_30_DAYS = [
+ dayjs().subtract(30, 'day').format('YYYY-MM-DD'),
+ dayjs().subtract(1, 'day').format('YYYY-MM-DD'),
+];
diff --git a/td_fronted/src/utils/request/Axios.ts b/td_fronted/src/utils/request/Axios.ts
new file mode 100644
index 0000000000..fc5202738e
--- /dev/null
+++ b/td_fronted/src/utils/request/Axios.ts
@@ -0,0 +1,293 @@
+import axios, {
+ AxiosError,
+ AxiosInstance,
+ AxiosRequestConfig,
+ AxiosRequestHeaders,
+ AxiosResponse,
+ InternalAxiosRequestConfig,
+} from 'axios';
+import cloneDeep from 'lodash/cloneDeep';
+import debounce from 'lodash/debounce';
+import isFunction from 'lodash/isFunction';
+import throttle from 'lodash/throttle';
+import { stringify } from 'qs';
+
+import { ContentTypeEnum } from '@/constants';
+import { AxiosRequestConfigRetry, RequestOptions, Result } from '@/types/axios';
+
+import { AxiosCanceler } from './AxiosCancel';
+import { CreateAxiosOptions } from './AxiosTransform';
+
+/**
+ * Axios 模块
+ */
+export class VAxios {
+ /**
+ * Axios实例句柄
+ * @private
+ */
+ private instance: AxiosInstance;
+
+ /**
+ * Axios配置
+ * @private
+ */
+ private readonly options: CreateAxiosOptions;
+
+ constructor(options: CreateAxiosOptions) {
+ this.options = options;
+ this.instance = axios.create(options);
+ this.setupInterceptors();
+ }
+
+ /**
+ * 创建Axios实例
+ * @param config
+ * @private
+ */
+ private createAxios(config: CreateAxiosOptions): void {
+ this.instance = axios.create(config);
+ }
+
+ /**
+ * 获取数据处理类
+ * @private
+ */
+ private getTransform() {
+ const { transform } = this.options;
+ return transform;
+ }
+
+ /**
+ * 获取Axios实例
+ */
+ getAxios(): AxiosInstance {
+ return this.instance;
+ }
+
+ /**
+ * 配置Axios
+ * @param config
+ */
+ configAxios(config: CreateAxiosOptions) {
+ if (!this.instance) return;
+ this.createAxios(config);
+ }
+
+ /**
+ * 设置公共头部信息
+ * @param headers
+ */
+ setHeader(headers: Record): void {
+ if (!this.instance) return;
+ Object.assign(this.instance.defaults.headers, headers);
+ }
+
+ /**
+ * 设置拦截器
+ * @private
+ */
+ private setupInterceptors() {
+ const transform = this.getTransform();
+ if (!transform) return;
+
+ const { requestInterceptors, requestInterceptorsCatch, responseInterceptors, responseInterceptorsCatch } =
+ transform;
+ const axiosCanceler = new AxiosCanceler();
+
+ // 请求拦截器
+ this.instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
+ // 如果忽略取消令牌,则不会取消重复的请求
+ // @ts-ignore
+ const { ignoreCancelToken } = config.requestOptions;
+ const ignoreCancel = ignoreCancelToken ?? this.options.requestOptions?.ignoreCancelToken;
+ if (!ignoreCancel) axiosCanceler.addPending(config);
+
+ if (requestInterceptors && isFunction(requestInterceptors)) {
+ config = requestInterceptors(config, this.options) as InternalAxiosRequestConfig;
+ }
+
+ return config;
+ }, undefined);
+
+ // 请求错误处理
+ if (requestInterceptorsCatch && isFunction(requestInterceptorsCatch)) {
+ this.instance.interceptors.request.use(undefined, requestInterceptorsCatch);
+ }
+
+ // 响应结果处理
+ this.instance.interceptors.response.use((res: AxiosResponse) => {
+ if (res) axiosCanceler.removePending(res.config);
+ if (responseInterceptors && isFunction(responseInterceptors)) {
+ res = responseInterceptors(res);
+ }
+ return res;
+ }, undefined);
+
+ // 响应错误处理
+ if (responseInterceptorsCatch && isFunction(responseInterceptorsCatch)) {
+ this.instance.interceptors.response.use(undefined, (error) => responseInterceptorsCatch(error, this.instance));
+ }
+ }
+
+ /**
+ * 支持 FormData 请求格式
+ * @param config
+ */
+ supportFormData(config: AxiosRequestConfig) {
+ const headers = config.headers || (this.options.headers as AxiosRequestHeaders);
+ const contentType = headers?.['Content-Type'] || headers?.['content-type'];
+
+ if (
+ contentType !== ContentTypeEnum.FormURLEncoded ||
+ !Reflect.has(config, 'data') ||
+ config.method?.toUpperCase() === 'GET'
+ ) {
+ return config;
+ }
+
+ return {
+ ...config,
+ data: stringify(config.data, { arrayFormat: 'brackets' }),
+ };
+ }
+
+ /**
+ * 支持 params 序列化
+ * @param config
+ */
+ supportParamsStringify(config: AxiosRequestConfig) {
+ const headers = config.headers || this.options.headers;
+ const contentType = headers?.['Content-Type'] || headers?.['content-type'];
+
+ if (contentType === ContentTypeEnum.FormURLEncoded || !Reflect.has(config, 'params')) {
+ return config;
+ }
+
+ return {
+ ...config,
+ paramsSerializer: (params: any) => stringify(params, { arrayFormat: 'brackets' }),
+ };
+ }
+
+ get(config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ return this.request({ ...config, method: 'GET' }, options);
+ }
+
+ post(config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ return this.request({ ...config, method: 'POST' }, options);
+ }
+
+ put(config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ return this.request({ ...config, method: 'PUT' }, options);
+ }
+
+ delete(config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ return this.request({ ...config, method: 'DELETE' }, options);
+ }
+
+ patch(config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ return this.request({ ...config, method: 'PATCH' }, options);
+ }
+
+ /**
+ * 上传文件封装
+ * @param key 文件所属的key
+ * @param file 文件
+ * @param config 请求配置
+ * @param options
+ */
+ upload(key: string, file: File, config: AxiosRequestConfig, options?: RequestOptions): Promise {
+ const params: FormData = config.params ?? new FormData();
+ params.append(key, file);
+
+ return this.request(
+ {
+ ...config,
+ method: 'POST',
+ headers: {
+ 'Content-Type': ContentTypeEnum.FormData,
+ },
+ params,
+ },
+ options,
+ );
+ }
+
+ /**
+ * 请求封装
+ * @param config
+ * @param options
+ */
+ request(config: AxiosRequestConfigRetry, options?: RequestOptions): Promise {
+ const { requestOptions } = this.options;
+
+ if (requestOptions.throttle !== undefined && requestOptions.debounce !== undefined) {
+ throw new Error('throttle and debounce cannot be set at the same time');
+ }
+
+ if (requestOptions.throttle && requestOptions.throttle.delay !== 0) {
+ return new Promise((resolve) => {
+ throttle(() => resolve(this.synthesisRequest(config, options)), requestOptions.throttle.delay);
+ });
+ }
+
+ if (requestOptions.debounce && requestOptions.debounce.delay !== 0) {
+ return new Promise((resolve) => {
+ debounce(() => resolve(this.synthesisRequest(config, options)), requestOptions.debounce.delay);
+ });
+ }
+
+ return this.synthesisRequest(config, options);
+ }
+
+ /**
+ * 请求方法
+ * @private
+ */
+ private async synthesisRequest(config: AxiosRequestConfigRetry, options?: RequestOptions): Promise {
+ let conf: CreateAxiosOptions = cloneDeep(config);
+ const transform = this.getTransform();
+
+ const { requestOptions } = this.options;
+
+ const opt: RequestOptions = { ...requestOptions, ...options };
+
+ const { beforeRequestHook, requestCatchHook, transformRequestHook } = transform || {};
+ if (beforeRequestHook && isFunction(beforeRequestHook)) {
+ conf = beforeRequestHook(conf, opt);
+ }
+ conf.requestOptions = opt;
+
+ conf = this.supportFormData(conf);
+ // 支持params数组参数格式化,因axios默认的toFormData即为brackets方式,无需配置paramsSerializer为qs,有需要可解除注释,参数参考qs文档
+ // conf = this.supportParamsStringify(conf);
+
+ return new Promise((resolve, reject) => {
+ this.instance
+ .request>(!config.retryCount ? conf : config)
+ .then((res: AxiosResponse) => {
+ if (transformRequestHook && isFunction(transformRequestHook)) {
+ try {
+ const ret = transformRequestHook(res, opt);
+ resolve(ret);
+ } catch (err) {
+ reject(err || new Error('请求错误!'));
+ }
+ return;
+ }
+ resolve(res as unknown as Promise);
+ })
+ .catch((e: Error | AxiosError) => {
+ if (requestCatchHook && isFunction(requestCatchHook)) {
+ reject(requestCatchHook(e, opt));
+ return;
+ }
+ if (axios.isAxiosError(e)) {
+ // 在这里重写Axios的错误信息
+ }
+ reject(e);
+ });
+ });
+ }
+}
diff --git a/td_fronted/src/utils/request/AxiosCancel.ts b/td_fronted/src/utils/request/AxiosCancel.ts
new file mode 100644
index 0000000000..010b0daf3b
--- /dev/null
+++ b/td_fronted/src/utils/request/AxiosCancel.ts
@@ -0,0 +1,67 @@
+import type { AxiosRequestConfig, Canceler } from 'axios';
+import axios from 'axios';
+import isFunction from 'lodash/isFunction';
+
+// 存储请求与取消令牌的键值对列表
+let pendingMap = new Map();
+
+/**
+ * 获取请求Url
+ * @param config
+ */
+export const getPendingUrl = (config: AxiosRequestConfig) => [config.method, config.url].join('&');
+
+/**
+ * @description 请求管理器
+ */
+export class AxiosCanceler {
+ /**
+ * 添加请求到列表中
+ * @param config
+ */
+ addPending(config: AxiosRequestConfig) {
+ this.removePending(config);
+ const url = getPendingUrl(config);
+ config.cancelToken =
+ config.cancelToken ||
+ new axios.CancelToken((cancel) => {
+ if (!pendingMap.has(url)) {
+ // 如果当前没有相同请求就添加
+ pendingMap.set(url, cancel);
+ }
+ });
+ }
+
+ /**
+ * 移除现有的所有请求
+ */
+ removeAllPending() {
+ pendingMap.forEach((cancel) => {
+ if (cancel && isFunction(cancel)) cancel();
+ });
+ pendingMap.clear();
+ }
+
+ /**
+ * 移除指定请求
+ * @param config
+ */
+ removePending(config: AxiosRequestConfig) {
+ const url = getPendingUrl(config);
+
+ if (pendingMap.has(url)) {
+ // If there is a current request identifier in pending,
+ // the current request needs to be cancelled and removed
+ const cancel = pendingMap.get(url);
+ if (cancel) cancel(url);
+ pendingMap.delete(url);
+ }
+ }
+
+ /**
+ * 重置
+ */
+ reset() {
+ pendingMap = new Map();
+ }
+}
diff --git a/td_fronted/src/utils/request/AxiosTransform.ts b/td_fronted/src/utils/request/AxiosTransform.ts
new file mode 100644
index 0000000000..d05c64a215
--- /dev/null
+++ b/td_fronted/src/utils/request/AxiosTransform.ts
@@ -0,0 +1,64 @@
+import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
+import { AxiosError } from 'axios';
+
+import type { RequestOptions, Result } from '@/types/axios';
+
+/**
+ * @description 创建Axios实例配置
+ */
+export interface CreateAxiosOptions extends AxiosRequestConfig {
+ /**
+ * 请求验证方案
+ *
+ * https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes
+ */
+ authenticationScheme?: string;
+ /**
+ * 请求数据处理
+ */
+ transform?: AxiosTransform;
+ /**
+ * 请求配置
+ */
+ requestOptions?: RequestOptions;
+}
+
+/**
+ * Axios请求数据处理 抽象类
+ */
+export abstract class AxiosTransform {
+ /**
+ * 请求前钩子
+ */
+ beforeRequestHook?: (config: AxiosRequestConfig, options: RequestOptions) => AxiosRequestConfig;
+
+ /**
+ * 数据处理前钩子
+ */
+ transformRequestHook?: (res: AxiosResponse, options: RequestOptions) => T;
+
+ /**
+ * 请求失败钩子
+ */
+ requestCatchHook?: (e: Error | AxiosError, options: RequestOptions) => Promise;
+
+ /**
+ * 请求拦截器
+ */
+ requestInterceptors?: (config: AxiosRequestConfig, options: CreateAxiosOptions) => AxiosRequestConfig;
+
+ /**
+ * 响应拦截器
+ */
+ responseInterceptors?: (res: AxiosResponse) => AxiosResponse;
+
+ /**
+ * 请求拦截器错误处理
+ */
+ requestInterceptorsCatch?: (error: AxiosError) => void;
+
+ /**
+ * 响应拦截器错误处理
+ */
+ responseInterceptorsCatch?: (error: AxiosError, instance: AxiosInstance) => void;
+}
diff --git a/td_fronted/src/utils/request/index.ts b/td_fronted/src/utils/request/index.ts
new file mode 100644
index 0000000000..6dd0173663
--- /dev/null
+++ b/td_fronted/src/utils/request/index.ts
@@ -0,0 +1,206 @@
+// axios配置 可自行根据项目进行更改,只需更改该文件即可,其他文件可以不动
+import type { AxiosInstance } from 'axios';
+import isString from 'lodash/isString';
+import merge from 'lodash/merge';
+
+import { ContentTypeEnum } from '@/constants';
+import { useUserStore } from '@/store';
+
+import { VAxios } from './Axios';
+import type { AxiosTransform, CreateAxiosOptions } from './AxiosTransform';
+import { formatRequestDate, joinTimestamp, setObjToUrlParams } from './utils';
+
+const env = import.meta.env.MODE || 'development';
+
+// 如果是mock模式 或 没启用直连代理 就不配置host 会走本地Mock拦截 或 Vite 代理
+const host = env === 'mock' || import.meta.env.VITE_IS_REQUEST_PROXY !== 'true' ? '' : import.meta.env.VITE_API_URL;
+
+// 数据处理,方便区分多种处理方式
+const transform: AxiosTransform = {
+ // 处理请求数据。如果数据不是预期格式,可直接抛出错误
+ transformRequestHook: (res, options) => {
+ const { isTransformResponse, isReturnNativeResponse } = options;
+
+ // 如果204无内容直接返回
+ const method = res.config.method?.toLowerCase();
+ if (res.status === 204 && ['put', 'patch', 'delete'].includes(method)) {
+ return res;
+ }
+
+ // 是否返回原生响应头 比如:需要获取响应头时使用该属性
+ if (isReturnNativeResponse) {
+ return res;
+ }
+ // 不进行任何处理,直接返回
+ // 用于页面代码可能需要直接获取code,data,message这些信息时开启
+ if (!isTransformResponse) {
+ return res.data;
+ }
+
+ // 错误的时候返回
+ const { data } = res;
+ if (!data) {
+ throw new Error('请求接口错误');
+ }
+
+ // 这里 code为 后台统一的字段,需要在 types.ts内修改为项目自己的接口返回格式
+ const { code } = data;
+
+ // 这里逻辑可以根据项目进行修改
+ const hasSuccess = data && code === 0;
+ if (hasSuccess) {
+ return data.data;
+ }
+
+ throw new Error(`请求接口错误, 错误码: ${code}`);
+ },
+
+ // 请求前处理配置
+ beforeRequestHook: (config, options) => {
+ const { apiUrl, isJoinPrefix, urlPrefix, joinParamsToUrl, formatDate, joinTime = true } = options;
+
+ // 添加接口前缀
+ if (isJoinPrefix && urlPrefix && isString(urlPrefix)) {
+ config.url = `${urlPrefix}${config.url}`;
+ }
+
+ // 将baseUrl拼接
+ if (apiUrl && isString(apiUrl)) {
+ config.url = `${apiUrl}${config.url}`;
+ }
+ const params = config.params || {};
+ const data = config.data || false;
+
+ if (formatDate && data && !isString(data)) {
+ formatRequestDate(data);
+ }
+ if (config.method?.toUpperCase() === 'GET') {
+ if (!isString(params)) {
+ // 给 get 请求加上时间戳参数,避免从缓存中拿数据。
+ config.params = Object.assign(params || {}, joinTimestamp(joinTime, false));
+ } else {
+ // 兼容restful风格
+ config.url = `${config.url + params}${joinTimestamp(joinTime, true)}`;
+ config.params = undefined;
+ }
+ } else if (!isString(params)) {
+ if (formatDate) {
+ formatRequestDate(params);
+ }
+ if (
+ Reflect.has(config, 'data') &&
+ config.data &&
+ (Object.keys(config.data).length > 0 || data instanceof FormData)
+ ) {
+ config.data = data;
+ config.params = params;
+ } else {
+ // 非GET请求如果没有提供data,则将params视为data
+ config.data = params;
+ config.params = undefined;
+ }
+ if (joinParamsToUrl) {
+ config.url = setObjToUrlParams(config.url as string, { ...config.params, ...config.data });
+ }
+ } else {
+ // 兼容restful风格
+ config.url += params;
+ config.params = undefined;
+ }
+ return config;
+ },
+
+ // 请求拦截器处理
+ requestInterceptors: (config, options) => {
+ // 请求之前处理config
+ const userStore = useUserStore();
+ const { token } = userStore;
+
+ if (token && (config as Recordable)?.requestOptions?.withToken !== false) {
+ // jwt token
+ (config as Recordable).headers.Authorization = options.authenticationScheme
+ ? `${options.authenticationScheme} ${token}`
+ : token;
+ }
+ return config;
+ },
+
+ // 响应拦截器处理
+ responseInterceptors: (res) => {
+ return res;
+ },
+
+ // 响应错误处理
+ responseInterceptorsCatch: (error: any, instance: AxiosInstance) => {
+ const { config } = error;
+ if (!config || !config.requestOptions.retry) return Promise.reject(error);
+
+ config.retryCount = config.retryCount || 0;
+
+ if (config.retryCount >= config.requestOptions.retry.count) return Promise.reject(error);
+
+ config.retryCount += 1;
+
+ const backoff = new Promise((resolve) => {
+ setTimeout(() => {
+ resolve(config);
+ }, config.requestOptions.retry.delay || 1);
+ });
+ config.headers = { ...config.headers, 'Content-Type': ContentTypeEnum.Json };
+ return backoff.then((config) => instance.request(config));
+ },
+};
+
+function createAxios(opt?: Partial) {
+ return new VAxios(
+ merge(
+ {
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes
+ // 例如: authenticationScheme: 'Bearer'
+ authenticationScheme: '',
+ // 超时
+ timeout: 10 * 1000,
+ // 携带Cookie
+ withCredentials: true,
+ // 头信息
+ headers: { 'Content-Type': ContentTypeEnum.Json },
+ // 数据处理方式
+ transform,
+ // 配置项,下面的选项都可以在独立的接口请求中覆盖
+ requestOptions: {
+ // 接口地址
+ apiUrl: host,
+ // 是否自动添加接口前缀
+ isJoinPrefix: true,
+ // 接口前缀
+ // 例如: https://www.baidu.com/api
+ // urlPrefix: '/api'
+ urlPrefix: import.meta.env.VITE_API_URL_PREFIX,
+ // 是否返回原生响应头 比如:需要获取响应头时使用该属性
+ isReturnNativeResponse: false,
+ // 需要对返回数据进行处理
+ isTransformResponse: true,
+ // post请求的时候添加参数到url
+ joinParamsToUrl: false,
+ // 格式化提交参数时间
+ formatDate: true,
+ // 是否加入时间戳
+ joinTime: true,
+ // 是否忽略请求取消令牌
+ // 如果启用,则重复请求时不进行处理
+ // 如果禁用,则重复请求时会取消当前请求
+ ignoreCancelToken: true,
+ // 是否携带token
+ withToken: true,
+ // 重试
+ retry: {
+ count: 3,
+ delay: 1000,
+ },
+ },
+ },
+ opt || {},
+ ),
+ );
+}
+export const request = createAxios();
diff --git a/td_fronted/src/utils/request/utils.ts b/td_fronted/src/utils/request/utils.ts
new file mode 100644
index 0000000000..72afea7e09
--- /dev/null
+++ b/td_fronted/src/utils/request/utils.ts
@@ -0,0 +1,54 @@
+import isObject from 'lodash/isObject';
+import isString from 'lodash/isString';
+
+const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';
+
+export function joinTimestamp(join: boolean, restful: T): T extends true ? string : object;
+
+export function joinTimestamp(join: boolean, restful = false): string | object {
+ if (!join) {
+ return restful ? '' : {};
+ }
+ const now = new Date().getTime();
+ if (restful) {
+ return `?_t=${now}`;
+ }
+ return { _t: now };
+}
+
+// 格式化提交参数时间
+export function formatRequestDate(params: Recordable) {
+ if (Object.prototype.toString.call(params) !== '[object Object]') {
+ return;
+ }
+
+ for (const key in params) {
+ // eslint-disable-next-line no-underscore-dangle
+ if (params[key] && params[key]._isAMomentObject) {
+ params[key] = params[key].format(DATE_TIME_FORMAT);
+ }
+ if (isString(key)) {
+ const value = params[key];
+ if (value) {
+ try {
+ params[key] = isString(value) ? value.trim() : value;
+ } catch (error: any) {
+ throw new Error(error);
+ }
+ }
+ }
+ if (isObject(params[key])) {
+ formatRequestDate(params[key]);
+ }
+ }
+}
+
+// 将对象转为Url参数
+export function setObjToUrlParams(baseUrl: string, obj: { [index: string]: any }): string {
+ let parameters = '';
+ for (const key in obj) {
+ parameters += `${key}=${encodeURIComponent(obj[key])}&`;
+ }
+ parameters = parameters.replace(/&$/, '');
+ return /\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\/?$/, '?') + parameters;
+}
diff --git a/td_fronted/src/utils/route/constant.ts b/td_fronted/src/utils/route/constant.ts
new file mode 100644
index 0000000000..a3ec01c65b
--- /dev/null
+++ b/td_fronted/src/utils/route/constant.ts
@@ -0,0 +1,14 @@
+export const LAYOUT = () => import('@/layouts/index.vue');
+export const BLANK_LAYOUT = () => import('@/layouts/blank.vue');
+export const IFRAME = () => import('@/layouts/components/FrameBlank.vue');
+export const EXCEPTION_COMPONENT = () => import('@/pages/result/500/index.vue');
+export const PARENT_LAYOUT = () =>
+ new Promise((resolve) => {
+ resolve({ name: 'ParentLayout' });
+ });
+
+export const PAGE_NOT_FOUND_ROUTE = {
+ path: '/:w+',
+ name: '404Page',
+ redirect: '/result/404',
+};
diff --git a/td_fronted/src/utils/route/index.ts b/td_fronted/src/utils/route/index.ts
new file mode 100644
index 0000000000..d00a030db9
--- /dev/null
+++ b/td_fronted/src/utils/route/index.ts
@@ -0,0 +1,110 @@
+import cloneDeep from 'lodash/cloneDeep';
+import { shallowRef } from 'vue';
+
+import { RouteItem } from '@/api/model/permissionModel';
+import { RouteMeta } from '@/types/interface';
+import {
+ BLANK_LAYOUT,
+ EXCEPTION_COMPONENT,
+ IFRAME,
+ LAYOUT,
+ PAGE_NOT_FOUND_ROUTE,
+ PARENT_LAYOUT,
+} from '@/utils/route/constant';
+
+// vite 3+ support dynamic import from node_modules
+const iconsPath = import.meta.glob('../../../node_modules/tdesign-icons-vue-next/esm/components/*.js');
+
+const LayoutMap = new Map Promise>();
+
+LayoutMap.set('LAYOUT', LAYOUT);
+LayoutMap.set('BLANK', BLANK_LAYOUT);
+LayoutMap.set('IFRAME', IFRAME);
+
+let dynamicViewsModules: Record Promise>;
+
+// 动态从包内引入单个Icon
+async function getMenuIcon(iconName: string): Promise {
+ const RenderIcon = iconsPath[`../../../node_modules/tdesign-icons-vue-next/esm/components/${iconName}.js`];
+
+ const Icon = await RenderIcon();
+ // @ts-ignore
+ return shallowRef(Icon.default);
+}
+
+// 动态引入路由组件
+function asyncImportRoute(routes: RouteItem[] | undefined) {
+ dynamicViewsModules = dynamicViewsModules || import.meta.glob('../../pages/**/*.vue');
+ if (!routes) return;
+
+ routes.forEach(async (item) => {
+ const { component, name } = item;
+ const { children } = item;
+
+ if (component) {
+ const layoutFound = LayoutMap.get(component.toUpperCase());
+ if (layoutFound) {
+ item.component = layoutFound;
+ } else {
+ item.component = dynamicImport(dynamicViewsModules, component);
+ }
+ } else if (name) {
+ item.component = PARENT_LAYOUT();
+ }
+
+ if (item.meta.icon) item.meta.icon = await getMenuIcon(item.meta.icon);
+
+ // eslint-disable-next-line no-unused-expressions
+ children && asyncImportRoute(children);
+ });
+}
+
+function dynamicImport(dynamicViewsModules: Record Promise>, component: string) {
+ const keys = Object.keys(dynamicViewsModules);
+ const matchKeys = keys.filter((key) => {
+ const k = key.replace('../../pages', '');
+ const startFlag = component.startsWith('/');
+ const endFlag = component.endsWith('.vue') || component.endsWith('.tsx');
+ const startIndex = startFlag ? 0 : 1;
+ const lastIndex = endFlag ? k.length : k.lastIndexOf('.');
+ return k.substring(startIndex, lastIndex) === component;
+ });
+ if (matchKeys?.length === 1) {
+ const matchKey = matchKeys[0];
+ return dynamicViewsModules[matchKey];
+ }
+ if (matchKeys?.length > 1) {
+ throw new Error(
+ 'Please do not create `.vue` and `.TSX` files with the same file name in the same hierarchical directory under the views folder. This will cause dynamic introduction failure',
+ );
+ } else {
+ console.warn(`Can't find ${component} in pages folder`);
+ }
+ return EXCEPTION_COMPONENT;
+}
+
+// 将背景对象变成路由对象
+export function transformObjectToRoute(routeList: RouteItem[]): T[] {
+ routeList.forEach(async (route) => {
+ const component = route.component as string;
+
+ if (component) {
+ if (component.toUpperCase() === 'LAYOUT') {
+ route.component = LayoutMap.get(component.toUpperCase());
+ } else {
+ route.children = [cloneDeep(route)];
+ route.component = LAYOUT;
+ route.name = `${route.name}Parent`;
+ route.path = '';
+ route.meta = (route.meta || {}) as RouteMeta;
+ }
+ } else {
+ throw new Error('component is undefined');
+ }
+ // eslint-disable-next-line no-unused-expressions
+ route.children && asyncImportRoute(route.children);
+ if (route.meta.icon) route.meta.icon = await getMenuIcon(route.meta.icon);
+ });
+
+ return [PAGE_NOT_FOUND_ROUTE, ...routeList] as unknown as T[];
+}
diff --git a/td_fronted/stylelint.config.js b/td_fronted/stylelint.config.js
new file mode 100644
index 0000000000..0bdf6f659b
--- /dev/null
+++ b/td_fronted/stylelint.config.js
@@ -0,0 +1,28 @@
+export default {
+ defaultSeverity: 'error',
+ extends: ['stylelint-config-standard'],
+ rules: {
+ 'no-descending-specificity': null,
+ 'import-notation': 'string',
+ 'no-empty-source': null,
+ 'custom-property-pattern': null,
+ 'selector-class-pattern': null,
+ 'selector-pseudo-class-no-unknown': [
+ true,
+ {
+ ignorePseudoClasses: ['deep'],
+ },
+ ],
+ 'media-query-no-invalid': null, // 官方表示此规则应当仅对于原生CSS启用,对于预处理器(Less)不应启用
+ },
+ overrides: [
+ {
+ files: ['**/*.html', '**/*.vue'],
+ customSyntax: 'postcss-html',
+ },
+ {
+ files: ['**/*.less'],
+ customSyntax: 'postcss-less',
+ },
+ ],
+};
diff --git a/td_fronted/tsconfig.json b/td_fronted/tsconfig.json
new file mode 100644
index 0000000000..35e165249e
--- /dev/null
+++ b/td_fronted/tsconfig.json
@@ -0,0 +1,36 @@
+{
+ "compilerOptions": {
+ "target": "esnext",
+ "module": "esnext",
+ "moduleResolution": "node",
+ "jsx": "preserve",
+ "jsxImportSource": "vue",
+ "sourceMap": true,
+ "resolveJsonModule": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "allowSyntheticDefaultImports": true,
+ "lib": ["esnext", "dom"],
+ "types": ["vite/client"],
+ "noEmit": true,
+ "baseUrl": "./",
+ "paths": {
+ "@/*": ["src/*"]
+ },
+ "noImplicitAny": true,
+ "strictFunctionTypes": true,
+ "strictBindCallApply": true,
+ "noImplicitThis": true,
+ "alwaysStrict": true,
+ },
+ "include": [
+ "**/*.ts",
+ "src/**/*.d.ts",
+ "src/types/**/*.d.ts",
+ "src/**/*.ts",
+ "src/**/*.tsx",
+ "src/**/*.vue",
+ "node_modules/tdesign-vue-next/global.d.ts"
+ ],
+ "compileOnSave": false
+}
diff --git a/td_fronted/vite.config.ts b/td_fronted/vite.config.ts
new file mode 100644
index 0000000000..30737de596
--- /dev/null
+++ b/td_fronted/vite.config.ts
@@ -0,0 +1,52 @@
+import path from 'node:path';
+
+import vue from '@vitejs/plugin-vue';
+import vueJsx from '@vitejs/plugin-vue-jsx';
+import { ConfigEnv, loadEnv, UserConfig } from 'vite';
+import { viteMockServe } from 'vite-plugin-mock';
+import svgLoader from 'vite-svg-loader';
+
+const CWD = process.cwd();
+
+// https://vitejs.dev/config/
+export default ({ mode }: ConfigEnv): UserConfig => {
+ const { VITE_BASE_URL, VITE_API_URL_PREFIX } = loadEnv(mode, CWD);
+ return {
+ base: VITE_BASE_URL,
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, './src'),
+ },
+ },
+
+ css: {
+ preprocessorOptions: {
+ less: {
+ modifyVars: {
+ hack: `true; @import (reference) "${path.resolve('src/style/variables.less')}";`,
+ },
+ math: 'strict',
+ javascriptEnabled: true,
+ },
+ },
+ },
+
+ plugins: [
+ vue(),
+ vueJsx(),
+ viteMockServe({
+ mockPath: 'mock',
+ enable: true,
+ }),
+ svgLoader(),
+ ],
+
+ server: {
+ port: 3002,
+ host: '0.0.0.0',
+ proxy: {
+ [VITE_API_URL_PREFIX]: 'http://127.0.0.1:3000/',
+ },
+ },
+ };
+};