diff --git a/.github/workflows/development-deploy.yaml b/.github/workflows/development-deploy.yaml
new file mode 100644
index 00000000..cef94382
--- /dev/null
+++ b/.github/workflows/development-deploy.yaml
@@ -0,0 +1,30 @@
+name: deploy dev
+
+on:
+ push:
+ branches:
+ - development
+jobs:
+ build-and-push-image:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ ref: development
+
+ - name: Log in to the Container registry
+ uses: docker/login-action@v3
+ with:
+ registry: https://ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v6
+ with:
+ context: .
+ push: true
+ tags: |
+ ghcr.io/icpcplatform/icpc-platform:latest-dev
+ ghcr.io/icpcplatform/icpc-platform:dev-${{ github.sha }}
diff --git a/.gitignore b/.gitignore
index 363a911a..8151b434 100644
--- a/.gitignore
+++ b/.gitignore
@@ -70,3 +70,10 @@ Thumbs.db
# Build output
dist/
.cache/
+
+# Playwright
+node_modules/
+/test-results/
+/playwright-report/
+/blob-report/
+/playwright/.cache/
diff --git a/components.json b/components.json
index 45e44def..7225503e 100644
--- a/components.json
+++ b/components.json
@@ -18,4 +18,4 @@
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
-}
\ No newline at end of file
+}
diff --git a/doc/ERDv2.1.svg b/doc/ERD 2/ERDv2.1.svg
similarity index 100%
rename from doc/ERDv2.1.svg
rename to doc/ERD 2/ERDv2.1.svg
diff --git a/doc/ERDv2.1.txt b/doc/ERD 2/ERDv2.1.txt
similarity index 100%
rename from doc/ERDv2.1.txt
rename to doc/ERD 2/ERDv2.1.txt
diff --git a/doc/ERD 3/ERD 3.1.txt b/doc/ERD 3/ERD 3.1.txt
new file mode 100644
index 00000000..fc2a2cfe
--- /dev/null
+++ b/doc/ERD 3/ERD 3.1.txt
@@ -0,0 +1,154 @@
+Table users {
+ user_id uuid [pk]
+ username varchar(255) [not null, unique]
+ password varchar(255) [not null]
+ gmail varchar(255) [unique]
+ cf_handle varchar(255) [not null]
+ vj_handle varchar(255) [not null]
+ phone_number varchar(15) [unique]
+ role varchar(50)
+ // last_online timestamp not needed
+ deleted timestamp
+}
+Table email_auth{
+ token varchar
+ user_id uuid [ref: -users.user_id]
+ expires_at timestamp // 7 days after
+}
+Table users_full_data {
+ user_id uuid [pk, ref: > users.user_id]
+
+ /* Academic */
+ institute_id integer [ref: > institutes.institute_id]
+ faculty_id integer [ref: > faculties.faculty_id]
+ department_id integer [ref: > departments.department_id]
+ community_id integer [ref: > communities.community_id]
+ academic_year integer
+ graduation_date date
+
+ /* Handles */
+ atcoder varchar(16) // case-insensitive (citext)
+ codechef varchar(15) // case-insensitive (citext)
+ leetcode varchar(30) // case-insensitive (citext)
+ cses varchar(16) // case-insensitive (citext)
+
+ /* Personal */
+ first_name_en varchar(20)
+ last_name_en varchar(20)
+ name_ar1 varchar(20)
+ name_ar2 varchar(20)
+ name_ar3 varchar(20)
+ name_ar4 varchar(20)
+ national_id char(14) [unique]
+ country_id integer [ref: > countries.country_id]
+ city_id integer [ref: > cities.city_id]
+ is_male boolean
+ image_url varchar(255)
+ whatsapp_phone_number varchar(15)
+
+ /* Socials */
+ facebook varchar(128)
+ linkedin varchar(30)
+ twitter varchar(16)
+ github varchar(40)
+ telegram varchar(32)
+
+ /* Server */
+ visibility_mask integer [default: 0]
+ registration_date timestamp //[default: now()]
+}
+
+Table cities{
+ city_id integer [pk]
+ city_name varchar(255)
+}
+Table communities{
+ community_id integer [pk]
+ community_name varchar(255)
+}
+Table faculties{
+ faculty_id integer [pk]
+ faculty_name varchar(255)
+}
+Table departments{
+ department_id integer [pk]
+ department_name varchar(255)
+}
+Table institutes{
+ institute_id integer [pk]
+ institute_name varchar(255)
+}
+Table countries{
+ country_id integer [pk]
+ country_name varchar(255)
+}
+
+Table training {
+ training_id integer [pk]
+ head_id uuid [ref: > users.user_id]
+ chief_judge uuid [ref: > users.user_id]
+ title varchar(128) [not null]
+ description varchar(512)
+ start_date date [not null]
+ duration smallint [not null] // in days
+ status varchar(50) // e.g., 'planned', 'active', 'completed'
+ deleted timestamp
+}
+
+Table staff {
+ training_id id [ref: > training.training_id]
+ user_id uuid [ref: > users.user_id]
+
+ mentor boolean [default: false]
+ problem_setter boolean [default: false]
+ instructor boolean [default: false]
+ co_head boolean [default: false]
+ coach boolean [default: false]
+
+ deleted timestamp
+ indexes {
+ (user_id, training_id) [pk]
+ }
+}
+Table trainee {
+ user_id uuid [ref: > users.user_id]
+ training_id integer [ref: > training.training_id]
+ mentor_id uuid [not null]
+ mentor_assigned_date timestamp [not null]
+ deleted timestamp
+ indexes {
+ (user_id, training_id) [pk]
+ }
+}
+Ref: trainee.(mentor_id, training_id) - staff.(user_id, training_id)
+
+
+Table mentor_trainee_history{
+ trainee_id uuid
+ mentor_id uuid
+ training_id id [ref: > training.training_id]
+ start_date date
+ end_date date
+ Indexes {
+ (trainee_id,mentor_id,training_id) [pk]
+ }
+}
+Ref: mentor_trainee_history.(trainee_id, training_id) - trainee.(user_id, training_id)
+Ref: mentor_trainee_history.(mentor_id, training_id) - staff.(user_id, training_id)
+
+Table session {
+ week_number id
+ training_id id [ref: > training.training_id, not null]
+ title varchar(255) [not null]
+ description text
+ date date [not null]
+ deleted timestamp
+ Indexes {
+ (week_number,training_id) [pk]
+ }
+}
+
+
+
+
+
diff --git a/doc/ERD 3/ERD 3.2.txt b/doc/ERD 3/ERD 3.2.txt
new file mode 100644
index 00000000..28d25123
--- /dev/null
+++ b/doc/ERD 3/ERD 3.2.txt
@@ -0,0 +1,180 @@
+Table users {
+ user_id uuid [pk]
+ username varchar(255) [not null, unique]
+ password varchar(255) [not null]
+ gmail varchar(255) [unique]
+ cf_handle varchar(255) [not null]
+ vj_handle varchar(255) [not null]
+ phone_number varchar(15) [unique]
+ role varchar(50)
+ // last_online timestamp not needed
+ deleted timestamp
+}
+Table email_auth{
+ token varchar
+ user_id uuid [ref: -users.user_id]
+ expires_at timestamp // 7 days after
+}
+Table users_full_data {
+ user_id uuid [pk, ref: > users.user_id]
+
+ /* Academic */
+ institute_id integer [ref: > institutes.institute_id]
+ faculty_id integer [ref: > faculties.faculty_id]
+ department_id integer [ref: > departments.department_id]
+ community_id integer [ref: > communities.community_id]
+ academic_year integer
+ graduation_date date
+
+ /* Handles */
+ atcoder varchar(16) // case-insensitive (citext)
+ codechef varchar(15) // case-insensitive (citext)
+ leetcode varchar(30) // case-insensitive (citext)
+ cses varchar(16) // case-insensitive (citext)
+
+ /* Personal */
+ first_name_en varchar(20)
+ last_name_en varchar(20)
+ name_ar1 varchar(20)
+ name_ar2 varchar(20)
+ name_ar3 varchar(20)
+ name_ar4 varchar(20)
+ national_id char(14) [unique]
+ country_id integer [ref: > countries.country_id]
+ city_id integer [ref: > cities.city_id]
+ is_male boolean
+ image_url varchar(255)
+ whatsapp_phone_number varchar(15)
+
+ /* Socials */
+ facebook varchar(128)
+ linkedin varchar(30)
+ twitter varchar(16)
+ github varchar(40)
+ telegram varchar(32)
+
+ /* Server */
+ visibility_mask integer [default: 0]
+ registration_date timestamp //[default: now()]
+}
+
+Table cities{
+ city_id integer [pk]
+ city_name varchar(255)
+}
+Table communities{
+ community_id integer [pk]
+ community_name varchar(255)
+}
+Table faculties{
+ faculty_id integer [pk]
+ faculty_name varchar(255)
+}
+Table departments{
+ department_id integer [pk]
+ department_name varchar(255)
+}
+Table institutes{
+ institute_id integer [pk]
+ institute_name varchar(255)
+}
+Table countries{
+ country_id integer [pk]
+ country_name varchar(255)
+}
+
+Table training {
+ training_id integer [pk]
+ head_id uuid [ref: > users.user_id]
+ chief_judge uuid [ref: > users.user_id]
+ title varchar(128) [not null]
+ description varchar(512)
+ material json
+ standing json
+ standingview json
+ start_date date [not null]
+ duration smallint [not null] // in days
+ status varchar(50) // e.g., 'planned', 'active', 'completed','RoadMap'
+ deleted timestamp
+}
+
+Table Block{
+ training_id int [ref: > training.training_id]
+ block_number integer
+
+ title varchar(255) [not null]
+ description varchar
+ hidden boolean
+ date date [not null]
+ deleted timestamp
+ Indexes {
+ (training_id,block_number) [pk]
+ }
+
+}
+
+Table Contest{
+
+ training_id int
+ block_number int
+ contest_id int
+
+ group_id varchar
+ judge varchar
+ title varchar
+ description varchar
+
+ type varchar //practice,contest
+ pointspp int
+ first_points int
+ calcsystem int // default 0 => 90%
+
+ Indexes {
+ (training_id,block_number,contest_id) [pk]
+ }
+
+}
+ref: Contest.(training_id,block_number) > Block.(training_id,block_number)
+
+
+Table staff {
+ training_id id [ref: > training.training_id]
+ user_id uuid [ref: > users.user_id]
+
+ mentor boolean [default: false]
+ problem_setter boolean [default: false]
+ instructor boolean [default: false]
+ co_head boolean [default: false]
+ manager boolean [default: false]
+
+ deleted timestamp
+ indexes {
+ (user_id, training_id) [pk]
+ }
+}
+Table trainee {
+ user_id uuid [ref: > users.user_id]
+ training_id integer [ref: > training.training_id]
+ mentor_id uuid [not null]
+ mentor_assigned_date timestamp [not null]
+ deleted timestamp
+ indexes {
+ (user_id, training_id) [pk]
+ }
+}
+Ref: trainee.(mentor_id, training_id) - staff.(user_id, training_id)
+
+
+Table mentor_trainee_history{
+ trainee_id uuid
+ mentor_id uuid
+ training_id id [ref: > training.training_id]
+ start_date date
+ end_date date
+ Indexes {
+ (trainee_id,mentor_id,training_id) [pk]
+ }
+}
+Ref: mentor_trainee_history.(mentor_id, training_id) - staff.(user_id, training_id)
+Ref: mentor_trainee_history.(trainee_id, training_id) - trainee.(user_id, training_id)
+
diff --git a/doc/ERD 3/ERD 3.3.txt b/doc/ERD 3/ERD 3.3.txt
new file mode 100644
index 00000000..903eccc3
--- /dev/null
+++ b/doc/ERD 3/ERD 3.3.txt
@@ -0,0 +1,186 @@
+Table users {
+ user_id uuid [pk]
+ username citext [not null, unique]
+ password varchar [not null]
+
+ gmail citext [unique, not null]
+ cf_handle citext [unique, not null]
+ vj_handle citext [unique]
+ phone_number varchar(15) [not null]
+ role varchar(40) [default: "user", not null]
+ deleted timestamp
+}
+Table email_auth{
+ user_id uuid [ref: -users.user_id]
+ token varchar [not null]
+ expires_at timestamp [default: "now + 7 days", not null]// 7 days after
+}
+Table reset_password{
+ user_id uuid [ref: -users.user_id]
+ token char(25) [not null]
+ endAt timestamp [default: "now + 1 day", not null]
+}
+Table users_full_data {
+ user_id uuid [pk, ref: > users.user_id]
+
+ /* Academic */
+ institute_id integer [ref: > institutes.id]
+ faculty_id integer [ref: > faculties.id]
+ department_id integer [ref: > departments.id]
+ community_id integer [ref: > communities.id]
+ academic_year integer
+ graduation_date date
+
+ /* Handles */
+ atcoder citext
+ codechef citext
+ leetcode citext
+ cses citext
+
+ /* Personal */
+ first_name_en varchar(20)
+ last_name_en varchar(20)
+ name_ar1 varchar(20)
+ name_ar2 varchar(20)
+ name_ar3 varchar(20)
+ name_ar4 varchar(20)
+ national_id char(14) [unique]
+ country_id integer [ref: > countries.id]
+ city_id integer [ref: > cities.id]
+ is_male boolean
+ image_url varchar(255)
+ whatsapp_phone_number varchar(15)
+
+ /* Socials */
+ facebook varchar(128)
+ linkedin varchar(30)
+ twitter varchar(16)
+ github varchar(40)
+ telegram varchar(32)
+
+ /* Server */
+ visibility_mask integer [default: 0]
+ registration_date timestamp [default: "now"]
+}
+
+Table cities{
+ id integer [pk]
+ name varchar(60) [not null,unique]
+}
+Table communities{
+ id integer [pk]
+ name varchar(60) [not null, unique]
+}
+Table faculties{
+ id integer [pk]
+ name varchar(60) [not null, unique]
+}
+Table departments{
+ id integer [pk]
+ name varchar(60) [not null, unique]
+}
+Table institutes{
+ id integer [pk]
+ name varchar(60) [not null, unique]
+}
+Table countries{
+ id integer [pk]
+ name varchar(60) [not null, unique]
+}
+
+
+Table trainings {
+ training_id integer [pk]
+ head_id uuid [ref: > users.user_id]
+ chief_judge uuid [ref: > users.user_id]
+ title varchar(128) [not null]
+ description varchar(512)
+ standing jsonb
+ standingview jsonb
+ start_date date [not null]
+ duration smallint [not null] // in days
+ status varchar(20) // e.g., 'planned', 'active', 'completed','RoadMap'
+ deleted timestamp
+}
+Table blocks{
+ training_id int [ref: > trainings.training_id]
+ block_number integer
+
+ title varchar(128) [not null]
+ description varchar(512) [not null]
+ material jsonb
+ hidden timestamp [not null]
+ date date [not null]
+ deleted timestamp
+ Indexes {
+ (training_id,block_number) [pk]
+ }
+
+}
+Table contests{
+
+ training_id int [not null]
+ block_number int [not null]
+ contest_id varchar(32) [not null]
+
+
+ group_id varchar(32)
+ judge varchar(32) [not null]
+ title varchar(128) [not null]
+ description varchar(512) [not null]
+
+ type varchar //practice,contest
+ pointspp int [default: 20, not null]
+ first_points int [default: 1000, not null]
+ calcsystem varchar(32) [default: "90%", not null]
+ date timestamp [default: "now", not null]
+ deleted timestamp
+ Indexes {
+ (training_id,block_number,contest_id) [pk]
+ }
+
+}
+Table staff {
+ user_id uuid [ref: > users.user_id]
+ training_id integer [ref: > trainings.training_id, not null]
+
+ mentor boolean [default: false, not null]
+ problem_setter boolean [default: false, not null]
+ instructor boolean [default: false, not null]
+ co_head boolean [default: false, not null]
+ manager boolean [default: false, not null]
+
+ deleted timestamp
+
+ indexes {
+ (user_id, training_id) [pk]
+ (mentor) [name: "mentor_idx"]
+ }
+}
+Table trainees {
+ user_id uuid [ref: > users.user_id, not null]
+ training_id integer [ref: > trainings.training_id, not null]
+
+ mentor_id uuid [not null]
+ mentor_assigned_date timestamp [default: "now", not null]
+ deleted timestamp
+ indexes {
+ (training_id, user_id) [pk]
+ }
+}
+Table mentor_trainee_history{
+ trainee_id uuid [not null]
+ mentor_id uuid [not null]
+ training_id integer [ref: > trainings.training_id, not null]
+ start_date timestamp [ not null]
+ end_date timestamp [default: "now", not null]
+ Indexes {
+ (mentor_id,training_id,trainee_id,end_date) [pk]
+ }
+}
+
+Ref: contests.(training_id,block_number) > blocks.(training_id,block_number)
+Ref: trainees.(mentor_id, training_id) - staff.(user_id, training_id)
+Ref: mentor_trainee_history.(mentor_id, training_id) - staff.(user_id, training_id)
+Ref: mentor_trainee_history.(trainee_id, training_id) - trainees.(user_id, training_id)
+
diff --git a/doc/ERD 3/ERD 3.4.txt b/doc/ERD 3/ERD 3.4.txt
new file mode 100644
index 00000000..3c6a7a97
--- /dev/null
+++ b/doc/ERD 3/ERD 3.4.txt
@@ -0,0 +1,205 @@
+Table users {
+ user_id uuid [pk]
+ username citext [not null, unique]
+ password varchar [not null]
+
+ gmail citext [unique, not null]
+ cf_handle citext [unique, not null]
+ vj_handle citext [unique]
+ phone_number varchar(15) [not null]
+ role varchar(40) [default: "user", not null]
+ deleted timestamp
+}
+Table email_auth{
+ user_id uuid [ref: -users.user_id]
+ token varchar [not null]
+ expires_at timestamp [default: "now + 7 days", not null]// 7 days after
+}
+Table reset_password{
+ user_id uuid [ref: -users.user_id]
+ token char(25) [not null]
+ endAt timestamp [default: "now + 1 day", not null]
+}
+Table users_full_data {
+ user_id uuid [pk, ref: > users.user_id]
+
+ /* Academic */
+ institute_id integer [ref: > institutes.id]
+ faculty_id integer [ref: > faculties.id]
+ department_id integer [ref: > departments.id]
+ community_id integer [ref: > communities.id]
+ academic_year integer
+ graduation_date date
+
+ /* Handles */
+ atcoder citext
+ codechef citext
+ leetcode citext
+ cses citext
+
+ /* Personal */
+ first_name_en varchar(20)
+ last_name_en varchar(20)
+ name_ar1 varchar(20)
+ name_ar2 varchar(20)
+ name_ar3 varchar(20)
+ name_ar4 varchar(20)
+ national_id char(14) [unique]
+ country_id integer [ref: > countries.id]
+ city_id integer [ref: > cities.id]
+ is_male boolean
+ image_url varchar(255)
+ whatsapp_phone_number varchar(15)
+
+ /* Socials */
+ facebook varchar(128)
+ linkedin varchar(30)
+ twitter varchar(16)
+ github varchar(40)
+ telegram varchar(32)
+
+ /* Server */
+ visibility_mask integer [default: 0]
+ registration_date timestamp [default: "now"]
+}
+
+Table cities{
+ id integer [pk]
+ name varchar(60) [not null,unique]
+}
+Table communities{
+ id integer [pk]
+ name varchar(60) [not null, unique]
+}
+Table faculties{
+ id integer [pk]
+ name varchar(60) [not null, unique]
+}
+Table departments{
+ id integer [pk]
+ name varchar(60) [not null, unique]
+}
+Table institutes{
+ id integer [pk]
+ name varchar(60) [not null, unique]
+}
+Table countries{
+ id integer [pk]
+ name varchar(60) [not null, unique]
+}
+
+
+Table trainings {
+ training_id integer [pk]
+ head_id uuid [ref: > users.user_id]
+ chief_judge uuid [ref: > users.user_id]
+ title varchar(128) [not null]
+ description varchar(512)
+ standing jsonb
+ standingview jsonb
+ start_date date [not null]
+ duration smallint [not null] // in days
+ status varchar(20) // e.g., 'planned', 'active', 'completed','RoadMap'
+ deleted timestamp
+}
+Table blocks{
+ training_id int [ref: > trainings.training_id]
+ block_number integer
+
+ title varchar(128) [not null]
+ description varchar(512) [not null]
+ material jsonb
+ hidden timestamp [not null]
+ date date [not null]
+ deleted timestamp
+ Indexes {
+ (training_id,block_number) [pk]
+ }
+
+}
+Table contests{
+
+ training_id int [not null]
+ block_number int [not null]
+ contest_id varchar(32) [not null]
+
+
+ group_id varchar(32)
+ judge varchar(32) [not null]
+ title varchar(128) [not null]
+ description varchar(512) [not null]
+ standing jsonb
+ type varchar //practice,contest
+ pointspp int [default: 20, not null]
+ first_points int [default: 1000, not null]
+ calcsystem varchar(32) [default: "reda1.0", not null]
+ date timestamp [default: "now", not null]
+ deleted timestamp
+ Indexes {
+ (training_id,block_number,contest_id) [pk]
+ }
+
+}
+Table staff {
+ user_id uuid [ref: > users.user_id]
+ training_id integer [ref: > trainings.training_id, not null]
+
+ mentor boolean [default: false, not null]
+ problem_setter boolean [default: false, not null]
+ instructor boolean [default: false, not null]
+ co_head boolean [default: false, not null]
+ manager boolean [default: false, not null]
+
+ deleted timestamp
+
+ indexes {
+ (user_id, training_id) [pk]
+ (mentor) [name: "mentor_idx"]
+ }
+}
+Table trainees {
+ user_id uuid [ref: > users.user_id, not null]
+ training_id integer [ref: > trainings.training_id, not null]
+
+ mentor_id uuid [not null]
+ mentor_assigned_date timestamp [default: "now", not null]
+ deleted timestamp
+ indexes {
+ (training_id, user_id) [pk]
+ }
+}
+Table mentor_trainee_history{
+ trainee_id uuid [not null]
+ mentor_id uuid [not null]
+ training_id integer [ref: > trainings.training_id, not null]
+ start_date timestamp [ not null]
+ end_date timestamp [default: "now", not null]
+ Indexes {
+ (mentor_id,training_id,trainee_id,end_date) [pk]
+ }
+}
+Table applications {
+ application_id integer [pk, increment]
+ user_id uuid [not null, ref: > users.user_id]
+ training_id integer [not null, ref: > trainings.training_id]
+
+ status varchar(20) [
+ default: 'pending',
+ not null,
+ note: 'pending|accepted|rejected|withdrawn'
+ ]
+
+ applied_at timestamp [default: "now", not null]
+ updated_at timestamp [default: "now", not null]
+ // could be added
+ // processed_by uuid [ref: > users.user_id, note: "Staff who processed application"]
+ // processed_at timestamp
+ notes text [note: "Internal staff notes"]
+
+}
+
+Ref: contests.(training_id,block_number) > blocks.(training_id,block_number)
+Ref: trainees.(mentor_id, training_id) - staff.(user_id, training_id)
+Ref: mentor_trainee_history.(mentor_id, training_id) - staff.(user_id, training_id)
+Ref: mentor_trainee_history.(trainee_id, training_id) - trainees.(user_id, training_id)
+
diff --git a/doc/ERD 3/ERD3.1.svg b/doc/ERD 3/ERD3.1.svg
new file mode 100644
index 00000000..546679ff
--- /dev/null
+++ b/doc/ERD 3/ERD3.1.svg
@@ -0,0 +1,12 @@
+0..1 1 1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 1 * 1 * 1 * 1 * 0..1 1 1 * 0..1 1 0..1 1 1 * users user_id uuid username varchar(255) password varchar(255) gmail varchar(255) cf_handle varchar(255) vj_handle varchar(255) phone_number varchar(15) role varchar(50) deleted timestamp email_auth token varchar user_id uuid expires_at timestamp users_full_data user_id uuid institute_id integer faculty_id integer department_id integer community_id integer academic_year integer graduation_date date atcoder varchar(16) codechef varchar(15) leetcode varchar(30) cses varchar(16) first_name_en varchar(20) last_name_en varchar(20) name_ar1 varchar(20) name_ar2 varchar(20) name_ar3 varchar(20) name_ar4 varchar(20) national_id char(14) country_id integer city_id integer is_male boolean image_url varchar(255) whatsapp_phone_number varchar(15) facebook varchar(128) linkedin varchar(30) twitter varchar(16) github varchar(40) telegram varchar(32) visibility_mask integer registration_date timestamp cities city_id integer city_name varchar(255) communities community_id integer community_name varchar(255) faculties faculty_id integer faculty_name varchar(255) departments department_id integer department_name varchar(255) institutes institute_id integer institute_name varchar(255) countries country_id integer country_name varchar(255) training training_id integer head_id uuid chief_judge uuid title varchar(128) description varchar(512) start_date date duration smallint status varchar(50) deleted timestamp staff training_id id user_id uuid mentor boolean problem_setter boolean instructor boolean co_head boolean coach boolean deleted timestamp (user_id, training_id) trainee user_id uuid training_id integer mentor_id uuid mentor_assigned_date timestamp deleted timestamp (user_id, training_id) (mentor_id, training_id) mentor_trainee_history trainee_id uuid mentor_id uuid training_id id start_date date end_date date (trainee_id, training_id) (mentor_id, training_id) session week_number id training_id id title varchar(255) description text date date deleted timestamp
\ No newline at end of file
diff --git a/doc/ERD 3/ERD3.2.svg b/doc/ERD 3/ERD3.2.svg
new file mode 100644
index 00000000..7c2efd02
--- /dev/null
+++ b/doc/ERD 3/ERD3.2.svg
@@ -0,0 +1,12 @@
+0..1 1 1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 1 * * 1 1 * 1 * 1 * 1 * 1 1 1 * 1 1 1 1 users user_id uuid username varchar(255) password varchar(255) gmail varchar(255) cf_handle varchar(255) vj_handle varchar(255) phone_number varchar(15) role varchar(50) deleted timestamp email_auth token varchar user_id uuid expires_at timestamp users_full_data user_id uuid institute_id integer faculty_id integer department_id integer community_id integer academic_year integer graduation_date date atcoder varchar(16) codechef varchar(15) leetcode varchar(30) cses varchar(16) first_name_en varchar(20) last_name_en varchar(20) name_ar1 varchar(20) name_ar2 varchar(20) name_ar3 varchar(20) name_ar4 varchar(20) national_id char(14) country_id integer city_id integer is_male boolean image_url varchar(255) whatsapp_phone_number varchar(15) facebook varchar(128) linkedin varchar(30) twitter varchar(16) github varchar(40) telegram varchar(32) visibility_mask integer registration_date timestamp cities city_id integer city_name varchar(255) communities community_id integer community_name varchar(255) faculties faculty_id integer faculty_name varchar(255) departments department_id integer department_name varchar(255) institutes institute_id integer institute_name varchar(255) countries country_id integer country_name varchar(255) training training_id integer head_id uuid chief_judge uuid title varchar(128) description varchar(512) material json standing json standingview json start_date date duration smallint status varchar(50) deleted timestamp Block training_id int block_number integer title varchar(255) description varchar hidden boolean date date deleted timestamp (training_id, block_number) Contest training_id int block_number int contest_id int group_id varchar judge varchar title varchar description varchar type varchar pointspp int first_points int calcsystem int (training_id, block_number) staff training_id id user_id uuid mentor boolean problem_setter boolean instructor boolean co_head boolean manager boolean deleted timestamp (user_id, training_id) trainee user_id uuid training_id integer mentor_id uuid mentor_assigned_date timestamp deleted timestamp (user_id, training_id) (mentor_id, training_id) mentor_trainee_history trainee_id uuid mentor_id uuid training_id id start_date date end_date date (mentor_id, training_id) (trainee_id, training_id)
\ No newline at end of file
diff --git a/doc/ERD 3/ERD3.3.svg b/doc/ERD 3/ERD3.3.svg
new file mode 100644
index 00000000..175611de
--- /dev/null
+++ b/doc/ERD 3/ERD3.3.svg
@@ -0,0 +1,12 @@
+0..1 1 0..1 1 1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 1 * 1 * 1 * 1 * 1 * 1 * * 1 1 1 1 1 1 1 users user_id uuid username citext password varchar gmail citext cf_handle citext vj_handle citext phone_number varchar(15) role varchar(40) deleted timestamp email_auth user_id uuid token varchar expires_at timestamp reset_password user_id uuid token char(25) endAt timestamp users_full_data user_id uuid institute_id integer faculty_id integer department_id integer community_id integer academic_year integer graduation_date date atcoder citext codechef citext leetcode citext cses citext first_name_en varchar(20) last_name_en varchar(20) name_ar1 varchar(20) name_ar2 varchar(20) name_ar3 varchar(20) name_ar4 varchar(20) national_id char(14) country_id integer city_id integer is_male boolean image_url varchar(255) whatsapp_phone_number varchar(15) facebook varchar(128) linkedin varchar(30) twitter varchar(16) github varchar(40) telegram varchar(32) visibility_mask integer registration_date timestamp cities id integer name varchar(60) communities id integer name varchar(60) faculties id integer name varchar(60) departments id integer name varchar(60) institutes id integer name varchar(60) countries id integer name varchar(60) trainings training_id integer head_id uuid chief_judge uuid title varchar(128) description varchar(512) standing jsonb standingview jsonb start_date date duration smallint status varchar(20) deleted timestamp blocks training_id int block_number integer title varchar(128) description varchar(512) material jsonb hidden timestamp date date deleted timestamp (training_id, block_number) contests training_id int block_number int contest_id varchar(32) group_id varchar(32) judge varchar(32) title varchar(128) description varchar(512) type varchar pointspp int first_points int calcsystem varchar(32) date timestamp deleted timestamp (training_id, block_number) staff user_id uuid training_id integer mentor boolean problem_setter boolean instructor boolean co_head boolean manager boolean deleted timestamp (user_id, training_id) trainees user_id uuid training_id integer mentor_id uuid mentor_assigned_date timestamp deleted timestamp (user_id, training_id) (mentor_id, training_id) mentor_trainee_history trainee_id uuid mentor_id uuid training_id integer start_date timestamp end_date timestamp (mentor_id, training_id) (trainee_id, training_id)
\ No newline at end of file
diff --git a/doc/ERD 3/ERDv3.0.svg b/doc/ERD 3/ERDv3.0.svg
new file mode 100644
index 00000000..8081be63
--- /dev/null
+++ b/doc/ERD 3/ERDv3.0.svg
@@ -0,0 +1,12 @@
+0..1 1 1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 0..1 * 1 * 1 * 1 * 1 * 0..1 1 1 * 0..1 1 0..1 1 1 * 1 * 1 * 0..1 1 0..1 1 user user_id uuid username varchar(255) password varchar(255) gmail varchar(255) cf_handle varchar(255) vj_handle varchar(255) phone_number varchar(15) role varchar(50) deleted timestamptz email_auth token varchar user_id uuid expires_at timestamp user_full_data user_id uuid institute_id uuid academic_mail varchar(255) faculty uuid department uuid academic_year smallint graduation_date date atcoder varchar(255) codechef varchar(255) leetcode varchar(255) cses varchar(255) name_en_first varchar(255) name_en_last varchar(255) name_ar1 varchar(255) name_ar2 varchar(255) name_ar3 varchar(255) name_ar4 varchar(255) national_id varchar(255) country varchar(100) city_id uuid is_male boolean image_url varchar(511) facebook varchar(255) linkedin varchar(255) twitter varchar(255) github varchar(255) telegram varchar(255) visibility bitmask registration_date timestampz city city_id uuid city_name varchar(255) faculty faculty_id uuid faculty_name varchar(255) department department_id uuid department_name varchar(255) institute institute_id uuid institute_name varchar(255) training training_id uuid head_id uuid chief_judge uuid title varchar(255) description text start_date date duration smallint status varchar(50) deleted timestamptz staff training_id uuid user_id uuid mentor boolean problem_setter boolean instructor boolean co_head boolean coach boolean deleted timestamptz (user_id, training_id) trainee user_id uuid training_id uuid mentor_id uuid mentor_assigned_date timestamptz deleted timestamptz (user_id, training_id) (mentor_id, training_id) mentor_trainee_history trainee_id uuid mentor_id uuid training_id uuid start_date date end_date date (trainee_id, training_id) (mentor_id, training_id) session session_id uuid training_id uuid session_date date session_title varchar(255) session_description text deleted timestamptz contest session_id uuid contest_id varchar(255) contest_type varchar(1) judge varchar(20) base_points integer contest_points integer deleted timestamp attendance mentor_id uuid trainee_id uuid session_id uuid training_id uuid log_time timestamptz log_type varchar(20) (trainee_id, trainee_id) (mentor_id, trainee_id)
\ No newline at end of file
diff --git a/drizzle/0000_blushing_tempest.sql b/drizzle/0000_blushing_tempest.sql
new file mode 100644
index 00000000..27a33933
--- /dev/null
+++ b/drizzle/0000_blushing_tempest.sql
@@ -0,0 +1,200 @@
+CREATE TABLE "Blocks" (
+ "training_id" integer NOT NULL,
+ "block_number" integer NOT NULL,
+ "title" varchar(128) NOT NULL,
+ "description" varchar(512) NOT NULL,
+ "hidden" boolean DEFAULT false NOT NULL,
+ "date" timestamp DEFAULT now() NOT NULL,
+ "deleted" timestamp,
+ CONSTRAINT "block_pkey" PRIMARY KEY("block_number","training_id")
+);
+--> statement-breakpoint
+CREATE TABLE "contests" (
+ "training_id" integer NOT NULL,
+ "block_number" integer NOT NULL,
+ "contest_id" varchar(128) NOT NULL,
+ "group_id" varchar(128) NOT NULL,
+ "judge" varchar(128) NOT NULL,
+ "type" varchar(128) NOT NULL,
+ "title" varchar(128) NOT NULL,
+ "description" varchar(512) NOT NULL,
+ "point_per_problem" integer NOT NULL,
+ "first_points" integer NOT NULL,
+ "calc_sys" varchar(128) NOT NULL,
+ "date" timestamp NOT NULL,
+ "deleted" timestamp,
+ CONSTRAINT "Contest_pkey" PRIMARY KEY("block_number","training_id","contest_id")
+);
+--> statement-breakpoint
+CREATE TABLE "mentorTraineeHistory" (
+ "mentor_id" uuid NOT NULL,
+ "trainee_id" uuid NOT NULL,
+ "training_id" integer NOT NULL,
+ "start_date" timestamp,
+ "end_date" timestamp,
+ CONSTRAINT "mentorTraineeHistory_training_id_mentor_id_trainee_id_pk" PRIMARY KEY("training_id","mentor_id","trainee_id")
+);
+--> statement-breakpoint
+CREATE TABLE "staff" (
+ "user_id" uuid NOT NULL,
+ "training_id" integer NOT NULL,
+ "mentor" boolean DEFAULT false,
+ "problem_setter" boolean DEFAULT false,
+ "instructor" boolean DEFAULT false,
+ "co_head" boolean DEFAULT false,
+ "manager" boolean DEFAULT false,
+ "deleted" timestamp,
+ CONSTRAINT "staff_pk" PRIMARY KEY("user_id","training_id")
+);
+--> statement-breakpoint
+CREATE TABLE "trainees" (
+ "user_id" uuid NOT NULL,
+ "training_id" integer NOT NULL,
+ "mentor_id" uuid NOT NULL,
+ "mentor_assigned_date" timestamp DEFAULT now(),
+ "deleted" timestamp,
+ CONSTRAINT "trainees_user_id_training_id_pk" PRIMARY KEY("user_id","training_id")
+);
+--> statement-breakpoint
+CREATE TABLE "training_view" (
+ "training_id" integer PRIMARY KEY NOT NULL,
+ "data" jsonb NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "trainings" (
+ "training_id" serial PRIMARY KEY NOT NULL,
+ "head_id" uuid NOT NULL,
+ "chief_judge" uuid NOT NULL,
+ "title" "citext" NOT NULL,
+ "description" varchar(512) NOT NULL,
+ "material" json,
+ "standing" json,
+ "standing_view" json,
+ "start_date" date NOT NULL,
+ "duration" integer DEFAULT 1 NOT NULL,
+ "status" varchar(20) DEFAULT '' NOT NULL,
+ "deleted" timestamp,
+ CONSTRAINT "trainings_title_unique" UNIQUE("title")
+);
+--> statement-breakpoint
+CREATE TABLE "cities" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "cities_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "communities" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "communities_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "countries" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "countries_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "departments" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "departments_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "email_auth" (
+ "token" varchar NOT NULL,
+ "user_id" uuid PRIMARY KEY NOT NULL,
+ "expires_at" date DEFAULT now() + interval '7 day' NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "faculties" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "faculties_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "institutes" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "institutes_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "reset_password" (
+ "user_id" uuid PRIMARY KEY NOT NULL,
+ "token" char(25) NOT NULL,
+ "end_at" timestamp DEFAULT now() + interval '1 day' NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "users" (
+ "user_id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
+ "username" "citext" NOT NULL,
+ "password" varchar NOT NULL,
+ "gmail" "citext" NOT NULL,
+ "cf_handle" "citext" NOT NULL,
+ "vj_handle" "citext",
+ "phone_number" varchar(15) NOT NULL,
+ "role" varchar(40) DEFAULT 'user' NOT NULL,
+ "deleted" timestamp,
+ CONSTRAINT "users_gmail_unique" UNIQUE("gmail"),
+ CONSTRAINT "users_cfHandle_unique" UNIQUE("cf_handle"),
+ CONSTRAINT "users_vjHandle_unique" UNIQUE("vj_handle")
+);
+--> statement-breakpoint
+CREATE TABLE "users_full_data" (
+ "user_id" uuid PRIMARY KEY NOT NULL,
+ "institute_id" integer,
+ "faculty_id" integer,
+ "department_id" integer,
+ "community_id" integer,
+ "academic_year" integer,
+ "graduation_date" date,
+ "atcoder" "citext",
+ "codechef" "citext",
+ "leetcode" "citext",
+ "cses" "citext",
+ "first_name_en" varchar(20),
+ "last_name_en" varchar(20),
+ "name_ar_1" varchar(20),
+ "name_ar_2" varchar(20),
+ "name_ar_3" varchar(20),
+ "name_ar_4" varchar(20),
+ "national_id" char(14),
+ "country_id" integer,
+ "city_id" integer,
+ "is_male" boolean,
+ "image_url" varchar(255),
+ "whatsapp_phone_number" varchar(15),
+ "facebook" varchar(128),
+ "linked_in" varchar(30),
+ "twitter" varchar(16),
+ "github" varchar(40),
+ "telegram" varchar(32),
+ "visibility_mask" integer DEFAULT 0,
+ "registration_date" timestamp DEFAULT now(),
+ CONSTRAINT "users_full_data_nationalId_unique" UNIQUE("national_id")
+);
+--> statement-breakpoint
+ALTER TABLE "Blocks" ADD CONSTRAINT "Blocks_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "contests" ADD CONSTRAINT "contests_training_id_block_number_Blocks_training_id_block_number_fk" FOREIGN KEY ("training_id","block_number") REFERENCES "public"."Blocks"("training_id","block_number") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "mentorTraineeHistory" ADD CONSTRAINT "mentorTraineeHistory_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "mentorTraineeHistory" ADD CONSTRAINT "mentorTraineeHistory_mentor_id_training_id_staff_user_id_training_id_fk" FOREIGN KEY ("mentor_id","training_id") REFERENCES "public"."staff"("user_id","training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "mentorTraineeHistory" ADD CONSTRAINT "mentorTraineeHistory_trainee_id_training_id_trainees_user_id_training_id_fk" FOREIGN KEY ("trainee_id","training_id") REFERENCES "public"."trainees"("user_id","training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "staff" ADD CONSTRAINT "staff_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "staff" ADD CONSTRAINT "staff_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "trainees" ADD CONSTRAINT "trainees_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "trainees" ADD CONSTRAINT "trainees_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "trainees" ADD CONSTRAINT "trainees_mentor_id_training_id_staff_user_id_training_id_fk" FOREIGN KEY ("mentor_id","training_id") REFERENCES "public"."staff"("user_id","training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "trainings" ADD CONSTRAINT "trainings_head_id_users_user_id_fk" FOREIGN KEY ("head_id") REFERENCES "public"."users"("user_id") ON DELETE restrict ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "trainings" ADD CONSTRAINT "trainings_chief_judge_users_user_id_fk" FOREIGN KEY ("chief_judge") REFERENCES "public"."users"("user_id") ON DELETE restrict ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "reset_password" ADD CONSTRAINT "reset_password_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_institute_id_institutes_id_fk" FOREIGN KEY ("institute_id") REFERENCES "public"."institutes"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_faculty_id_faculties_id_fk" FOREIGN KEY ("faculty_id") REFERENCES "public"."faculties"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_department_id_departments_id_fk" FOREIGN KEY ("department_id") REFERENCES "public"."departments"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_community_id_communities_id_fk" FOREIGN KEY ("community_id") REFERENCES "public"."communities"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_country_id_countries_id_fk" FOREIGN KEY ("country_id") REFERENCES "public"."countries"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_city_id_cities_id_fk" FOREIGN KEY ("city_id") REFERENCES "public"."cities"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+CREATE UNIQUE INDEX "users_username_idx" ON "users" USING btree ("username");
+
+ALTER SEQUENCE trainings_training_id_seq RESTART WITH 1001;
+
diff --git a/drizzle/0000_certain_wilson_fisk.sql b/drizzle/0000_certain_wilson_fisk.sql
deleted file mode 100644
index d20a80df..00000000
--- a/drizzle/0000_certain_wilson_fisk.sql
+++ /dev/null
@@ -1,132 +0,0 @@
-CREATE TABLE "attendance_logs" (
- "attendance_log_id" serial PRIMARY KEY NOT NULL,
- "staff_id" integer NOT NULL,
- "trainee_id" integer NOT NULL,
- "training_id" integer NOT NULL,
- "session_id" integer NOT NULL,
- "log_type" varchar(40) NOT NULL,
- "log_time" timestamp DEFAULT now(),
- "log_remarks" varchar
-);
---> statement-breakpoint
-CREATE TABLE "sessions" (
- "session_id" integer PRIMARY KEY NOT NULL,
- "training_id" serial NOT NULL,
- "date_time" timestamp NOT NULL,
- "title" varchar NOT NULL,
- "description" varchar NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "staff" (
- "user_id" integer NOT NULL,
- "training_id" integer NOT NULL,
- "mentor" boolean DEFAULT false,
- "co_head" boolean DEFAULT false,
- "instructor" boolean DEFAULT false,
- "coach" boolean DEFAULT false,
- CONSTRAINT "staff_pk" PRIMARY KEY("user_id","training_id"),
- CONSTRAINT "staff_userId_trainingId_unique" UNIQUE("user_id","training_id")
-);
---> statement-breakpoint
-CREATE TABLE "trainees" (
- "user_id" integer NOT NULL,
- "training_id" integer NOT NULL,
- CONSTRAINT "trainees_user_id_training_id_pk" PRIMARY KEY("user_id","training_id")
-);
---> statement-breakpoint
-CREATE TABLE "trainings" (
- "training_id" serial PRIMARY KEY NOT NULL,
- "head_id" integer NOT NULL,
- "title" varchar NOT NULL,
- "description" varchar NOT NULL,
- "start_date" date NOT NULL,
- "duration" integer,
- "status" varchar(40) DEFAULT 'active' NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "email_auth" (
- "token" varchar NOT NULL,
- "user_id" integer PRIMARY KEY NOT NULL,
- "expires_at" date DEFAULT now() + interval '7 day' NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "tasks" (
- "task_id" serial PRIMARY KEY NOT NULL,
- "title" varchar NOT NULL,
- "description" varchar NOT NULL,
- "training_id" integer DEFAULT 0,
- "trainee_id" integer NOT NULL,
- "staff_id" integer NOT NULL,
- "state" varchar(40) DEFAULT 'pending' NOT NULL,
- "creation_time" timestamp DEFAULT now(),
- "deadline" timestamp NOT NULL
-);
---> statement-breakpoint
-CREATE TABLE "users" (
- "user_id" serial PRIMARY KEY NOT NULL,
- "username" varchar NOT NULL,
- "password" varchar NOT NULL,
- "gmail" varchar NOT NULL,
- "cf_handle" varchar NOT NULL,
- "phone_number" char(11) NOT NULL,
- "role" varchar(40) DEFAULT 'user' NOT NULL,
- "last_online" timestamp DEFAULT now(),
- "is_verified" boolean DEFAULT false NOT NULL,
- "deleted" boolean DEFAULT false NOT NULL,
- CONSTRAINT "users_username_unique" UNIQUE("username"),
- CONSTRAINT "users_password_unique" UNIQUE("password"),
- CONSTRAINT "users_gmail_unique" UNIQUE("gmail"),
- CONSTRAINT "users_cfHandle_unique" UNIQUE("cf_handle"),
- CONSTRAINT "users_phoneNumber_unique" UNIQUE("phone_number")
-);
---> statement-breakpoint
-CREATE TABLE "users_full_data" (
- "user_id" integer PRIMARY KEY NOT NULL,
- "username" varchar NOT NULL,
- "cf_handle" varchar NOT NULL,
- "university" varchar,
- "faculty" varchar,
- "department" varchar,
- "academic_year" integer,
- "graduation_year" date,
- "vjudge" varchar,
- "atcoder" varchar,
- "topcoder" varchar,
- "spoj" varchar,
- "codechef" varchar,
- "csacademy" varchar,
- "leetcode" varchar,
- "cses" varchar,
- "name_en_first" varchar,
- "name_en_last" varchar,
- "name_ar_1" varchar,
- "name_ar_2" varchar,
- "name_ar_3" varchar,
- "name_ar_4" varchar,
- "national_id" char(14),
- "country" varchar,
- "city" varchar,
- "is_male" boolean,
- "image_url" varchar,
- "facebook" varchar,
- "linked_in" varchar,
- "twitter" varchar,
- "github" varchar
-);
---> statement-breakpoint
-ALTER TABLE "attendance_logs" ADD CONSTRAINT "attendance_logs_session_id_sessions_session_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."sessions"("session_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "attendance_logs" ADD CONSTRAINT "fk_attendance_trainees" FOREIGN KEY ("trainee_id","training_id") REFERENCES "public"."trainees"("user_id","training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "attendance_logs" ADD CONSTRAINT "fk_attendance_staff" FOREIGN KEY ("staff_id","training_id") REFERENCES "public"."staff"("user_id","training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "sessions" ADD CONSTRAINT "sessions_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "staff" ADD CONSTRAINT "staff_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "staff" ADD CONSTRAINT "staff_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "trainees" ADD CONSTRAINT "trainees_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "trainees" ADD CONSTRAINT "trainees_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "trainings" ADD CONSTRAINT "trainings_head_id_users_user_id_fk" FOREIGN KEY ("head_id") REFERENCES "public"."users"("user_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "tasks" ADD CONSTRAINT "tasks_trainee_id_training_id_trainees_user_id_training_id_fk" FOREIGN KEY ("trainee_id","training_id") REFERENCES "public"."trainees"("user_id","training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "tasks" ADD CONSTRAINT "tasks_staff_id_training_id_staff_user_id_training_id_fk" FOREIGN KEY ("staff_id","training_id") REFERENCES "public"."staff"("user_id","training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
-ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_username_users_username_fk" FOREIGN KEY ("username") REFERENCES "public"."users"("username") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_cf_handle_users_cf_handle_fk" FOREIGN KEY ("cf_handle") REFERENCES "public"."users"("cf_handle") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
-CREATE UNIQUE INDEX "users_username_idx" ON "users" USING btree ("username");--> statement-breakpoint
-CREATE UNIQUE INDEX "users_full_data_username_idx" ON "users_full_data" USING btree ("username");
\ No newline at end of file
diff --git a/drizzle/0000_confused_ser_duncan.sql b/drizzle/0000_confused_ser_duncan.sql
new file mode 100644
index 00000000..fb80c755
--- /dev/null
+++ b/drizzle/0000_confused_ser_duncan.sql
@@ -0,0 +1,192 @@
+CREATE TABLE "blocks" (
+ "training_id" integer NOT NULL,
+ "block_number" integer NOT NULL,
+ "title" varchar(128) NOT NULL,
+ "description" varchar(512) NOT NULL,
+ "hidden" boolean DEFAULT false NOT NULL,
+ "date" timestamp DEFAULT now() NOT NULL,
+ "deleted" timestamp,
+ CONSTRAINT "block_pkey" PRIMARY KEY("block_number","training_id")
+);
+--> statement-breakpoint
+CREATE TABLE "contests" (
+ "training_id" integer NOT NULL,
+ "block_number" integer NOT NULL,
+ "contest_id" varchar(128) NOT NULL,
+ "group_id" varchar(128) NOT NULL,
+ "judge" varchar(128) NOT NULL,
+ "type" varchar(128) NOT NULL,
+ "title" varchar(128) NOT NULL,
+ "description" varchar(512) NOT NULL,
+ "point_per_problem" integer NOT NULL,
+ "first_points" integer NOT NULL,
+ "calc_sys" varchar(128) NOT NULL,
+ "date" timestamp NOT NULL,
+ "deleted" timestamp,
+ CONSTRAINT "Contest_pkey" PRIMARY KEY("block_number","training_id","contest_id")
+);
+--> statement-breakpoint
+CREATE TABLE "mentor_trainee_history" (
+ "mentor_id" uuid NOT NULL,
+ "trainee_id" uuid NOT NULL,
+ "training_id" integer NOT NULL,
+ "start_date" timestamp,
+ "end_date" timestamp,
+ CONSTRAINT "mentor_trainee_history_training_id_mentor_id_trainee_id_pk" PRIMARY KEY("training_id","mentor_id","trainee_id")
+);
+--> statement-breakpoint
+CREATE TABLE "staff" (
+ "user_id" uuid NOT NULL,
+ "training_id" integer NOT NULL,
+ "mentor" boolean DEFAULT false,
+ "problem_setter" boolean DEFAULT false,
+ "instructor" boolean DEFAULT false,
+ "co_head" boolean DEFAULT false,
+ "manager" boolean DEFAULT false,
+ "deleted" timestamp,
+ CONSTRAINT "staff_pk" PRIMARY KEY("user_id","training_id")
+);
+--> statement-breakpoint
+CREATE TABLE "trainees" (
+ "user_id" uuid NOT NULL,
+ "training_id" integer NOT NULL,
+ "mentor_id" uuid NOT NULL,
+ "mentor_assigned_date" timestamp DEFAULT now(),
+ "deleted" timestamp,
+ CONSTRAINT "trainees_user_id_training_id_pk" PRIMARY KEY("user_id","training_id")
+);
+--> statement-breakpoint
+CREATE TABLE "trainings" (
+ "training_id" serial PRIMARY KEY NOT NULL,
+ "head_id" uuid NOT NULL,
+ "chief_judge" uuid NOT NULL,
+ "title" "citext" NOT NULL,
+ "description" varchar(512) NOT NULL,
+ "material" json,
+ "standing" json,
+ "standing_view" json DEFAULT '["name","handle","numberofsolved","mentor","level"]'::json NOT NULL,
+ "start_date" date NOT NULL,
+ "duration" integer DEFAULT 1 NOT NULL,
+ "status" varchar(20) DEFAULT 'private' NOT NULL,
+ "deleted" timestamp,
+ CONSTRAINT "trainings_title_unique" UNIQUE("title")
+);
+--> statement-breakpoint
+CREATE TABLE "cities" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "cities_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "communities" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "communities_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "countries" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "countries_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "departments" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "departments_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "email_auth" (
+ "token" varchar NOT NULL,
+ "user_id" uuid PRIMARY KEY NOT NULL,
+ "expires_at" date DEFAULT now() + interval '7 day' NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "faculties" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "faculties_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "institutes" (
+ "id" serial PRIMARY KEY NOT NULL,
+ "name" "citext" NOT NULL,
+ CONSTRAINT "institutes_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "reset_password" (
+ "user_id" uuid PRIMARY KEY NOT NULL,
+ "token" char(25) NOT NULL,
+ "end_at" timestamp DEFAULT now() + interval '1 day' NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "users" (
+ "user_id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
+ "username" "citext" NOT NULL,
+ "password" varchar NOT NULL,
+ "gmail" "citext" NOT NULL,
+ "cf_handle" "citext" NOT NULL,
+ "vj_handle" "citext",
+ "phone_number" varchar(15) NOT NULL,
+ "role" varchar(40) DEFAULT 'user' NOT NULL,
+ "deleted" timestamp,
+ CONSTRAINT "users_gmail_unique" UNIQUE("gmail"),
+ CONSTRAINT "users_cfHandle_unique" UNIQUE("cf_handle"),
+ CONSTRAINT "users_vjHandle_unique" UNIQUE("vj_handle")
+);
+--> statement-breakpoint
+CREATE TABLE "users_full_data" (
+ "user_id" uuid PRIMARY KEY NOT NULL,
+ "institute_id" integer,
+ "faculty_id" integer,
+ "department_id" integer,
+ "community_id" integer,
+ "academic_year" integer,
+ "graduation_date" date,
+ "atcoder" "citext",
+ "codechef" "citext",
+ "leetcode" "citext",
+ "cses" "citext",
+ "first_name_en" varchar(20),
+ "last_name_en" varchar(20),
+ "name_ar_1" varchar(20),
+ "name_ar_2" varchar(20),
+ "name_ar_3" varchar(20),
+ "name_ar_4" varchar(20),
+ "national_id" char(14),
+ "country_id" integer,
+ "city_id" integer,
+ "is_male" boolean,
+ "image_url" varchar(255),
+ "whatsapp_phone_number" varchar(15),
+ "facebook" varchar(128),
+ "linked_in" varchar(30),
+ "twitter" varchar(16),
+ "github" varchar(40),
+ "telegram" varchar(32),
+ "visibility_mask" integer DEFAULT 0,
+ "registration_date" timestamp DEFAULT now(),
+ CONSTRAINT "users_full_data_nationalId_unique" UNIQUE("national_id")
+);
+--> statement-breakpoint
+ALTER TABLE "blocks" ADD CONSTRAINT "blocks_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "contests" ADD CONSTRAINT "contests_training_id_block_number_blocks_training_id_block_number_fk" FOREIGN KEY ("training_id","block_number") REFERENCES "public"."blocks"("training_id","block_number") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "mentor_trainee_history" ADD CONSTRAINT "mentor_trainee_history_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "mentor_trainee_history" ADD CONSTRAINT "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk" FOREIGN KEY ("mentor_id","training_id") REFERENCES "public"."staff"("user_id","training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "mentor_trainee_history" ADD CONSTRAINT "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk" FOREIGN KEY ("trainee_id","training_id") REFERENCES "public"."trainees"("user_id","training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "staff" ADD CONSTRAINT "staff_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "staff" ADD CONSTRAINT "staff_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "trainees" ADD CONSTRAINT "trainees_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "trainees" ADD CONSTRAINT "trainees_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "trainees" ADD CONSTRAINT "trainees_mentor_id_training_id_staff_user_id_training_id_fk" FOREIGN KEY ("mentor_id","training_id") REFERENCES "public"."staff"("user_id","training_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "trainings" ADD CONSTRAINT "trainings_head_id_users_user_id_fk" FOREIGN KEY ("head_id") REFERENCES "public"."users"("user_id") ON DELETE restrict ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "trainings" ADD CONSTRAINT "trainings_chief_judge_users_user_id_fk" FOREIGN KEY ("chief_judge") REFERENCES "public"."users"("user_id") ON DELETE restrict ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "reset_password" ADD CONSTRAINT "reset_password_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_institute_id_institutes_id_fk" FOREIGN KEY ("institute_id") REFERENCES "public"."institutes"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_faculty_id_faculties_id_fk" FOREIGN KEY ("faculty_id") REFERENCES "public"."faculties"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_department_id_departments_id_fk" FOREIGN KEY ("department_id") REFERENCES "public"."departments"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_community_id_communities_id_fk" FOREIGN KEY ("community_id") REFERENCES "public"."communities"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_country_id_countries_id_fk" FOREIGN KEY ("country_id") REFERENCES "public"."countries"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "users_full_data" ADD CONSTRAINT "users_full_data_city_id_cities_id_fk" FOREIGN KEY ("city_id") REFERENCES "public"."cities"("id") ON DELETE set null ON UPDATE cascade;--> statement-breakpoint
+CREATE UNIQUE INDEX "users_username_idx" ON "users" USING btree ("username");
\ No newline at end of file
diff --git a/drizzle/0001_past_viper.sql b/drizzle/0001_past_viper.sql
new file mode 100644
index 00000000..1b88f6a5
--- /dev/null
+++ b/drizzle/0001_past_viper.sql
@@ -0,0 +1,28 @@
+ALTER TABLE "mentor_trainee_history" DROP CONSTRAINT "mentor_trainee_history_training_id_mentor_id_trainee_id_pk";--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "contest_id" SET DATA TYPE varchar(32);--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "group_id" SET DATA TYPE varchar(32);--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "group_id" DROP NOT NULL;--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "judge" SET DATA TYPE varchar(32);--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "type" SET DATA TYPE varchar(32);--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "description" SET DEFAULT '';--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "point_per_problem" SET DEFAULT 20;--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "first_points" SET DEFAULT 1000;--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "calc_sys" SET DATA TYPE varchar(32);--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "calc_sys" SET DEFAULT '90%';--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "date" SET DEFAULT now();--> statement-breakpoint
+ALTER TABLE "mentor_trainee_history" ALTER COLUMN "start_date" SET NOT NULL;--> statement-breakpoint
+ALTER TABLE "mentor_trainee_history" ALTER COLUMN "end_date" SET DEFAULT now();--> statement-breakpoint
+ALTER TABLE "mentor_trainee_history" ALTER COLUMN "end_date" SET NOT NULL;--> statement-breakpoint
+ALTER TABLE "staff" ALTER COLUMN "mentor" SET NOT NULL;--> statement-breakpoint
+ALTER TABLE "staff" ALTER COLUMN "problem_setter" SET NOT NULL;--> statement-breakpoint
+ALTER TABLE "staff" ALTER COLUMN "instructor" SET NOT NULL;--> statement-breakpoint
+ALTER TABLE "staff" ALTER COLUMN "co_head" SET NOT NULL;--> statement-breakpoint
+ALTER TABLE "staff" ALTER COLUMN "manager" SET NOT NULL;--> statement-breakpoint
+ALTER TABLE "trainees" ALTER COLUMN "mentor_assigned_date" SET NOT NULL;--> statement-breakpoint
+ALTER TABLE "trainings" ALTER COLUMN "material" SET DATA TYPE jsonb;--> statement-breakpoint
+ALTER TABLE "trainings" ALTER COLUMN "standing" SET DATA TYPE jsonb;--> statement-breakpoint
+ALTER TABLE "trainings" ALTER COLUMN "standing_view" SET DATA TYPE jsonb;--> statement-breakpoint
+ALTER TABLE "trainings" ALTER COLUMN "standing_view" SET DEFAULT '["name","handle","numberofsolved","mentor","level"]'::jsonb;--> statement-breakpoint
+ALTER TABLE "mentor_trainee_history" ADD CONSTRAINT "mentor_trainee_history_training_id_mentor_id_trainee_id_end_date_pk" PRIMARY KEY("training_id","mentor_id","trainee_id","end_date");--> statement-breakpoint
+CREATE INDEX "mentor_idx" ON "staff" USING btree ("mentor");--> statement-breakpoint
+ALTER TABLE "users" ADD CONSTRAINT "users_username_unique" UNIQUE("username");
\ No newline at end of file
diff --git a/drizzle/0002_lush_spirit.sql b/drizzle/0002_lush_spirit.sql
new file mode 100644
index 00000000..5ac8982b
--- /dev/null
+++ b/drizzle/0002_lush_spirit.sql
@@ -0,0 +1,6 @@
+ALTER TABLE "mentor_trainee_history" DROP CONSTRAINT "mentor_trainee_history_training_id_mentor_id_trainee_id_end_date_pk";--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "judge" SET DATA TYPE varchar(2);--> statement-breakpoint
+ALTER TABLE "contests" ALTER COLUMN "date" DROP DEFAULT;--> statement-breakpoint
+ALTER TABLE "mentor_trainee_history" ALTER COLUMN "end_date" DROP DEFAULT;--> statement-breakpoint
+ALTER TABLE "mentor_trainee_history" ALTER COLUMN "end_date" DROP NOT NULL;--> statement-breakpoint
+ALTER TABLE "mentor_trainee_history" ADD CONSTRAINT "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk" PRIMARY KEY("training_id","mentor_id","trainee_id","start_date");
\ No newline at end of file
diff --git a/drizzle/0003_fearless_sunset_bain.sql b/drizzle/0003_fearless_sunset_bain.sql
new file mode 100644
index 00000000..1b9ef2d2
--- /dev/null
+++ b/drizzle/0003_fearless_sunset_bain.sql
@@ -0,0 +1,2 @@
+ALTER TABLE "blocks" ADD COLUMN "material" jsonb DEFAULT '[]'::jsonb NOT NULL;--> statement-breakpoint
+ALTER TABLE "trainings" DROP COLUMN "material";
\ No newline at end of file
diff --git a/drizzle/0004_slippery_star_brand.sql b/drizzle/0004_slippery_star_brand.sql
new file mode 100644
index 00000000..51adadb6
--- /dev/null
+++ b/drizzle/0004_slippery_star_brand.sql
@@ -0,0 +1 @@
+ALTER TABLE "contests" ADD COLUMN "standing" jsonb;
\ No newline at end of file
diff --git a/drizzle/0005_foamy_doctor_faustus.sql b/drizzle/0005_foamy_doctor_faustus.sql
new file mode 100644
index 00000000..07b307a5
--- /dev/null
+++ b/drizzle/0005_foamy_doctor_faustus.sql
@@ -0,0 +1 @@
+ALTER TABLE "trainings" RENAME COLUMN "standing" TO "leader_board";
\ No newline at end of file
diff --git a/drizzle/0006_salty_fantastic_four.sql b/drizzle/0006_salty_fantastic_four.sql
new file mode 100644
index 00000000..1f49ef0a
--- /dev/null
+++ b/drizzle/0006_salty_fantastic_four.sql
@@ -0,0 +1,13 @@
+CREATE TABLE "applications" (
+ "application_id" serial PRIMARY KEY NOT NULL,
+ "user_id" uuid NOT NULL,
+ "training_id" integer NOT NULL,
+ "status" varchar(20),
+ "applied_at" timestamp DEFAULT now() NOT NULL,
+ "updated_at" timestamp DEFAULT now() NOT NULL,
+ "description" varchar(512) NOT NULL,
+ CONSTRAINT "applications_userId_trainingId_unique" UNIQUE("user_id","training_id")
+);
+--> statement-breakpoint
+ALTER TABLE "applications" ADD CONSTRAINT "applications_user_id_users_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("user_id") ON DELETE cascade ON UPDATE cascade;--> statement-breakpoint
+ALTER TABLE "applications" ADD CONSTRAINT "applications_training_id_trainings_training_id_fk" FOREIGN KEY ("training_id") REFERENCES "public"."trainings"("training_id") ON DELETE cascade ON UPDATE cascade;
\ No newline at end of file
diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json
index ca3c64ad..e878819f 100644
--- a/drizzle/meta/0000_snapshot.json
+++ b/drizzle/meta/0000_snapshot.json
@@ -1,155 +1,244 @@
{
- "id": "a7ac0f18-3f20-4931-ab46-0db84b19db01",
+ "id": "79f43182-ec86-4a7e-af52-fad1b06a651b",
"prevId": "00000000-0000-0000-0000-000000000000",
"version": "7",
"dialect": "postgresql",
"tables": {
- "public.attendance_logs": {
- "name": "attendance_logs",
+ "public.blocks": {
+ "name": "blocks",
"schema": "",
"columns": {
- "attendance_log_id": {
- "name": "attendance_log_id",
- "type": "serial",
- "primaryKey": true,
- "notNull": true
- },
- "staff_id": {
- "name": "staff_id",
+ "training_id": {
+ "name": "training_id",
"type": "integer",
"primaryKey": false,
"notNull": true
},
- "trainee_id": {
- "name": "trainee_id",
+ "block_number": {
+ "name": "block_number",
"type": "integer",
"primaryKey": false,
"notNull": true
},
- "training_id": {
- "name": "training_id",
- "type": "integer",
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
"primaryKey": false,
"notNull": true
},
- "session_id": {
- "name": "session_id",
- "type": "integer",
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
"primaryKey": false,
"notNull": true
},
- "log_type": {
- "name": "log_type",
- "type": "varchar(40)",
+ "hidden": {
+ "name": "hidden",
+ "type": "boolean",
"primaryKey": false,
- "notNull": true
+ "notNull": true,
+ "default": false
},
- "log_time": {
- "name": "log_time",
+ "date": {
+ "name": "date",
"type": "timestamp",
"primaryKey": false,
- "notNull": false,
+ "notNull": true,
"default": "now()"
},
- "log_remarks": {
- "name": "log_remarks",
- "type": "varchar",
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {
- "attendance_logs_session_id_sessions_session_id_fk": {
- "name": "attendance_logs_session_id_sessions_session_id_fk",
- "tableFrom": "attendance_logs",
- "tableTo": "sessions",
- "columnsFrom": [
- "session_id"
- ],
- "columnsTo": [
- "session_id"
- ],
- "onDelete": "no action",
- "onUpdate": "no action"
- },
- "fk_attendance_trainees": {
- "name": "fk_attendance_trainees",
- "tableFrom": "attendance_logs",
- "tableTo": "trainees",
+ "blocks_training_id_trainings_training_id_fk": {
+ "name": "blocks_training_id_trainings_training_id_fk",
+ "tableFrom": "blocks",
+ "tableTo": "trainings",
"columnsFrom": [
- "trainee_id",
"training_id"
],
"columnsTo": [
- "user_id",
"training_id"
],
"onDelete": "no action",
"onUpdate": "no action"
- },
- "fk_attendance_staff": {
- "name": "fk_attendance_staff",
- "tableFrom": "attendance_logs",
- "tableTo": "staff",
- "columnsFrom": [
- "staff_id",
- "training_id"
- ],
- "columnsTo": [
- "user_id",
+ }
+ },
+ "compositePrimaryKeys": {
+ "block_pkey": {
+ "name": "block_pkey",
+ "columns": [
+ "block_number",
"training_id"
- ],
- "onDelete": "no action",
- "onUpdate": "no action"
+ ]
}
},
- "compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
- "public.sessions": {
- "name": "sessions",
+ "public.contests": {
+ "name": "contests",
"schema": "",
"columns": {
- "session_id": {
- "name": "session_id",
+ "training_id": {
+ "name": "training_id",
"type": "integer",
- "primaryKey": true,
+ "primaryKey": false,
"notNull": true
},
- "training_id": {
- "name": "training_id",
- "type": "serial",
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
"primaryKey": false,
"notNull": true
},
- "date_time": {
- "name": "date_time",
- "type": "timestamp",
+ "contest_id": {
+ "name": "contest_id",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "judge": {
+ "name": "judge",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(128)",
"primaryKey": false,
"notNull": true
},
"title": {
"name": "title",
- "type": "varchar",
+ "type": "varchar(128)",
"primaryKey": false,
"notNull": true
},
"description": {
"name": "description",
- "type": "varchar",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "point_per_problem": {
+ "name": "point_per_problem",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "first_points": {
+ "name": "first_points",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "calc_sys": {
+ "name": "calc_sys",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "contests_training_id_block_number_blocks_training_id_block_number_fk": {
+ "name": "contests_training_id_block_number_blocks_training_id_block_number_fk",
+ "tableFrom": "contests",
+ "tableTo": "blocks",
+ "columnsFrom": [
+ "training_id",
+ "block_number"
+ ],
+ "columnsTo": [
+ "training_id",
+ "block_number"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "Contest_pkey": {
+ "name": "Contest_pkey",
+ "columns": [
+ "block_number",
+ "training_id",
+ "contest_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mentor_trainee_history": {
+ "name": "mentor_trainee_history",
+ "schema": "",
+ "columns": {
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
"primaryKey": false,
"notNull": true
+ },
+ "trainee_id": {
+ "name": "trainee_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
}
},
"indexes": {},
"foreignKeys": {
- "sessions_training_id_trainings_training_id_fk": {
- "name": "sessions_training_id_trainings_training_id_fk",
- "tableFrom": "sessions",
+ "mentor_trainee_history_training_id_trainings_training_id_fk": {
+ "name": "mentor_trainee_history_training_id_trainings_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
"tableTo": "trainings",
"columnsFrom": [
"training_id"
@@ -157,11 +246,50 @@
"columnsTo": [
"training_id"
],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainees",
+ "columnsFrom": [
+ "trainee_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
"onDelete": "no action",
"onUpdate": "no action"
}
},
- "compositePrimaryKeys": {},
+ "compositePrimaryKeys": {
+ "mentor_trainee_history_training_id_mentor_id_trainee_id_pk": {
+ "name": "mentor_trainee_history_training_id_mentor_id_trainee_id_pk",
+ "columns": [
+ "training_id",
+ "mentor_id",
+ "trainee_id"
+ ]
+ }
+ },
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
@@ -173,7 +301,7 @@
"columns": {
"user_id": {
"name": "user_id",
- "type": "integer",
+ "type": "uuid",
"primaryKey": false,
"notNull": true
},
@@ -190,8 +318,8 @@
"notNull": false,
"default": false
},
- "co_head": {
- "name": "co_head",
+ "problem_setter": {
+ "name": "problem_setter",
"type": "boolean",
"primaryKey": false,
"notNull": false,
@@ -204,12 +332,25 @@
"notNull": false,
"default": false
},
- "coach": {
- "name": "coach",
+ "co_head": {
+ "name": "co_head",
"type": "boolean",
"primaryKey": false,
"notNull": false,
"default": false
+ },
+ "manager": {
+ "name": "manager",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
}
},
"indexes": {},
@@ -224,8 +365,8 @@
"columnsTo": [
"user_id"
],
- "onDelete": "no action",
- "onUpdate": "no action"
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
},
"staff_training_id_trainings_training_id_fk": {
"name": "staff_training_id_trainings_training_id_fk",
@@ -237,8 +378,8 @@
"columnsTo": [
"training_id"
],
- "onDelete": "no action",
- "onUpdate": "no action"
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
}
},
"compositePrimaryKeys": {
@@ -250,16 +391,7 @@
]
}
},
- "uniqueConstraints": {
- "staff_userId_trainingId_unique": {
- "name": "staff_userId_trainingId_unique",
- "nullsNotDistinct": false,
- "columns": [
- "user_id",
- "training_id"
- ]
- }
- },
+ "uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
@@ -270,7 +402,7 @@
"columns": {
"user_id": {
"name": "user_id",
- "type": "integer",
+ "type": "uuid",
"primaryKey": false,
"notNull": true
},
@@ -279,6 +411,25 @@
"type": "integer",
"primaryKey": false,
"notNull": true
+ },
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_assigned_date": {
+ "name": "mentor_assigned_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "now()"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
}
},
"indexes": {},
@@ -293,8 +444,8 @@
"columnsTo": [
"user_id"
],
- "onDelete": "no action",
- "onUpdate": "no action"
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
},
"trainees_training_id_trainings_training_id_fk": {
"name": "trainees_training_id_trainings_training_id_fk",
@@ -306,6 +457,21 @@
"columnsTo": [
"training_id"
],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "trainees_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
"onDelete": "no action",
"onUpdate": "no action"
}
@@ -336,22 +502,47 @@
},
"head_id": {
"name": "head_id",
- "type": "integer",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "chief_judge": {
+ "name": "chief_judge",
+ "type": "uuid",
"primaryKey": false,
"notNull": true
},
"title": {
"name": "title",
- "type": "varchar",
+ "type": "citext",
"primaryKey": false,
"notNull": true
},
"description": {
"name": "description",
- "type": "varchar",
+ "type": "varchar(512)",
"primaryKey": false,
"notNull": true
},
+ "material": {
+ "name": "material",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "standing": {
+ "name": "standing",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "standing_view": {
+ "name": "standing_view",
+ "type": "json",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[\"name\",\"handle\",\"numberofsolved\",\"mentor\",\"level\"]'::json"
+ },
"start_date": {
"name": "start_date",
"type": "date",
@@ -362,14 +553,21 @@
"name": "duration",
"type": "integer",
"primaryKey": false,
- "notNull": false
+ "notNull": true,
+ "default": 1
},
"status": {
"name": "status",
- "type": "varchar(40)",
+ "type": "varchar(20)",
"primaryKey": false,
"notNull": true,
- "default": "'active'"
+ "default": "'private'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
}
},
"indexes": {},
@@ -384,12 +582,165 @@
"columnsTo": [
"user_id"
],
- "onDelete": "no action",
- "onUpdate": "no action"
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ },
+ "trainings_chief_judge_users_user_id_fk": {
+ "name": "trainings_chief_judge_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "chief_judge"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "trainings_title_unique": {
+ "name": "trainings_title_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "title"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.cities": {
+ "name": "cities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "cities_name_unique": {
+ "name": "cities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.communities": {
+ "name": "communities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "communities_name_unique": {
+ "name": "communities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.countries": {
+ "name": "countries",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "countries_name_unique": {
+ "name": "countries_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.departments": {
+ "name": "departments",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "departments_name_unique": {
+ "name": "departments_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
}
},
- "compositePrimaryKeys": {},
- "uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
@@ -406,7 +757,7 @@
},
"user_id": {
"name": "user_id",
- "type": "integer",
+ "type": "uuid",
"primaryKey": true,
"notNull": true
},
@@ -426,96 +777,107 @@
"checkConstraints": {},
"isRLSEnabled": false
},
- "public.tasks": {
- "name": "tasks",
+ "public.faculties": {
+ "name": "faculties",
"schema": "",
"columns": {
- "task_id": {
- "name": "task_id",
+ "id": {
+ "name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
- "title": {
- "name": "title",
- "type": "varchar",
+ "name": {
+ "name": "name",
+ "type": "citext",
"primaryKey": false,
"notNull": true
- },
- "description": {
- "name": "description",
- "type": "varchar",
- "primaryKey": false,
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "faculties_name_unique": {
+ "name": "faculties_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.institutes": {
+ "name": "institutes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
"notNull": true
},
- "training_id": {
- "name": "training_id",
- "type": "integer",
- "primaryKey": false,
- "notNull": false,
- "default": 0
- },
- "trainee_id": {
- "name": "trainee_id",
- "type": "integer",
+ "name": {
+ "name": "name",
+ "type": "citext",
"primaryKey": false,
"notNull": true
- },
- "staff_id": {
- "name": "staff_id",
- "type": "integer",
- "primaryKey": false,
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "institutes_name_unique": {
+ "name": "institutes_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reset_password": {
+ "name": "reset_password",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
"notNull": true
},
- "state": {
- "name": "state",
- "type": "varchar(40)",
- "primaryKey": false,
- "notNull": true,
- "default": "'pending'"
- },
- "creation_time": {
- "name": "creation_time",
- "type": "timestamp",
+ "token": {
+ "name": "token",
+ "type": "char(25)",
"primaryKey": false,
- "notNull": false,
- "default": "now()"
+ "notNull": true
},
- "deadline": {
- "name": "deadline",
+ "end_at": {
+ "name": "end_at",
"type": "timestamp",
"primaryKey": false,
- "notNull": true
+ "notNull": true,
+ "default": "now() + interval '1 day'"
}
},
"indexes": {},
"foreignKeys": {
- "tasks_trainee_id_training_id_trainees_user_id_training_id_fk": {
- "name": "tasks_trainee_id_training_id_trainees_user_id_training_id_fk",
- "tableFrom": "tasks",
- "tableTo": "trainees",
- "columnsFrom": [
- "trainee_id",
- "training_id"
- ],
- "columnsTo": [
- "user_id",
- "training_id"
- ],
- "onDelete": "no action",
- "onUpdate": "no action"
- },
- "tasks_staff_id_training_id_staff_user_id_training_id_fk": {
- "name": "tasks_staff_id_training_id_staff_user_id_training_id_fk",
- "tableFrom": "tasks",
- "tableTo": "staff",
+ "reset_password_user_id_users_user_id_fk": {
+ "name": "reset_password_user_id_users_user_id_fk",
+ "tableFrom": "reset_password",
+ "tableTo": "users",
"columnsFrom": [
- "staff_id",
- "training_id"
+ "user_id"
],
"columnsTo": [
- "user_id",
- "training_id"
+ "user_id"
],
"onDelete": "no action",
"onUpdate": "no action"
@@ -533,13 +895,14 @@
"columns": {
"user_id": {
"name": "user_id",
- "type": "serial",
+ "type": "uuid",
"primaryKey": true,
- "notNull": true
+ "notNull": true,
+ "default": "gen_random_uuid()"
},
"username": {
"name": "username",
- "type": "varchar",
+ "type": "citext",
"primaryKey": false,
"notNull": true
},
@@ -551,19 +914,25 @@
},
"gmail": {
"name": "gmail",
- "type": "varchar",
+ "type": "citext",
"primaryKey": false,
"notNull": true
},
"cf_handle": {
"name": "cf_handle",
- "type": "varchar",
+ "type": "citext",
"primaryKey": false,
"notNull": true
},
+ "vj_handle": {
+ "name": "vj_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
"phone_number": {
"name": "phone_number",
- "type": "char(11)",
+ "type": "varchar(15)",
"primaryKey": false,
"notNull": true
},
@@ -574,26 +943,11 @@
"notNull": true,
"default": "'user'"
},
- "last_online": {
- "name": "last_online",
- "type": "timestamp",
- "primaryKey": false,
- "notNull": false,
- "default": "now()"
- },
- "is_verified": {
- "name": "is_verified",
- "type": "boolean",
- "primaryKey": false,
- "notNull": true,
- "default": false
- },
"deleted": {
"name": "deleted",
- "type": "boolean",
+ "type": "timestamp",
"primaryKey": false,
- "notNull": true,
- "default": false
+ "notNull": false
}
},
"indexes": {
@@ -616,20 +970,6 @@
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {
- "users_username_unique": {
- "name": "users_username_unique",
- "nullsNotDistinct": false,
- "columns": [
- "username"
- ]
- },
- "users_password_unique": {
- "name": "users_password_unique",
- "nullsNotDistinct": false,
- "columns": [
- "password"
- ]
- },
"users_gmail_unique": {
"name": "users_gmail_unique",
"nullsNotDistinct": false,
@@ -644,11 +984,11 @@
"cf_handle"
]
},
- "users_phoneNumber_unique": {
- "name": "users_phoneNumber_unique",
+ "users_vjHandle_unique": {
+ "name": "users_vjHandle_unique",
"nullsNotDistinct": false,
"columns": [
- "phone_number"
+ "vj_handle"
]
}
},
@@ -662,37 +1002,31 @@
"columns": {
"user_id": {
"name": "user_id",
- "type": "integer",
+ "type": "uuid",
"primaryKey": true,
"notNull": true
},
- "username": {
- "name": "username",
- "type": "varchar",
- "primaryKey": false,
- "notNull": true
- },
- "cf_handle": {
- "name": "cf_handle",
- "type": "varchar",
+ "institute_id": {
+ "name": "institute_id",
+ "type": "integer",
"primaryKey": false,
- "notNull": true
+ "notNull": false
},
- "university": {
- "name": "university",
- "type": "varchar",
+ "faculty_id": {
+ "name": "faculty_id",
+ "type": "integer",
"primaryKey": false,
"notNull": false
},
- "faculty": {
- "name": "faculty",
- "type": "varchar",
+ "department_id": {
+ "name": "department_id",
+ "type": "integer",
"primaryKey": false,
"notNull": false
},
- "department": {
- "name": "department",
- "type": "varchar",
+ "community_id": {
+ "name": "community_id",
+ "type": "integer",
"primaryKey": false,
"notNull": false
},
@@ -702,93 +1036,69 @@
"primaryKey": false,
"notNull": false
},
- "graduation_year": {
- "name": "graduation_year",
+ "graduation_date": {
+ "name": "graduation_date",
"type": "date",
"primaryKey": false,
"notNull": false
},
- "vjudge": {
- "name": "vjudge",
- "type": "varchar",
- "primaryKey": false,
- "notNull": false
- },
"atcoder": {
"name": "atcoder",
- "type": "varchar",
- "primaryKey": false,
- "notNull": false
- },
- "topcoder": {
- "name": "topcoder",
- "type": "varchar",
- "primaryKey": false,
- "notNull": false
- },
- "spoj": {
- "name": "spoj",
- "type": "varchar",
+ "type": "citext",
"primaryKey": false,
"notNull": false
},
"codechef": {
"name": "codechef",
- "type": "varchar",
- "primaryKey": false,
- "notNull": false
- },
- "csacademy": {
- "name": "csacademy",
- "type": "varchar",
+ "type": "citext",
"primaryKey": false,
"notNull": false
},
"leetcode": {
"name": "leetcode",
- "type": "varchar",
+ "type": "citext",
"primaryKey": false,
"notNull": false
},
"cses": {
"name": "cses",
- "type": "varchar",
+ "type": "citext",
"primaryKey": false,
"notNull": false
},
- "name_en_first": {
- "name": "name_en_first",
- "type": "varchar",
+ "first_name_en": {
+ "name": "first_name_en",
+ "type": "varchar(20)",
"primaryKey": false,
"notNull": false
},
- "name_en_last": {
- "name": "name_en_last",
- "type": "varchar",
+ "last_name_en": {
+ "name": "last_name_en",
+ "type": "varchar(20)",
"primaryKey": false,
"notNull": false
},
"name_ar_1": {
"name": "name_ar_1",
- "type": "varchar",
+ "type": "varchar(20)",
"primaryKey": false,
"notNull": false
},
"name_ar_2": {
"name": "name_ar_2",
- "type": "varchar",
+ "type": "varchar(20)",
"primaryKey": false,
"notNull": false
},
"name_ar_3": {
"name": "name_ar_3",
- "type": "varchar",
+ "type": "varchar(20)",
"primaryKey": false,
"notNull": false
},
"name_ar_4": {
"name": "name_ar_4",
- "type": "varchar",
+ "type": "varchar(20)",
"primaryKey": false,
"notNull": false
},
@@ -798,15 +1108,15 @@
"primaryKey": false,
"notNull": false
},
- "country": {
- "name": "country",
- "type": "varchar",
+ "country_id": {
+ "name": "country_id",
+ "type": "integer",
"primaryKey": false,
"notNull": false
},
- "city": {
- "name": "city",
- "type": "varchar",
+ "city_id": {
+ "name": "city_id",
+ "type": "integer",
"primaryKey": false,
"notNull": false
},
@@ -818,52 +1128,62 @@
},
"image_url": {
"name": "image_url",
- "type": "varchar",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "whatsapp_phone_number": {
+ "name": "whatsapp_phone_number",
+ "type": "varchar(15)",
"primaryKey": false,
"notNull": false
},
"facebook": {
"name": "facebook",
- "type": "varchar",
+ "type": "varchar(128)",
"primaryKey": false,
"notNull": false
},
"linked_in": {
"name": "linked_in",
- "type": "varchar",
+ "type": "varchar(30)",
"primaryKey": false,
"notNull": false
},
"twitter": {
"name": "twitter",
- "type": "varchar",
+ "type": "varchar(16)",
"primaryKey": false,
"notNull": false
},
"github": {
"name": "github",
- "type": "varchar",
+ "type": "varchar(40)",
"primaryKey": false,
"notNull": false
+ },
+ "telegram": {
+ "name": "telegram",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "visibility_mask": {
+ "name": "visibility_mask",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "registration_date": {
+ "name": "registration_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "now()"
}
},
- "indexes": {
- "users_full_data_username_idx": {
- "name": "users_full_data_username_idx",
- "columns": [
- {
- "expression": "username",
- "isExpression": false,
- "asc": true,
- "nulls": "last"
- }
- ],
- "isUnique": true,
- "concurrently": false,
- "method": "btree",
- "with": {}
- }
- },
+ "indexes": {},
"foreignKeys": {
"users_full_data_user_id_users_user_id_fk": {
"name": "users_full_data_user_id_users_user_id_fk",
@@ -878,35 +1198,95 @@
"onDelete": "cascade",
"onUpdate": "cascade"
},
- "users_full_data_username_users_username_fk": {
- "name": "users_full_data_username_users_username_fk",
+ "users_full_data_institute_id_institutes_id_fk": {
+ "name": "users_full_data_institute_id_institutes_id_fk",
"tableFrom": "users_full_data",
- "tableTo": "users",
+ "tableTo": "institutes",
"columnsFrom": [
- "username"
+ "institute_id"
],
"columnsTo": [
- "username"
+ "id"
],
- "onDelete": "cascade",
+ "onDelete": "set null",
"onUpdate": "cascade"
},
- "users_full_data_cf_handle_users_cf_handle_fk": {
- "name": "users_full_data_cf_handle_users_cf_handle_fk",
+ "users_full_data_faculty_id_faculties_id_fk": {
+ "name": "users_full_data_faculty_id_faculties_id_fk",
"tableFrom": "users_full_data",
- "tableTo": "users",
+ "tableTo": "faculties",
"columnsFrom": [
- "cf_handle"
+ "faculty_id"
],
"columnsTo": [
- "cf_handle"
+ "id"
],
- "onDelete": "cascade",
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_department_id_departments_id_fk": {
+ "name": "users_full_data_department_id_departments_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "departments",
+ "columnsFrom": [
+ "department_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_community_id_communities_id_fk": {
+ "name": "users_full_data_community_id_communities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "communities",
+ "columnsFrom": [
+ "community_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_country_id_countries_id_fk": {
+ "name": "users_full_data_country_id_countries_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "countries",
+ "columnsFrom": [
+ "country_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_city_id_cities_id_fk": {
+ "name": "users_full_data_city_id_cities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "cities",
+ "columnsFrom": [
+ "city_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
"onUpdate": "cascade"
}
},
"compositePrimaryKeys": {},
- "uniqueConstraints": {},
+ "uniqueConstraints": {
+ "users_full_data_nationalId_unique": {
+ "name": "users_full_data_nationalId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "national_id"
+ ]
+ }
+ },
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json
new file mode 100644
index 00000000..c7fdeda0
--- /dev/null
+++ b/drizzle/meta/0001_snapshot.json
@@ -0,0 +1,1336 @@
+{
+ "id": "1e98498c-0dea-41f7-9470-e4dcda771207",
+ "prevId": "79f43182-ec86-4a7e-af52-fad1b06a651b",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.blocks": {
+ "name": "blocks",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hidden": {
+ "name": "hidden",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "blocks_training_id_trainings_training_id_fk": {
+ "name": "blocks_training_id_trainings_training_id_fk",
+ "tableFrom": "blocks",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "block_pkey": {
+ "name": "block_pkey",
+ "columns": [
+ "block_number",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.contests": {
+ "name": "contests",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "contest_id": {
+ "name": "contest_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "judge": {
+ "name": "judge",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "point_per_problem": {
+ "name": "point_per_problem",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 20
+ },
+ "first_points": {
+ "name": "first_points",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1000
+ },
+ "calc_sys": {
+ "name": "calc_sys",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'90%'"
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "contests_training_id_block_number_blocks_training_id_block_number_fk": {
+ "name": "contests_training_id_block_number_blocks_training_id_block_number_fk",
+ "tableFrom": "contests",
+ "tableTo": "blocks",
+ "columnsFrom": [
+ "training_id",
+ "block_number"
+ ],
+ "columnsTo": [
+ "training_id",
+ "block_number"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "Contest_pkey": {
+ "name": "Contest_pkey",
+ "columns": [
+ "block_number",
+ "training_id",
+ "contest_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mentor_trainee_history": {
+ "name": "mentor_trainee_history",
+ "schema": "",
+ "columns": {
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "trainee_id": {
+ "name": "trainee_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mentor_trainee_history_training_id_trainings_training_id_fk": {
+ "name": "mentor_trainee_history_training_id_trainings_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainees",
+ "columnsFrom": [
+ "trainee_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "mentor_trainee_history_training_id_mentor_id_trainee_id_end_date_pk": {
+ "name": "mentor_trainee_history_training_id_mentor_id_trainee_id_end_date_pk",
+ "columns": [
+ "training_id",
+ "mentor_id",
+ "trainee_id",
+ "end_date"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.staff": {
+ "name": "staff",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor": {
+ "name": "mentor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "problem_setter": {
+ "name": "problem_setter",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "instructor": {
+ "name": "instructor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "co_head": {
+ "name": "co_head",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "manager": {
+ "name": "manager",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "mentor_idx": {
+ "name": "mentor_idx",
+ "columns": [
+ {
+ "expression": "mentor",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "staff_user_id_users_user_id_fk": {
+ "name": "staff_user_id_users_user_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "staff_training_id_trainings_training_id_fk": {
+ "name": "staff_training_id_trainings_training_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {
+ "staff_pk": {
+ "name": "staff_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainees": {
+ "name": "trainees",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_assigned_date": {
+ "name": "mentor_assigned_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainees_user_id_users_user_id_fk": {
+ "name": "trainees_user_id_users_user_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_training_id_trainings_training_id_fk": {
+ "name": "trainees_training_id_trainings_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "trainees_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "trainees_user_id_training_id_pk": {
+ "name": "trainees_user_id_training_id_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainings": {
+ "name": "trainings",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "head_id": {
+ "name": "head_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "chief_judge": {
+ "name": "chief_judge",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "material": {
+ "name": "material",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "standing": {
+ "name": "standing",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "standing_view": {
+ "name": "standing_view",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[\"name\",\"handle\",\"numberofsolved\",\"mentor\",\"level\"]'::jsonb"
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "duration": {
+ "name": "duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "status": {
+ "name": "status",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'private'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainings_head_id_users_user_id_fk": {
+ "name": "trainings_head_id_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "head_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ },
+ "trainings_chief_judge_users_user_id_fk": {
+ "name": "trainings_chief_judge_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "chief_judge"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "trainings_title_unique": {
+ "name": "trainings_title_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "title"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.cities": {
+ "name": "cities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "cities_name_unique": {
+ "name": "cities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.communities": {
+ "name": "communities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "communities_name_unique": {
+ "name": "communities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.countries": {
+ "name": "countries",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "countries_name_unique": {
+ "name": "countries_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.departments": {
+ "name": "departments",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "departments_name_unique": {
+ "name": "departments_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.email_auth": {
+ "name": "email_auth",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '7 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.faculties": {
+ "name": "faculties",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "faculties_name_unique": {
+ "name": "faculties_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.institutes": {
+ "name": "institutes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "institutes_name_unique": {
+ "name": "institutes_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reset_password": {
+ "name": "reset_password",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "char(25)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_at": {
+ "name": "end_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '1 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "reset_password_user_id_users_user_id_fk": {
+ "name": "reset_password_user_id_users_user_id_fk",
+ "tableFrom": "reset_password",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users": {
+ "name": "users",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "username": {
+ "name": "username",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "gmail": {
+ "name": "gmail",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cf_handle": {
+ "name": "cf_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "vj_handle": {
+ "name": "vj_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone_number": {
+ "name": "phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'user'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "users_username_idx": {
+ "name": "users_username_idx",
+ "columns": [
+ {
+ "expression": "username",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_username_unique": {
+ "name": "users_username_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "username"
+ ]
+ },
+ "users_gmail_unique": {
+ "name": "users_gmail_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "gmail"
+ ]
+ },
+ "users_cfHandle_unique": {
+ "name": "users_cfHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "cf_handle"
+ ]
+ },
+ "users_vjHandle_unique": {
+ "name": "users_vjHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "vj_handle"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users_full_data": {
+ "name": "users_full_data",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "institute_id": {
+ "name": "institute_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "faculty_id": {
+ "name": "faculty_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "department_id": {
+ "name": "department_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "community_id": {
+ "name": "community_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "academic_year": {
+ "name": "academic_year",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "graduation_date": {
+ "name": "graduation_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "atcoder": {
+ "name": "atcoder",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "codechef": {
+ "name": "codechef",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "leetcode": {
+ "name": "leetcode",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cses": {
+ "name": "cses",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "first_name_en": {
+ "name": "first_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_name_en": {
+ "name": "last_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_1": {
+ "name": "name_ar_1",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_2": {
+ "name": "name_ar_2",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_3": {
+ "name": "name_ar_3",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_4": {
+ "name": "name_ar_4",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "national_id": {
+ "name": "national_id",
+ "type": "char(14)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "country_id": {
+ "name": "country_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "city_id": {
+ "name": "city_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_male": {
+ "name": "is_male",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image_url": {
+ "name": "image_url",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "whatsapp_phone_number": {
+ "name": "whatsapp_phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "facebook": {
+ "name": "facebook",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linked_in": {
+ "name": "linked_in",
+ "type": "varchar(30)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "twitter": {
+ "name": "twitter",
+ "type": "varchar(16)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github": {
+ "name": "github",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "telegram": {
+ "name": "telegram",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "visibility_mask": {
+ "name": "visibility_mask",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "registration_date": {
+ "name": "registration_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "users_full_data_user_id_users_user_id_fk": {
+ "name": "users_full_data_user_id_users_user_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_institute_id_institutes_id_fk": {
+ "name": "users_full_data_institute_id_institutes_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "institutes",
+ "columnsFrom": [
+ "institute_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_faculty_id_faculties_id_fk": {
+ "name": "users_full_data_faculty_id_faculties_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "faculties",
+ "columnsFrom": [
+ "faculty_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_department_id_departments_id_fk": {
+ "name": "users_full_data_department_id_departments_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "departments",
+ "columnsFrom": [
+ "department_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_community_id_communities_id_fk": {
+ "name": "users_full_data_community_id_communities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "communities",
+ "columnsFrom": [
+ "community_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_country_id_countries_id_fk": {
+ "name": "users_full_data_country_id_countries_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "countries",
+ "columnsFrom": [
+ "country_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_city_id_cities_id_fk": {
+ "name": "users_full_data_city_id_cities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "cities",
+ "columnsFrom": [
+ "city_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_full_data_nationalId_unique": {
+ "name": "users_full_data_nationalId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "national_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/drizzle/meta/0002_snapshot.json b/drizzle/meta/0002_snapshot.json
new file mode 100644
index 00000000..62a83edd
--- /dev/null
+++ b/drizzle/meta/0002_snapshot.json
@@ -0,0 +1,1334 @@
+{
+ "id": "45a3a79d-1756-4e4d-adde-4f6199bcb07c",
+ "prevId": "1e98498c-0dea-41f7-9470-e4dcda771207",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.blocks": {
+ "name": "blocks",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hidden": {
+ "name": "hidden",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "blocks_training_id_trainings_training_id_fk": {
+ "name": "blocks_training_id_trainings_training_id_fk",
+ "tableFrom": "blocks",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "block_pkey": {
+ "name": "block_pkey",
+ "columns": [
+ "block_number",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.contests": {
+ "name": "contests",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "contest_id": {
+ "name": "contest_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "judge": {
+ "name": "judge",
+ "type": "varchar(2)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "point_per_problem": {
+ "name": "point_per_problem",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 20
+ },
+ "first_points": {
+ "name": "first_points",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1000
+ },
+ "calc_sys": {
+ "name": "calc_sys",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'90%'"
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "contests_training_id_block_number_blocks_training_id_block_number_fk": {
+ "name": "contests_training_id_block_number_blocks_training_id_block_number_fk",
+ "tableFrom": "contests",
+ "tableTo": "blocks",
+ "columnsFrom": [
+ "training_id",
+ "block_number"
+ ],
+ "columnsTo": [
+ "training_id",
+ "block_number"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "Contest_pkey": {
+ "name": "Contest_pkey",
+ "columns": [
+ "block_number",
+ "training_id",
+ "contest_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mentor_trainee_history": {
+ "name": "mentor_trainee_history",
+ "schema": "",
+ "columns": {
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "trainee_id": {
+ "name": "trainee_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mentor_trainee_history_training_id_trainings_training_id_fk": {
+ "name": "mentor_trainee_history_training_id_trainings_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainees",
+ "columnsFrom": [
+ "trainee_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk": {
+ "name": "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk",
+ "columns": [
+ "training_id",
+ "mentor_id",
+ "trainee_id",
+ "start_date"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.staff": {
+ "name": "staff",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor": {
+ "name": "mentor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "problem_setter": {
+ "name": "problem_setter",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "instructor": {
+ "name": "instructor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "co_head": {
+ "name": "co_head",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "manager": {
+ "name": "manager",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "mentor_idx": {
+ "name": "mentor_idx",
+ "columns": [
+ {
+ "expression": "mentor",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "staff_user_id_users_user_id_fk": {
+ "name": "staff_user_id_users_user_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "staff_training_id_trainings_training_id_fk": {
+ "name": "staff_training_id_trainings_training_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {
+ "staff_pk": {
+ "name": "staff_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainees": {
+ "name": "trainees",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_assigned_date": {
+ "name": "mentor_assigned_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainees_user_id_users_user_id_fk": {
+ "name": "trainees_user_id_users_user_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_training_id_trainings_training_id_fk": {
+ "name": "trainees_training_id_trainings_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "trainees_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "trainees_user_id_training_id_pk": {
+ "name": "trainees_user_id_training_id_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainings": {
+ "name": "trainings",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "head_id": {
+ "name": "head_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "chief_judge": {
+ "name": "chief_judge",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "material": {
+ "name": "material",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "standing": {
+ "name": "standing",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "standing_view": {
+ "name": "standing_view",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[\"name\",\"handle\",\"numberofsolved\",\"mentor\",\"level\"]'::jsonb"
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "duration": {
+ "name": "duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "status": {
+ "name": "status",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'private'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainings_head_id_users_user_id_fk": {
+ "name": "trainings_head_id_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "head_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ },
+ "trainings_chief_judge_users_user_id_fk": {
+ "name": "trainings_chief_judge_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "chief_judge"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "trainings_title_unique": {
+ "name": "trainings_title_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "title"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.cities": {
+ "name": "cities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "cities_name_unique": {
+ "name": "cities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.communities": {
+ "name": "communities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "communities_name_unique": {
+ "name": "communities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.countries": {
+ "name": "countries",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "countries_name_unique": {
+ "name": "countries_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.departments": {
+ "name": "departments",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "departments_name_unique": {
+ "name": "departments_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.email_auth": {
+ "name": "email_auth",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '7 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.faculties": {
+ "name": "faculties",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "faculties_name_unique": {
+ "name": "faculties_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.institutes": {
+ "name": "institutes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "institutes_name_unique": {
+ "name": "institutes_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reset_password": {
+ "name": "reset_password",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "char(25)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_at": {
+ "name": "end_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '1 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "reset_password_user_id_users_user_id_fk": {
+ "name": "reset_password_user_id_users_user_id_fk",
+ "tableFrom": "reset_password",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users": {
+ "name": "users",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "username": {
+ "name": "username",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "gmail": {
+ "name": "gmail",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cf_handle": {
+ "name": "cf_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "vj_handle": {
+ "name": "vj_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone_number": {
+ "name": "phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'user'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "users_username_idx": {
+ "name": "users_username_idx",
+ "columns": [
+ {
+ "expression": "username",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_username_unique": {
+ "name": "users_username_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "username"
+ ]
+ },
+ "users_gmail_unique": {
+ "name": "users_gmail_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "gmail"
+ ]
+ },
+ "users_cfHandle_unique": {
+ "name": "users_cfHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "cf_handle"
+ ]
+ },
+ "users_vjHandle_unique": {
+ "name": "users_vjHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "vj_handle"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users_full_data": {
+ "name": "users_full_data",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "institute_id": {
+ "name": "institute_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "faculty_id": {
+ "name": "faculty_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "department_id": {
+ "name": "department_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "community_id": {
+ "name": "community_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "academic_year": {
+ "name": "academic_year",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "graduation_date": {
+ "name": "graduation_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "atcoder": {
+ "name": "atcoder",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "codechef": {
+ "name": "codechef",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "leetcode": {
+ "name": "leetcode",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cses": {
+ "name": "cses",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "first_name_en": {
+ "name": "first_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_name_en": {
+ "name": "last_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_1": {
+ "name": "name_ar_1",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_2": {
+ "name": "name_ar_2",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_3": {
+ "name": "name_ar_3",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_4": {
+ "name": "name_ar_4",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "national_id": {
+ "name": "national_id",
+ "type": "char(14)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "country_id": {
+ "name": "country_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "city_id": {
+ "name": "city_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_male": {
+ "name": "is_male",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image_url": {
+ "name": "image_url",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "whatsapp_phone_number": {
+ "name": "whatsapp_phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "facebook": {
+ "name": "facebook",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linked_in": {
+ "name": "linked_in",
+ "type": "varchar(30)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "twitter": {
+ "name": "twitter",
+ "type": "varchar(16)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github": {
+ "name": "github",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "telegram": {
+ "name": "telegram",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "visibility_mask": {
+ "name": "visibility_mask",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "registration_date": {
+ "name": "registration_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "users_full_data_user_id_users_user_id_fk": {
+ "name": "users_full_data_user_id_users_user_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_institute_id_institutes_id_fk": {
+ "name": "users_full_data_institute_id_institutes_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "institutes",
+ "columnsFrom": [
+ "institute_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_faculty_id_faculties_id_fk": {
+ "name": "users_full_data_faculty_id_faculties_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "faculties",
+ "columnsFrom": [
+ "faculty_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_department_id_departments_id_fk": {
+ "name": "users_full_data_department_id_departments_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "departments",
+ "columnsFrom": [
+ "department_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_community_id_communities_id_fk": {
+ "name": "users_full_data_community_id_communities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "communities",
+ "columnsFrom": [
+ "community_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_country_id_countries_id_fk": {
+ "name": "users_full_data_country_id_countries_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "countries",
+ "columnsFrom": [
+ "country_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_city_id_cities_id_fk": {
+ "name": "users_full_data_city_id_cities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "cities",
+ "columnsFrom": [
+ "city_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_full_data_nationalId_unique": {
+ "name": "users_full_data_nationalId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "national_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/drizzle/meta/0003_snapshot.json b/drizzle/meta/0003_snapshot.json
new file mode 100644
index 00000000..33500cfe
--- /dev/null
+++ b/drizzle/meta/0003_snapshot.json
@@ -0,0 +1,1335 @@
+{
+ "id": "14a5f612-30a1-4dff-b0bf-02f28fcb6132",
+ "prevId": "45a3a79d-1756-4e4d-adde-4f6199bcb07c",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.blocks": {
+ "name": "blocks",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hidden": {
+ "name": "hidden",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "material": {
+ "name": "material",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "blocks_training_id_trainings_training_id_fk": {
+ "name": "blocks_training_id_trainings_training_id_fk",
+ "tableFrom": "blocks",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "block_pkey": {
+ "name": "block_pkey",
+ "columns": [
+ "block_number",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.contests": {
+ "name": "contests",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "contest_id": {
+ "name": "contest_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "judge": {
+ "name": "judge",
+ "type": "varchar(2)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "point_per_problem": {
+ "name": "point_per_problem",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 20
+ },
+ "first_points": {
+ "name": "first_points",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1000
+ },
+ "calc_sys": {
+ "name": "calc_sys",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'90%'"
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "contests_training_id_block_number_blocks_training_id_block_number_fk": {
+ "name": "contests_training_id_block_number_blocks_training_id_block_number_fk",
+ "tableFrom": "contests",
+ "tableTo": "blocks",
+ "columnsFrom": [
+ "training_id",
+ "block_number"
+ ],
+ "columnsTo": [
+ "training_id",
+ "block_number"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "Contest_pkey": {
+ "name": "Contest_pkey",
+ "columns": [
+ "block_number",
+ "training_id",
+ "contest_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mentor_trainee_history": {
+ "name": "mentor_trainee_history",
+ "schema": "",
+ "columns": {
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "trainee_id": {
+ "name": "trainee_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mentor_trainee_history_training_id_trainings_training_id_fk": {
+ "name": "mentor_trainee_history_training_id_trainings_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainees",
+ "columnsFrom": [
+ "trainee_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk": {
+ "name": "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk",
+ "columns": [
+ "training_id",
+ "mentor_id",
+ "trainee_id",
+ "start_date"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.staff": {
+ "name": "staff",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor": {
+ "name": "mentor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "problem_setter": {
+ "name": "problem_setter",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "instructor": {
+ "name": "instructor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "co_head": {
+ "name": "co_head",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "manager": {
+ "name": "manager",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "mentor_idx": {
+ "name": "mentor_idx",
+ "columns": [
+ {
+ "expression": "mentor",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "staff_user_id_users_user_id_fk": {
+ "name": "staff_user_id_users_user_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "staff_training_id_trainings_training_id_fk": {
+ "name": "staff_training_id_trainings_training_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {
+ "staff_pk": {
+ "name": "staff_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainees": {
+ "name": "trainees",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_assigned_date": {
+ "name": "mentor_assigned_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainees_user_id_users_user_id_fk": {
+ "name": "trainees_user_id_users_user_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_training_id_trainings_training_id_fk": {
+ "name": "trainees_training_id_trainings_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "trainees_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "trainees_user_id_training_id_pk": {
+ "name": "trainees_user_id_training_id_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainings": {
+ "name": "trainings",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "head_id": {
+ "name": "head_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "chief_judge": {
+ "name": "chief_judge",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "standing": {
+ "name": "standing",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "standing_view": {
+ "name": "standing_view",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[\"name\",\"handle\",\"numberofsolved\",\"mentor\",\"level\"]'::jsonb"
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "duration": {
+ "name": "duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "status": {
+ "name": "status",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'private'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainings_head_id_users_user_id_fk": {
+ "name": "trainings_head_id_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "head_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ },
+ "trainings_chief_judge_users_user_id_fk": {
+ "name": "trainings_chief_judge_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "chief_judge"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "trainings_title_unique": {
+ "name": "trainings_title_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "title"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.cities": {
+ "name": "cities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "cities_name_unique": {
+ "name": "cities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.communities": {
+ "name": "communities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "communities_name_unique": {
+ "name": "communities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.countries": {
+ "name": "countries",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "countries_name_unique": {
+ "name": "countries_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.departments": {
+ "name": "departments",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "departments_name_unique": {
+ "name": "departments_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.email_auth": {
+ "name": "email_auth",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '7 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.faculties": {
+ "name": "faculties",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "faculties_name_unique": {
+ "name": "faculties_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.institutes": {
+ "name": "institutes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "institutes_name_unique": {
+ "name": "institutes_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reset_password": {
+ "name": "reset_password",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "char(25)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_at": {
+ "name": "end_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '1 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "reset_password_user_id_users_user_id_fk": {
+ "name": "reset_password_user_id_users_user_id_fk",
+ "tableFrom": "reset_password",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users": {
+ "name": "users",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "username": {
+ "name": "username",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "gmail": {
+ "name": "gmail",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cf_handle": {
+ "name": "cf_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "vj_handle": {
+ "name": "vj_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone_number": {
+ "name": "phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'user'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "users_username_idx": {
+ "name": "users_username_idx",
+ "columns": [
+ {
+ "expression": "username",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_username_unique": {
+ "name": "users_username_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "username"
+ ]
+ },
+ "users_gmail_unique": {
+ "name": "users_gmail_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "gmail"
+ ]
+ },
+ "users_cfHandle_unique": {
+ "name": "users_cfHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "cf_handle"
+ ]
+ },
+ "users_vjHandle_unique": {
+ "name": "users_vjHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "vj_handle"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users_full_data": {
+ "name": "users_full_data",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "institute_id": {
+ "name": "institute_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "faculty_id": {
+ "name": "faculty_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "department_id": {
+ "name": "department_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "community_id": {
+ "name": "community_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "academic_year": {
+ "name": "academic_year",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "graduation_date": {
+ "name": "graduation_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "atcoder": {
+ "name": "atcoder",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "codechef": {
+ "name": "codechef",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "leetcode": {
+ "name": "leetcode",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cses": {
+ "name": "cses",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "first_name_en": {
+ "name": "first_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_name_en": {
+ "name": "last_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_1": {
+ "name": "name_ar_1",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_2": {
+ "name": "name_ar_2",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_3": {
+ "name": "name_ar_3",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_4": {
+ "name": "name_ar_4",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "national_id": {
+ "name": "national_id",
+ "type": "char(14)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "country_id": {
+ "name": "country_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "city_id": {
+ "name": "city_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_male": {
+ "name": "is_male",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image_url": {
+ "name": "image_url",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "whatsapp_phone_number": {
+ "name": "whatsapp_phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "facebook": {
+ "name": "facebook",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linked_in": {
+ "name": "linked_in",
+ "type": "varchar(30)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "twitter": {
+ "name": "twitter",
+ "type": "varchar(16)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github": {
+ "name": "github",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "telegram": {
+ "name": "telegram",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "visibility_mask": {
+ "name": "visibility_mask",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "registration_date": {
+ "name": "registration_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "users_full_data_user_id_users_user_id_fk": {
+ "name": "users_full_data_user_id_users_user_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_institute_id_institutes_id_fk": {
+ "name": "users_full_data_institute_id_institutes_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "institutes",
+ "columnsFrom": [
+ "institute_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_faculty_id_faculties_id_fk": {
+ "name": "users_full_data_faculty_id_faculties_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "faculties",
+ "columnsFrom": [
+ "faculty_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_department_id_departments_id_fk": {
+ "name": "users_full_data_department_id_departments_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "departments",
+ "columnsFrom": [
+ "department_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_community_id_communities_id_fk": {
+ "name": "users_full_data_community_id_communities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "communities",
+ "columnsFrom": [
+ "community_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_country_id_countries_id_fk": {
+ "name": "users_full_data_country_id_countries_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "countries",
+ "columnsFrom": [
+ "country_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_city_id_cities_id_fk": {
+ "name": "users_full_data_city_id_cities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "cities",
+ "columnsFrom": [
+ "city_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_full_data_nationalId_unique": {
+ "name": "users_full_data_nationalId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "national_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/drizzle/meta/0004_snapshot.json b/drizzle/meta/0004_snapshot.json
new file mode 100644
index 00000000..7caba9d0
--- /dev/null
+++ b/drizzle/meta/0004_snapshot.json
@@ -0,0 +1,1341 @@
+{
+ "id": "1aee799a-ccb3-429a-81b2-51a9673ef345",
+ "prevId": "14a5f612-30a1-4dff-b0bf-02f28fcb6132",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.blocks": {
+ "name": "blocks",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hidden": {
+ "name": "hidden",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "material": {
+ "name": "material",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "blocks_training_id_trainings_training_id_fk": {
+ "name": "blocks_training_id_trainings_training_id_fk",
+ "tableFrom": "blocks",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "block_pkey": {
+ "name": "block_pkey",
+ "columns": [
+ "block_number",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.contests": {
+ "name": "contests",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "contest_id": {
+ "name": "contest_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "judge": {
+ "name": "judge",
+ "type": "varchar(2)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "standing": {
+ "name": "standing",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "point_per_problem": {
+ "name": "point_per_problem",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 20
+ },
+ "first_points": {
+ "name": "first_points",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1000
+ },
+ "calc_sys": {
+ "name": "calc_sys",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'90%'"
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "contests_training_id_block_number_blocks_training_id_block_number_fk": {
+ "name": "contests_training_id_block_number_blocks_training_id_block_number_fk",
+ "tableFrom": "contests",
+ "tableTo": "blocks",
+ "columnsFrom": [
+ "training_id",
+ "block_number"
+ ],
+ "columnsTo": [
+ "training_id",
+ "block_number"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "Contest_pkey": {
+ "name": "Contest_pkey",
+ "columns": [
+ "block_number",
+ "training_id",
+ "contest_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mentor_trainee_history": {
+ "name": "mentor_trainee_history",
+ "schema": "",
+ "columns": {
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "trainee_id": {
+ "name": "trainee_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mentor_trainee_history_training_id_trainings_training_id_fk": {
+ "name": "mentor_trainee_history_training_id_trainings_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainees",
+ "columnsFrom": [
+ "trainee_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk": {
+ "name": "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk",
+ "columns": [
+ "training_id",
+ "mentor_id",
+ "trainee_id",
+ "start_date"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.staff": {
+ "name": "staff",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor": {
+ "name": "mentor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "problem_setter": {
+ "name": "problem_setter",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "instructor": {
+ "name": "instructor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "co_head": {
+ "name": "co_head",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "manager": {
+ "name": "manager",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "mentor_idx": {
+ "name": "mentor_idx",
+ "columns": [
+ {
+ "expression": "mentor",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "staff_user_id_users_user_id_fk": {
+ "name": "staff_user_id_users_user_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "staff_training_id_trainings_training_id_fk": {
+ "name": "staff_training_id_trainings_training_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {
+ "staff_pk": {
+ "name": "staff_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainees": {
+ "name": "trainees",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_assigned_date": {
+ "name": "mentor_assigned_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainees_user_id_users_user_id_fk": {
+ "name": "trainees_user_id_users_user_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_training_id_trainings_training_id_fk": {
+ "name": "trainees_training_id_trainings_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "trainees_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "trainees_user_id_training_id_pk": {
+ "name": "trainees_user_id_training_id_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainings": {
+ "name": "trainings",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "head_id": {
+ "name": "head_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "chief_judge": {
+ "name": "chief_judge",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "standing": {
+ "name": "standing",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "standing_view": {
+ "name": "standing_view",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[\"name\",\"handle\",\"numberofsolved\",\"mentor\",\"level\"]'::jsonb"
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "duration": {
+ "name": "duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "status": {
+ "name": "status",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'private'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainings_head_id_users_user_id_fk": {
+ "name": "trainings_head_id_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "head_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ },
+ "trainings_chief_judge_users_user_id_fk": {
+ "name": "trainings_chief_judge_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "chief_judge"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "trainings_title_unique": {
+ "name": "trainings_title_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "title"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.cities": {
+ "name": "cities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "cities_name_unique": {
+ "name": "cities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.communities": {
+ "name": "communities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "communities_name_unique": {
+ "name": "communities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.countries": {
+ "name": "countries",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "countries_name_unique": {
+ "name": "countries_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.departments": {
+ "name": "departments",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "departments_name_unique": {
+ "name": "departments_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.email_auth": {
+ "name": "email_auth",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '7 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.faculties": {
+ "name": "faculties",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "faculties_name_unique": {
+ "name": "faculties_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.institutes": {
+ "name": "institutes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "institutes_name_unique": {
+ "name": "institutes_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reset_password": {
+ "name": "reset_password",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "char(25)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_at": {
+ "name": "end_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '1 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "reset_password_user_id_users_user_id_fk": {
+ "name": "reset_password_user_id_users_user_id_fk",
+ "tableFrom": "reset_password",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users": {
+ "name": "users",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "username": {
+ "name": "username",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "gmail": {
+ "name": "gmail",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cf_handle": {
+ "name": "cf_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "vj_handle": {
+ "name": "vj_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone_number": {
+ "name": "phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'user'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "users_username_idx": {
+ "name": "users_username_idx",
+ "columns": [
+ {
+ "expression": "username",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_username_unique": {
+ "name": "users_username_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "username"
+ ]
+ },
+ "users_gmail_unique": {
+ "name": "users_gmail_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "gmail"
+ ]
+ },
+ "users_cfHandle_unique": {
+ "name": "users_cfHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "cf_handle"
+ ]
+ },
+ "users_vjHandle_unique": {
+ "name": "users_vjHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "vj_handle"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users_full_data": {
+ "name": "users_full_data",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "institute_id": {
+ "name": "institute_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "faculty_id": {
+ "name": "faculty_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "department_id": {
+ "name": "department_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "community_id": {
+ "name": "community_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "academic_year": {
+ "name": "academic_year",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "graduation_date": {
+ "name": "graduation_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "atcoder": {
+ "name": "atcoder",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "codechef": {
+ "name": "codechef",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "leetcode": {
+ "name": "leetcode",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cses": {
+ "name": "cses",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "first_name_en": {
+ "name": "first_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_name_en": {
+ "name": "last_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_1": {
+ "name": "name_ar_1",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_2": {
+ "name": "name_ar_2",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_3": {
+ "name": "name_ar_3",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_4": {
+ "name": "name_ar_4",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "national_id": {
+ "name": "national_id",
+ "type": "char(14)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "country_id": {
+ "name": "country_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "city_id": {
+ "name": "city_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_male": {
+ "name": "is_male",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image_url": {
+ "name": "image_url",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "whatsapp_phone_number": {
+ "name": "whatsapp_phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "facebook": {
+ "name": "facebook",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linked_in": {
+ "name": "linked_in",
+ "type": "varchar(30)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "twitter": {
+ "name": "twitter",
+ "type": "varchar(16)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github": {
+ "name": "github",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "telegram": {
+ "name": "telegram",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "visibility_mask": {
+ "name": "visibility_mask",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "registration_date": {
+ "name": "registration_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "users_full_data_user_id_users_user_id_fk": {
+ "name": "users_full_data_user_id_users_user_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_institute_id_institutes_id_fk": {
+ "name": "users_full_data_institute_id_institutes_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "institutes",
+ "columnsFrom": [
+ "institute_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_faculty_id_faculties_id_fk": {
+ "name": "users_full_data_faculty_id_faculties_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "faculties",
+ "columnsFrom": [
+ "faculty_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_department_id_departments_id_fk": {
+ "name": "users_full_data_department_id_departments_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "departments",
+ "columnsFrom": [
+ "department_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_community_id_communities_id_fk": {
+ "name": "users_full_data_community_id_communities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "communities",
+ "columnsFrom": [
+ "community_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_country_id_countries_id_fk": {
+ "name": "users_full_data_country_id_countries_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "countries",
+ "columnsFrom": [
+ "country_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_city_id_cities_id_fk": {
+ "name": "users_full_data_city_id_cities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "cities",
+ "columnsFrom": [
+ "city_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_full_data_nationalId_unique": {
+ "name": "users_full_data_nationalId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "national_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/drizzle/meta/0005_snapshot.json b/drizzle/meta/0005_snapshot.json
new file mode 100644
index 00000000..881a7445
--- /dev/null
+++ b/drizzle/meta/0005_snapshot.json
@@ -0,0 +1,1341 @@
+{
+ "id": "661603f5-aa7b-4569-b3dc-0cdd87ca291b",
+ "prevId": "1aee799a-ccb3-429a-81b2-51a9673ef345",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.blocks": {
+ "name": "blocks",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hidden": {
+ "name": "hidden",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "material": {
+ "name": "material",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "blocks_training_id_trainings_training_id_fk": {
+ "name": "blocks_training_id_trainings_training_id_fk",
+ "tableFrom": "blocks",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "block_pkey": {
+ "name": "block_pkey",
+ "columns": [
+ "block_number",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.contests": {
+ "name": "contests",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "contest_id": {
+ "name": "contest_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "judge": {
+ "name": "judge",
+ "type": "varchar(2)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "standing": {
+ "name": "standing",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "point_per_problem": {
+ "name": "point_per_problem",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 20
+ },
+ "first_points": {
+ "name": "first_points",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1000
+ },
+ "calc_sys": {
+ "name": "calc_sys",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'90%'"
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "contests_training_id_block_number_blocks_training_id_block_number_fk": {
+ "name": "contests_training_id_block_number_blocks_training_id_block_number_fk",
+ "tableFrom": "contests",
+ "tableTo": "blocks",
+ "columnsFrom": [
+ "training_id",
+ "block_number"
+ ],
+ "columnsTo": [
+ "training_id",
+ "block_number"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "Contest_pkey": {
+ "name": "Contest_pkey",
+ "columns": [
+ "block_number",
+ "training_id",
+ "contest_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mentor_trainee_history": {
+ "name": "mentor_trainee_history",
+ "schema": "",
+ "columns": {
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "trainee_id": {
+ "name": "trainee_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mentor_trainee_history_training_id_trainings_training_id_fk": {
+ "name": "mentor_trainee_history_training_id_trainings_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainees",
+ "columnsFrom": [
+ "trainee_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk": {
+ "name": "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk",
+ "columns": [
+ "training_id",
+ "mentor_id",
+ "trainee_id",
+ "start_date"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.staff": {
+ "name": "staff",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor": {
+ "name": "mentor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "problem_setter": {
+ "name": "problem_setter",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "instructor": {
+ "name": "instructor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "co_head": {
+ "name": "co_head",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "manager": {
+ "name": "manager",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "mentor_idx": {
+ "name": "mentor_idx",
+ "columns": [
+ {
+ "expression": "mentor",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "staff_user_id_users_user_id_fk": {
+ "name": "staff_user_id_users_user_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "staff_training_id_trainings_training_id_fk": {
+ "name": "staff_training_id_trainings_training_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {
+ "staff_pk": {
+ "name": "staff_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainees": {
+ "name": "trainees",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_assigned_date": {
+ "name": "mentor_assigned_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainees_user_id_users_user_id_fk": {
+ "name": "trainees_user_id_users_user_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_training_id_trainings_training_id_fk": {
+ "name": "trainees_training_id_trainings_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "trainees_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "trainees_user_id_training_id_pk": {
+ "name": "trainees_user_id_training_id_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainings": {
+ "name": "trainings",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "head_id": {
+ "name": "head_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "chief_judge": {
+ "name": "chief_judge",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "leader_board": {
+ "name": "leader_board",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "standing_view": {
+ "name": "standing_view",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[\"name\",\"handle\",\"numberofsolved\",\"mentor\",\"level\"]'::jsonb"
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "duration": {
+ "name": "duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "status": {
+ "name": "status",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'private'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainings_head_id_users_user_id_fk": {
+ "name": "trainings_head_id_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "head_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ },
+ "trainings_chief_judge_users_user_id_fk": {
+ "name": "trainings_chief_judge_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "chief_judge"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "trainings_title_unique": {
+ "name": "trainings_title_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "title"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.cities": {
+ "name": "cities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "cities_name_unique": {
+ "name": "cities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.communities": {
+ "name": "communities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "communities_name_unique": {
+ "name": "communities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.countries": {
+ "name": "countries",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "countries_name_unique": {
+ "name": "countries_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.departments": {
+ "name": "departments",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "departments_name_unique": {
+ "name": "departments_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.email_auth": {
+ "name": "email_auth",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '7 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.faculties": {
+ "name": "faculties",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "faculties_name_unique": {
+ "name": "faculties_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.institutes": {
+ "name": "institutes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "institutes_name_unique": {
+ "name": "institutes_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reset_password": {
+ "name": "reset_password",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "char(25)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_at": {
+ "name": "end_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '1 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "reset_password_user_id_users_user_id_fk": {
+ "name": "reset_password_user_id_users_user_id_fk",
+ "tableFrom": "reset_password",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users": {
+ "name": "users",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "username": {
+ "name": "username",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "gmail": {
+ "name": "gmail",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cf_handle": {
+ "name": "cf_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "vj_handle": {
+ "name": "vj_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone_number": {
+ "name": "phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'user'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "users_username_idx": {
+ "name": "users_username_idx",
+ "columns": [
+ {
+ "expression": "username",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_username_unique": {
+ "name": "users_username_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "username"
+ ]
+ },
+ "users_gmail_unique": {
+ "name": "users_gmail_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "gmail"
+ ]
+ },
+ "users_cfHandle_unique": {
+ "name": "users_cfHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "cf_handle"
+ ]
+ },
+ "users_vjHandle_unique": {
+ "name": "users_vjHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "vj_handle"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users_full_data": {
+ "name": "users_full_data",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "institute_id": {
+ "name": "institute_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "faculty_id": {
+ "name": "faculty_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "department_id": {
+ "name": "department_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "community_id": {
+ "name": "community_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "academic_year": {
+ "name": "academic_year",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "graduation_date": {
+ "name": "graduation_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "atcoder": {
+ "name": "atcoder",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "codechef": {
+ "name": "codechef",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "leetcode": {
+ "name": "leetcode",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cses": {
+ "name": "cses",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "first_name_en": {
+ "name": "first_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_name_en": {
+ "name": "last_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_1": {
+ "name": "name_ar_1",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_2": {
+ "name": "name_ar_2",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_3": {
+ "name": "name_ar_3",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_4": {
+ "name": "name_ar_4",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "national_id": {
+ "name": "national_id",
+ "type": "char(14)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "country_id": {
+ "name": "country_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "city_id": {
+ "name": "city_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_male": {
+ "name": "is_male",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image_url": {
+ "name": "image_url",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "whatsapp_phone_number": {
+ "name": "whatsapp_phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "facebook": {
+ "name": "facebook",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linked_in": {
+ "name": "linked_in",
+ "type": "varchar(30)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "twitter": {
+ "name": "twitter",
+ "type": "varchar(16)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github": {
+ "name": "github",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "telegram": {
+ "name": "telegram",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "visibility_mask": {
+ "name": "visibility_mask",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "registration_date": {
+ "name": "registration_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "users_full_data_user_id_users_user_id_fk": {
+ "name": "users_full_data_user_id_users_user_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_institute_id_institutes_id_fk": {
+ "name": "users_full_data_institute_id_institutes_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "institutes",
+ "columnsFrom": [
+ "institute_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_faculty_id_faculties_id_fk": {
+ "name": "users_full_data_faculty_id_faculties_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "faculties",
+ "columnsFrom": [
+ "faculty_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_department_id_departments_id_fk": {
+ "name": "users_full_data_department_id_departments_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "departments",
+ "columnsFrom": [
+ "department_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_community_id_communities_id_fk": {
+ "name": "users_full_data_community_id_communities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "communities",
+ "columnsFrom": [
+ "community_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_country_id_countries_id_fk": {
+ "name": "users_full_data_country_id_countries_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "countries",
+ "columnsFrom": [
+ "country_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_city_id_cities_id_fk": {
+ "name": "users_full_data_city_id_cities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "cities",
+ "columnsFrom": [
+ "city_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_full_data_nationalId_unique": {
+ "name": "users_full_data_nationalId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "national_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/drizzle/meta/0006_snapshot.json b/drizzle/meta/0006_snapshot.json
new file mode 100644
index 00000000..385afd0f
--- /dev/null
+++ b/drizzle/meta/0006_snapshot.json
@@ -0,0 +1,1434 @@
+{
+ "id": "de33a325-32b6-4564-89bd-8d8acf56cdd4",
+ "prevId": "661603f5-aa7b-4569-b3dc-0cdd87ca291b",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.applications": {
+ "name": "applications",
+ "schema": "",
+ "columns": {
+ "application_id": {
+ "name": "application_id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "applied_at": {
+ "name": "applied_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "applications_user_id_users_user_id_fk": {
+ "name": "applications_user_id_users_user_id_fk",
+ "tableFrom": "applications",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "applications_training_id_trainings_training_id_fk": {
+ "name": "applications_training_id_trainings_training_id_fk",
+ "tableFrom": "applications",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "applications_userId_trainingId_unique": {
+ "name": "applications_userId_trainingId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.blocks": {
+ "name": "blocks",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "hidden": {
+ "name": "hidden",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "material": {
+ "name": "material",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[]'::jsonb"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "blocks_training_id_trainings_training_id_fk": {
+ "name": "blocks_training_id_trainings_training_id_fk",
+ "tableFrom": "blocks",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "block_pkey": {
+ "name": "block_pkey",
+ "columns": [
+ "block_number",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.contests": {
+ "name": "contests",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "block_number": {
+ "name": "block_number",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "contest_id": {
+ "name": "contest_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "judge": {
+ "name": "judge",
+ "type": "varchar(2)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "standing": {
+ "name": "standing",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "point_per_problem": {
+ "name": "point_per_problem",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 20
+ },
+ "first_points": {
+ "name": "first_points",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1000
+ },
+ "calc_sys": {
+ "name": "calc_sys",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'90%'"
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "contests_training_id_block_number_blocks_training_id_block_number_fk": {
+ "name": "contests_training_id_block_number_blocks_training_id_block_number_fk",
+ "tableFrom": "contests",
+ "tableTo": "blocks",
+ "columnsFrom": [
+ "training_id",
+ "block_number"
+ ],
+ "columnsTo": [
+ "training_id",
+ "block_number"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "Contest_pkey": {
+ "name": "Contest_pkey",
+ "columns": [
+ "block_number",
+ "training_id",
+ "contest_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.mentor_trainee_history": {
+ "name": "mentor_trainee_history",
+ "schema": "",
+ "columns": {
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "trainee_id": {
+ "name": "trainee_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_date": {
+ "name": "end_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "mentor_trainee_history_training_id_trainings_training_id_fk": {
+ "name": "mentor_trainee_history_training_id_trainings_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk": {
+ "name": "mentor_trainee_history_trainee_id_training_id_trainees_user_id_training_id_fk",
+ "tableFrom": "mentor_trainee_history",
+ "tableTo": "trainees",
+ "columnsFrom": [
+ "trainee_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk": {
+ "name": "mentor_trainee_history_training_id_mentor_id_trainee_id_start_date_pk",
+ "columns": [
+ "training_id",
+ "mentor_id",
+ "trainee_id",
+ "start_date"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.staff": {
+ "name": "staff",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor": {
+ "name": "mentor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "problem_setter": {
+ "name": "problem_setter",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "instructor": {
+ "name": "instructor",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "co_head": {
+ "name": "co_head",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "manager": {
+ "name": "manager",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "mentor_idx": {
+ "name": "mentor_idx",
+ "columns": [
+ {
+ "expression": "mentor",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "staff_user_id_users_user_id_fk": {
+ "name": "staff_user_id_users_user_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "staff_training_id_trainings_training_id_fk": {
+ "name": "staff_training_id_trainings_training_id_fk",
+ "tableFrom": "staff",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {
+ "staff_pk": {
+ "name": "staff_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainees": {
+ "name": "trainees",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "training_id": {
+ "name": "training_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_id": {
+ "name": "mentor_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "mentor_assigned_date": {
+ "name": "mentor_assigned_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainees_user_id_users_user_id_fk": {
+ "name": "trainees_user_id_users_user_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_training_id_trainings_training_id_fk": {
+ "name": "trainees_training_id_trainings_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "trainings",
+ "columnsFrom": [
+ "training_id"
+ ],
+ "columnsTo": [
+ "training_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "trainees_mentor_id_training_id_staff_user_id_training_id_fk": {
+ "name": "trainees_mentor_id_training_id_staff_user_id_training_id_fk",
+ "tableFrom": "trainees",
+ "tableTo": "staff",
+ "columnsFrom": [
+ "mentor_id",
+ "training_id"
+ ],
+ "columnsTo": [
+ "user_id",
+ "training_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "trainees_user_id_training_id_pk": {
+ "name": "trainees_user_id_training_id_pk",
+ "columns": [
+ "user_id",
+ "training_id"
+ ]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trainings": {
+ "name": "trainings",
+ "schema": "",
+ "columns": {
+ "training_id": {
+ "name": "training_id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "head_id": {
+ "name": "head_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "chief_judge": {
+ "name": "chief_judge",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "leader_board": {
+ "name": "leader_board",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "standing_view": {
+ "name": "standing_view",
+ "type": "jsonb",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'[\"name\",\"handle\",\"numberofsolved\",\"mentor\",\"level\"]'::jsonb"
+ },
+ "start_date": {
+ "name": "start_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "duration": {
+ "name": "duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "status": {
+ "name": "status",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'private'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "trainings_head_id_users_user_id_fk": {
+ "name": "trainings_head_id_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "head_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ },
+ "trainings_chief_judge_users_user_id_fk": {
+ "name": "trainings_chief_judge_users_user_id_fk",
+ "tableFrom": "trainings",
+ "tableTo": "users",
+ "columnsFrom": [
+ "chief_judge"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "restrict",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "trainings_title_unique": {
+ "name": "trainings_title_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "title"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.cities": {
+ "name": "cities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "cities_name_unique": {
+ "name": "cities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.communities": {
+ "name": "communities",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "communities_name_unique": {
+ "name": "communities_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.countries": {
+ "name": "countries",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "countries_name_unique": {
+ "name": "countries_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.departments": {
+ "name": "departments",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "departments_name_unique": {
+ "name": "departments_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.email_auth": {
+ "name": "email_auth",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '7 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.faculties": {
+ "name": "faculties",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "faculties_name_unique": {
+ "name": "faculties_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.institutes": {
+ "name": "institutes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "institutes_name_unique": {
+ "name": "institutes_name_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "name"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reset_password": {
+ "name": "reset_password",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "char(25)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "end_at": {
+ "name": "end_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now() + interval '1 day'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "reset_password_user_id_users_user_id_fk": {
+ "name": "reset_password_user_id_users_user_id_fk",
+ "tableFrom": "reset_password",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users": {
+ "name": "users",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "username": {
+ "name": "username",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "password": {
+ "name": "password",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "gmail": {
+ "name": "gmail",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cf_handle": {
+ "name": "cf_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "vj_handle": {
+ "name": "vj_handle",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone_number": {
+ "name": "phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'user'"
+ },
+ "deleted": {
+ "name": "deleted",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "users_username_idx": {
+ "name": "users_username_idx",
+ "columns": [
+ {
+ "expression": "username",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_username_unique": {
+ "name": "users_username_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "username"
+ ]
+ },
+ "users_gmail_unique": {
+ "name": "users_gmail_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "gmail"
+ ]
+ },
+ "users_cfHandle_unique": {
+ "name": "users_cfHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "cf_handle"
+ ]
+ },
+ "users_vjHandle_unique": {
+ "name": "users_vjHandle_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "vj_handle"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users_full_data": {
+ "name": "users_full_data",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "institute_id": {
+ "name": "institute_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "faculty_id": {
+ "name": "faculty_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "department_id": {
+ "name": "department_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "community_id": {
+ "name": "community_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "academic_year": {
+ "name": "academic_year",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "graduation_date": {
+ "name": "graduation_date",
+ "type": "date",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "atcoder": {
+ "name": "atcoder",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "codechef": {
+ "name": "codechef",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "leetcode": {
+ "name": "leetcode",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "cses": {
+ "name": "cses",
+ "type": "citext",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "first_name_en": {
+ "name": "first_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "last_name_en": {
+ "name": "last_name_en",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_1": {
+ "name": "name_ar_1",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_2": {
+ "name": "name_ar_2",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_3": {
+ "name": "name_ar_3",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name_ar_4": {
+ "name": "name_ar_4",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "national_id": {
+ "name": "national_id",
+ "type": "char(14)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "country_id": {
+ "name": "country_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "city_id": {
+ "name": "city_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_male": {
+ "name": "is_male",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image_url": {
+ "name": "image_url",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "whatsapp_phone_number": {
+ "name": "whatsapp_phone_number",
+ "type": "varchar(15)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "facebook": {
+ "name": "facebook",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linked_in": {
+ "name": "linked_in",
+ "type": "varchar(30)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "twitter": {
+ "name": "twitter",
+ "type": "varchar(16)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "github": {
+ "name": "github",
+ "type": "varchar(40)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "telegram": {
+ "name": "telegram",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "visibility_mask": {
+ "name": "visibility_mask",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false,
+ "default": 0
+ },
+ "registration_date": {
+ "name": "registration_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "users_full_data_user_id_users_user_id_fk": {
+ "name": "users_full_data_user_id_users_user_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "users",
+ "columnsFrom": [
+ "user_id"
+ ],
+ "columnsTo": [
+ "user_id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_institute_id_institutes_id_fk": {
+ "name": "users_full_data_institute_id_institutes_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "institutes",
+ "columnsFrom": [
+ "institute_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_faculty_id_faculties_id_fk": {
+ "name": "users_full_data_faculty_id_faculties_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "faculties",
+ "columnsFrom": [
+ "faculty_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_department_id_departments_id_fk": {
+ "name": "users_full_data_department_id_departments_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "departments",
+ "columnsFrom": [
+ "department_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_community_id_communities_id_fk": {
+ "name": "users_full_data_community_id_communities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "communities",
+ "columnsFrom": [
+ "community_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_country_id_countries_id_fk": {
+ "name": "users_full_data_country_id_countries_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "countries",
+ "columnsFrom": [
+ "country_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ },
+ "users_full_data_city_id_cities_id_fk": {
+ "name": "users_full_data_city_id_cities_id_fk",
+ "tableFrom": "users_full_data",
+ "tableTo": "cities",
+ "columnsFrom": [
+ "city_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "set null",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_full_data_nationalId_unique": {
+ "name": "users_full_data_nationalId_unique",
+ "nullsNotDistinct": false,
+ "columns": [
+ "national_id"
+ ]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json
index 77d19e4d..353fb0bd 100644
--- a/drizzle/meta/_journal.json
+++ b/drizzle/meta/_journal.json
@@ -5,8 +5,50 @@
{
"idx": 0,
"version": "7",
- "when": 1739489594831,
- "tag": "0000_certain_wilson_fisk",
+ "when": 1742104753021,
+ "tag": "0000_confused_ser_duncan",
+ "breakpoints": true
+ },
+ {
+ "idx": 1,
+ "version": "7",
+ "when": 1743403593678,
+ "tag": "0001_past_viper",
+ "breakpoints": true
+ },
+ {
+ "idx": 2,
+ "version": "7",
+ "when": 1743460100374,
+ "tag": "0002_lush_spirit",
+ "breakpoints": true
+ },
+ {
+ "idx": 3,
+ "version": "7",
+ "when": 1745691100075,
+ "tag": "0003_fearless_sunset_bain",
+ "breakpoints": true
+ },
+ {
+ "idx": 4,
+ "version": "7",
+ "when": 1750782366260,
+ "tag": "0004_slippery_star_brand",
+ "breakpoints": true
+ },
+ {
+ "idx": 5,
+ "version": "7",
+ "when": 1750782549318,
+ "tag": "0005_foamy_doctor_faustus",
+ "breakpoints": true
+ },
+ {
+ "idx": 6,
+ "version": "7",
+ "when": 1750939831832,
+ "tag": "0006_salty_fantastic_four",
"breakpoints": true
}
]
diff --git a/eslint.config.mts b/eslint.config.mjs
similarity index 51%
rename from eslint.config.mts
rename to eslint.config.mjs
index 2f4554d5..33721276 100644
--- a/eslint.config.mts
+++ b/eslint.config.mjs
@@ -1,6 +1,5 @@
import path from "path";
import { fileURLToPath } from "url";
-import type { Linter } from "eslint";
import { FlatCompat } from "@eslint/eslintrc";
const __filename = fileURLToPath(import.meta.url);
@@ -12,13 +11,17 @@ const compat = new FlatCompat({
const eslintConfig = [
...compat.config({
- extends: ['next','prettier'],
+ extends: ["next", "next/core-web-vitals", "next/typescript", "prettier"],
rules: {
- 'react/no-unescaped-entities': 'off',
- '@next/next/no-page-custom-font': 'off',
- 'no-unused-vars': ["error", { argsIgnorePattern: "^_" }],
+ "react/no-unescaped-entities": "off",
+ "@next/next/no-page-custom-font": "off",
+ "@/no-unused-vars": ["error", { varsIgnorePattern: "^_" }],
+ "@typescript-eslint/no-unused-vars": [
+ "error",
+ { varsIgnorePattern: "^_" },
+ ],
},
}),
-] satisfies Linter.Config[];
+];
export default eslintConfig;
diff --git a/package-lock.json b/package-lock.json
index 20692649..1bdbd9ed 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,62 +11,85 @@
"@emotion/cache": "^11.14.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",
+ "@heroicons/react": "^2.2.0",
"@hookform/resolvers": "^3.10.0",
"@mui/material": "^6.4.2",
"@mui/material-nextjs": "^6.4.2",
"@radix-ui/react-checkbox": "^1.1.4",
- "@radix-ui/react-dialog": "^1.1.6",
+ "@radix-ui/react-dialog": "^1.1.13",
"@radix-ui/react-dropdown-menu": "^2.1.6",
"@radix-ui/react-label": "^2.1.2",
"@radix-ui/react-navigation-menu": "^1.2.5",
+ "@radix-ui/react-popover": "^1.1.13",
"@radix-ui/react-progress": "^1.1.2",
"@radix-ui/react-select": "^2.1.6",
"@radix-ui/react-separator": "^1.1.2",
"@radix-ui/react-slot": "^1.1.2",
+ "@radix-ui/react-switch": "^1.2.4",
"@radix-ui/react-tabs": "^1.1.3",
+ "@radix-ui/react-toast": "^1.2.13",
"@radix-ui/react-tooltip": "^1.1.8",
"@svgr/webpack": "^8.1.0",
"@tailwindcss/postcss": "^4.0.6",
"bcrypt": "^5.1.1",
"bcryptjs": "^2.4.3",
"bootstrap": "^5.3.3",
+ "camelcase-keys": "^9.1.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
+ "cmdk": "^1.1.1",
"cookie": "^1.0.2",
- "drizzle-kit": "^0.30.1",
- "drizzle-orm": "^0.38.3",
"lucide-react": "^0.475.0",
- "next": "15.1.0",
+ "next": "^15.3.2",
"next-auth": "^4.24.11",
"next-themes": "^0.4.4",
- "pg": "^8.13.1",
+ "pg-mem": "^3.0.5",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-hook-form": "^7.54.2",
"react-icons": "^5.4.0",
+ "react-markdown": "^10.1.0",
+ "react-syntax-highlighter": "^15.6.1",
+ "react-toastify": "^11.0.5",
+ "rehype-sanitize": "^6.0.0",
+ "remark-gfm": "^4.0.1",
"resend": "^4.1.2",
"server-only": "^0.0.1",
"shadcn-ui": "^0.9.4",
"tailwind-merge": "^3.0.1",
+ "url-pattern": "^1.0.3",
"zod": "^3.24.1"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
+ "@playwright/test": "^1.50.1",
+ "@types/bcrypt": "^5.0.2",
"@types/bcryptjs": "^2.4.6",
"@types/eslint__eslintrc": "^2.1.2",
+ "@types/jest": "^29.5.14",
"@types/node": "^20",
- "@types/pg": "^8.11.10",
+ "@types/pg": "^8.11.11",
"@types/react": "^19",
"@types/react-dom": "^19",
+ "@types/react-syntax-highlighter": "^15.5.13",
"autoprefixer": "^10.4.16",
+ "better-sqlite3": "^11.9.1",
+ "dotenv": "^16.4.7",
+ "drizzle-kit": "^0.31.1",
+ "drizzle-orm": "^0.41.0",
"eslint": "^9",
"eslint-config-next": "15.1.0",
"eslint-config-prettier": "^10.0.1",
+ "i": "^0.3.7",
+ "jest": "^29.7.0",
"jiti": "^2.4.2",
+ "npm": "^11.2.0",
+ "pg": "^8.14.1",
"postcss": "^8.4.31",
"prettier": "^3.4.2",
"tailwindcss": "^3.3.0",
"tailwindcss-animate": "^1.0.7",
+ "tsx": "^4.19.3",
"typescript": "^5"
}
},
@@ -111,14 +134,14 @@
}
},
"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==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.27.1",
"js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
+ "picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
@@ -436,18 +459,18 @@
}
},
"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==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"license": "MIT",
"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==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -477,25 +500,25 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
- "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz",
+ "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==",
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.25.9",
- "@babel/types": "^7.26.7"
+ "@babel/template": "^7.27.1",
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz",
- "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==",
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz",
+ "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.26.7"
+ "@babel/types": "^7.27.1"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -595,6 +618,61 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-syntax-import-assertions": {
"version": "7.26.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
@@ -625,6 +703,32 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.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",
@@ -640,6 +744,116 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "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",
@@ -1712,26 +1926,23 @@
}
},
"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==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
+ "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
"license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
"engines": {
"node": ">=6.9.0"
}
},
"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==",
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.25.9",
- "@babel/parser": "^7.25.9",
- "@babel/types": "^7.25.9"
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1765,28 +1976,36 @@
}
},
"node_modules/@babel/types": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz",
- "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
+ "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
"license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9"
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@drizzle-team/brocli": {
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz",
"integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@emnapi/runtime": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz",
- "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==",
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz",
+ "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==",
"license": "MIT",
"optional": true,
"dependencies": {
@@ -1959,6 +2178,7 @@
"resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz",
"integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==",
"deprecated": "Merged into tsx: https://tsx.is",
+ "dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "~0.18.20",
@@ -1972,6 +2192,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1988,6 +2209,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2004,6 +2226,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2020,6 +2243,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2036,6 +2260,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2052,6 +2277,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2068,6 +2294,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2084,6 +2311,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2100,6 +2328,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2116,6 +2345,7 @@
"cpu": [
"ia32"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2132,6 +2362,7 @@
"cpu": [
"loong64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2148,6 +2379,7 @@
"cpu": [
"mips64el"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2164,6 +2396,7 @@
"cpu": [
"ppc64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2180,6 +2413,7 @@
"cpu": [
"riscv64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2196,6 +2430,7 @@
"cpu": [
"s390x"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2212,6 +2447,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2228,6 +2464,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2244,6 +2481,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2260,6 +2498,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2276,6 +2515,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2292,6 +2532,7 @@
"cpu": [
"ia32"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2308,6 +2549,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2321,6 +2563,7 @@
"version": "0.18.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
"integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "dev": true,
"hasInstallScript": true,
"license": "MIT",
"bin": {
@@ -2359,6 +2602,7 @@
"resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz",
"integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==",
"deprecated": "Merged into tsx: https://tsx.is",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@esbuild-kit/core-utils": "^3.3.2",
@@ -2366,371 +2610,428 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
- "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz",
+ "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==",
"cpu": [
"ppc64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"aix"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
- "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz",
+ "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==",
"cpu": [
"arm"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
- "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz",
+ "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==",
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
- "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz",
+ "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
- "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz",
+ "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==",
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
- "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz",
+ "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
- "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==",
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
- "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz",
+ "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
- "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz",
+ "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==",
"cpu": [
"arm"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
- "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz",
+ "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==",
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
- "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz",
+ "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==",
"cpu": [
"ia32"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
- "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz",
+ "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==",
"cpu": [
"loong64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
- "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz",
+ "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==",
"cpu": [
"mips64el"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
- "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz",
+ "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==",
"cpu": [
"ppc64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
- "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz",
+ "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==",
"cpu": [
"riscv64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
- "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz",
+ "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==",
"cpu": [
"s390x"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
- "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz",
+ "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
- "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz",
+ "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
- "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz",
+ "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
- "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz",
+ "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"sunos"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
- "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz",
+ "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==",
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
- "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz",
+ "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==",
"cpu": [
"ia32"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
- "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz",
+ "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@eslint-community/eslint-utils": {
@@ -2899,6 +3200,14 @@
"integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
"license": "MIT"
},
+ "node_modules/@heroicons/react": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz",
+ "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==",
+ "peerDependencies": {
+ "react": ">= 16 || ^19.0.0-rc"
+ }
+ },
"node_modules/@hookform/resolvers": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.10.0.tgz",
@@ -2975,9 +3284,9 @@
}
},
"node_modules/@img/sharp-darwin-arm64": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
- "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz",
+ "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==",
"cpu": [
"arm64"
],
@@ -2993,13 +3302,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-darwin-arm64": "1.0.4"
+ "@img/sharp-libvips-darwin-arm64": "1.1.0"
}
},
"node_modules/@img/sharp-darwin-x64": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz",
- "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz",
+ "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==",
"cpu": [
"x64"
],
@@ -3015,13 +3324,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-darwin-x64": "1.0.4"
+ "@img/sharp-libvips-darwin-x64": "1.1.0"
}
},
"node_modules/@img/sharp-libvips-darwin-arm64": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz",
- "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz",
+ "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==",
"cpu": [
"arm64"
],
@@ -3035,9 +3344,9 @@
}
},
"node_modules/@img/sharp-libvips-darwin-x64": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz",
- "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz",
+ "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==",
"cpu": [
"x64"
],
@@ -3051,9 +3360,9 @@
}
},
"node_modules/@img/sharp-libvips-linux-arm": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz",
- "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz",
+ "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==",
"cpu": [
"arm"
],
@@ -3067,9 +3376,9 @@
}
},
"node_modules/@img/sharp-libvips-linux-arm64": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz",
- "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz",
+ "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==",
"cpu": [
"arm64"
],
@@ -3082,10 +3391,26 @@
"url": "https://opencollective.com/libvips"
}
},
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz",
+ "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
"node_modules/@img/sharp-libvips-linux-s390x": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz",
- "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz",
+ "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==",
"cpu": [
"s390x"
],
@@ -3099,9 +3424,9 @@
}
},
"node_modules/@img/sharp-libvips-linux-x64": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz",
- "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz",
+ "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==",
"cpu": [
"x64"
],
@@ -3115,9 +3440,9 @@
}
},
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz",
- "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz",
+ "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==",
"cpu": [
"arm64"
],
@@ -3131,9 +3456,9 @@
}
},
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz",
- "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz",
+ "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==",
"cpu": [
"x64"
],
@@ -3147,9 +3472,9 @@
}
},
"node_modules/@img/sharp-linux-arm": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz",
- "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz",
+ "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==",
"cpu": [
"arm"
],
@@ -3165,13 +3490,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-arm": "1.0.5"
+ "@img/sharp-libvips-linux-arm": "1.1.0"
}
},
"node_modules/@img/sharp-linux-arm64": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz",
- "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz",
+ "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==",
"cpu": [
"arm64"
],
@@ -3187,13 +3512,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-arm64": "1.0.4"
+ "@img/sharp-libvips-linux-arm64": "1.1.0"
}
},
"node_modules/@img/sharp-linux-s390x": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz",
- "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz",
+ "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==",
"cpu": [
"s390x"
],
@@ -3209,13 +3534,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-s390x": "1.0.4"
+ "@img/sharp-libvips-linux-s390x": "1.1.0"
}
},
"node_modules/@img/sharp-linux-x64": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz",
- "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz",
+ "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==",
"cpu": [
"x64"
],
@@ -3231,13 +3556,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-x64": "1.0.4"
+ "@img/sharp-libvips-linux-x64": "1.1.0"
}
},
"node_modules/@img/sharp-linuxmusl-arm64": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz",
- "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz",
+ "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==",
"cpu": [
"arm64"
],
@@ -3253,13 +3578,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-arm64": "1.0.4"
+ "@img/sharp-libvips-linuxmusl-arm64": "1.1.0"
}
},
"node_modules/@img/sharp-linuxmusl-x64": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz",
- "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz",
+ "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==",
"cpu": [
"x64"
],
@@ -3275,20 +3600,20 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-x64": "1.0.4"
+ "@img/sharp-libvips-linuxmusl-x64": "1.1.0"
}
},
"node_modules/@img/sharp-wasm32": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz",
- "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz",
+ "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==",
"cpu": [
"wasm32"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
- "@emnapi/runtime": "^1.2.0"
+ "@emnapi/runtime": "^1.4.0"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -3298,9 +3623,9 @@
}
},
"node_modules/@img/sharp-win32-ia32": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz",
- "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz",
+ "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==",
"cpu": [
"ia32"
],
@@ -3317,9 +3642,9 @@
}
},
"node_modules/@img/sharp-win32-x64": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz",
- "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz",
+ "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==",
"cpu": [
"x64"
],
@@ -3396,249 +3721,602 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
- "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
- "license": "MIT",
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=8"
}
},
- "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==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
"license": "MIT",
- "engines": {
- "node": ">=6.0.0"
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
}
},
- "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==",
+ "node_modules/@istanbuljs/load-nyc-config/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,
"license": "MIT",
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6"
}
},
- "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==",
- "license": "MIT"
- },
- "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==",
+ "node_modules/@istanbuljs/load-nyc-config/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,
"license": "MIT",
"dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@mapbox/node-pre-gyp": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
- "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
- "license": "BSD-3-Clause",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "detect-libc": "^2.0.0",
- "https-proxy-agent": "^5.0.0",
- "make-dir": "^3.1.0",
- "node-fetch": "^2.6.7",
- "nopt": "^5.0.0",
- "npmlog": "^5.0.1",
- "rimraf": "^3.0.2",
- "semver": "^7.3.5",
- "tar": "^6.1.11"
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
},
"bin": {
- "node-pre-gyp": "bin/node-pre-gyp"
+ "js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/@mui/core-downloads-tracker": {
- "version": "6.4.2",
- "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.2.tgz",
- "integrity": "sha512-Qmod9fHsFWrtLxdSkZ4iDLRz2AUKt3C2ZEimuY+qKlQGVKJDNS5DuSlNOAgqfHFDq8mzB17ATN6HFcThwJlvUw==",
+ "node_modules/@istanbuljs/load-nyc-config/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,
"license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@mui/material": {
- "version": "6.4.2",
- "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.2.tgz",
- "integrity": "sha512-9jKr53KbAJyyBRx8LRmX7ATXHlGtxVQdPgm1uyXMoEPMVkSJW1yO3vFgfYoDbGx4ZHcCNuWa4FkFIPWVt9fghA==",
+ "node_modules/@istanbuljs/load-nyc-config/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,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.26.0",
- "@mui/core-downloads-tracker": "^6.4.2",
- "@mui/system": "^6.4.2",
- "@mui/types": "^7.2.21",
- "@mui/utils": "^6.4.2",
- "@popperjs/core": "^2.11.8",
- "@types/react-transition-group": "^4.4.12",
- "clsx": "^2.1.1",
- "csstype": "^3.1.3",
- "prop-types": "^15.8.1",
- "react-is": "^19.0.0",
- "react-transition-group": "^4.4.5"
+ "p-try": "^2.0.0"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=6"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.5.0",
- "@emotion/styled": "^11.3.0",
- "@mui/material-pigment-css": "^6.4.2",
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/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,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
},
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
- "@mui/material-pigment-css": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@mui/material-nextjs": {
- "version": "6.4.2",
- "resolved": "https://registry.npmjs.org/@mui/material-nextjs/-/material-nextjs-6.4.2.tgz",
- "integrity": "sha512-kNka1fC2VO7v2Odckj24S9Xb3+hN9xVjDtvuIHRFiv4BlQR8cxpgH9exGhVMFk9KCvJG3O7J4huBDzzxZuSlIw==",
+ "node_modules/@istanbuljs/load-nyc-config/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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+ "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.26.0"
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0"
},
"engines": {
- "node": ">=14.0.0"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+ "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/reporters": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^29.7.0",
+ "jest-config": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-resolve-dependencies": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
- "@emotion/cache": "^11.11.0",
- "@emotion/react": "^11.11.4",
- "@emotion/server": "^11.11.0",
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "next": "^13.0.0 || ^14.0.0 || ^15.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
},
"peerDependenciesMeta": {
- "@emotion/cache": {
- "optional": true
- },
- "@emotion/server": {
- "optional": true
- },
- "@types/react": {
+ "node-notifier": {
"optional": true
}
}
},
- "node_modules/@mui/material/node_modules/react-is": {
- "version": "19.0.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz",
- "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==",
- "license": "MIT"
+ "node_modules/@jest/core/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
},
- "node_modules/@mui/private-theming": {
- "version": "6.4.2",
- "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.2.tgz",
- "integrity": "sha512-2CkQT0gNlogM50qGTBJgWA7hPPx4AeH8RE2xJa+PHtIOowiVPX52ZsQ0e7Ho18DAqEbkngQ6Uju037ER+TCY5A==",
+ "node_modules/@jest/core/node_modules/jest-config": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.26.0",
- "@mui/utils": "^6.4.2",
- "prop-types": "^15.8.1"
+ "@babel/core": "^7.11.6",
+ "@jest/test-sequencer": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.7.0",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
},
"engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ "@types/node": "*",
+ "ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
- "@types/react": {
+ "@types/node": {
+ "optional": true
+ },
+ "ts-node": {
"optional": true
}
}
},
- "node_modules/@mui/styled-engine": {
- "version": "6.4.2",
- "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.2.tgz",
- "integrity": "sha512-cgjQK2bkllSYoWUBv93ALhCPJ0NhfO3NctsBf13/b4XSeQVfKPBAnR+P9mNpdFMa5a5RWwtWuBD3cZ5vktsN+g==",
+ "node_modules/@jest/core/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.26.0",
- "@emotion/cache": "^11.13.5",
- "@emotion/serialize": "^1.3.3",
- "@emotion/sheet": "^1.4.0",
- "csstype": "^3.1.3",
- "prop-types": "^15.8.1"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
"engines": {
- "node": ">=14.0.0"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/core/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jest/environment": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expect": "^29.7.0",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jest-get-type": "^29.6.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@types/node": "*",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+ "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+ "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.1",
+ "strip-ansi": "^6.0.0",
+ "v8-to-istanbul": "^9.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
- "@emotion/react": "^11.4.1",
- "@emotion/styled": "^11.3.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
},
"peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
+ "node-notifier": {
"optional": true
}
}
},
- "node_modules/@mui/system": {
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
+ "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
+ "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^2.0.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "write-file-atomic": "^4.0.2"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+ "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "make-dir": "^3.1.0",
+ "node-fetch": "^2.6.7",
+ "nopt": "^5.0.0",
+ "npmlog": "^5.0.1",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
+ }
+ },
+ "node_modules/@mui/core-downloads-tracker": {
"version": "6.4.2",
- "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.2.tgz",
- "integrity": "sha512-wQbaPCtsxNsM5nR+NZpkFJBKVKH03GQnAjlkKENM8JQqGdWcRyM3f4fJZgzzNdIFpSQw4wpAQKnhfHkjf3d6yQ==",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.2.tgz",
+ "integrity": "sha512-Qmod9fHsFWrtLxdSkZ4iDLRz2AUKt3C2ZEimuY+qKlQGVKJDNS5DuSlNOAgqfHFDq8mzB17ATN6HFcThwJlvUw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ }
+ },
+ "node_modules/@mui/material": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.2.tgz",
+ "integrity": "sha512-9jKr53KbAJyyBRx8LRmX7ATXHlGtxVQdPgm1uyXMoEPMVkSJW1yO3vFgfYoDbGx4ZHcCNuWa4FkFIPWVt9fghA==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.26.0",
- "@mui/private-theming": "^6.4.2",
- "@mui/styled-engine": "^6.4.2",
+ "@mui/core-downloads-tracker": "^6.4.2",
+ "@mui/system": "^6.4.2",
"@mui/types": "^7.2.21",
"@mui/utils": "^6.4.2",
+ "@popperjs/core": "^2.11.8",
+ "@types/react-transition-group": "^4.4.12",
"clsx": "^2.1.1",
"csstype": "^3.1.3",
- "prop-types": "^15.8.1"
+ "prop-types": "^15.8.1",
+ "react-is": "^19.0.0",
+ "react-transition-group": "^4.4.5"
},
"engines": {
"node": ">=14.0.0"
@@ -3650,8 +4328,10 @@
"peerDependencies": {
"@emotion/react": "^11.5.0",
"@emotion/styled": "^11.3.0",
+ "@mui/material-pigment-css": "^6.4.2",
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
},
"peerDependenciesMeta": {
"@emotion/react": {
@@ -3660,37 +4340,21 @@
"@emotion/styled": {
"optional": true
},
- "@types/react": {
+ "@mui/material-pigment-css": {
"optional": true
- }
- }
- },
- "node_modules/@mui/types": {
- "version": "7.2.21",
- "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.21.tgz",
- "integrity": "sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
+ },
"@types/react": {
"optional": true
}
}
},
- "node_modules/@mui/utils": {
+ "node_modules/@mui/material-nextjs": {
"version": "6.4.2",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.2.tgz",
- "integrity": "sha512-5NkhzlJkmR5+5RSs/Irqin1GPy2Z8vbLk/UzQrH9FEAnm6OA9SvuXjzgklxUs7N65VwEkGpKK1jMZ5K84hRdzQ==",
+ "resolved": "https://registry.npmjs.org/@mui/material-nextjs/-/material-nextjs-6.4.2.tgz",
+ "integrity": "sha512-kNka1fC2VO7v2Odckj24S9Xb3+hN9xVjDtvuIHRFiv4BlQR8cxpgH9exGhVMFk9KCvJG3O7J4huBDzzxZuSlIw==",
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.26.0",
- "@mui/types": "^7.2.21",
- "@types/prop-types": "^15.7.14",
- "clsx": "^2.1.1",
- "prop-types": "^15.8.1",
- "react-is": "^19.0.0"
+ "@babel/runtime": "^7.26.0"
},
"engines": {
"node": ">=14.0.0"
@@ -3700,30 +4364,191 @@
"url": "https://opencollective.com/mui-org"
},
"peerDependencies": {
+ "@emotion/cache": "^11.11.0",
+ "@emotion/react": "^11.11.4",
+ "@emotion/server": "^11.11.0",
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "next": "^13.0.0 || ^14.0.0 || ^15.0.0",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0"
},
"peerDependenciesMeta": {
+ "@emotion/cache": {
+ "optional": true
+ },
+ "@emotion/server": {
+ "optional": true
+ },
"@types/react": {
"optional": true
}
}
},
- "node_modules/@mui/utils/node_modules/react-is": {
+ "node_modules/@mui/material/node_modules/react-is": {
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz",
"integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==",
"license": "MIT"
},
- "node_modules/@next/env": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.0.tgz",
- "integrity": "sha512-UcCO481cROsqJuszPPXJnb7GGuLq617ve4xuAyyNG4VSSocJNtMU5Fsx+Lp6mlN8c7W58aZLc5y6D/2xNmaK+w==",
- "license": "MIT"
- },
- "node_modules/@next/eslint-plugin-next": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.0.tgz",
+ "node_modules/@mui/private-theming": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.2.tgz",
+ "integrity": "sha512-2CkQT0gNlogM50qGTBJgWA7hPPx4AeH8RE2xJa+PHtIOowiVPX52ZsQ0e7Ho18DAqEbkngQ6Uju037ER+TCY5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0",
+ "@mui/utils": "^6.4.2",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/styled-engine": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.2.tgz",
+ "integrity": "sha512-cgjQK2bkllSYoWUBv93ALhCPJ0NhfO3NctsBf13/b4XSeQVfKPBAnR+P9mNpdFMa5a5RWwtWuBD3cZ5vktsN+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0",
+ "@emotion/cache": "^11.13.5",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/sheet": "^1.4.0",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.4.1",
+ "@emotion/styled": "^11.3.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/system": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.2.tgz",
+ "integrity": "sha512-wQbaPCtsxNsM5nR+NZpkFJBKVKH03GQnAjlkKENM8JQqGdWcRyM3f4fJZgzzNdIFpSQw4wpAQKnhfHkjf3d6yQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0",
+ "@mui/private-theming": "^6.4.2",
+ "@mui/styled-engine": "^6.4.2",
+ "@mui/types": "^7.2.21",
+ "@mui/utils": "^6.4.2",
+ "clsx": "^2.1.1",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/types": {
+ "version": "7.2.21",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.21.tgz",
+ "integrity": "sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.2.tgz",
+ "integrity": "sha512-5NkhzlJkmR5+5RSs/Irqin1GPy2Z8vbLk/UzQrH9FEAnm6OA9SvuXjzgklxUs7N65VwEkGpKK1jMZ5K84hRdzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0",
+ "@mui/types": "^7.2.21",
+ "@types/prop-types": "^15.7.14",
+ "clsx": "^2.1.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^19.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils/node_modules/react-is": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz",
+ "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==",
+ "license": "MIT"
+ },
+ "node_modules/@next/env": {
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.2.tgz",
+ "integrity": "sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==",
+ "license": "MIT"
+ },
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.0.tgz",
"integrity": "sha512-+jPT0h+nelBT6HC9ZCHGc7DgGVy04cv4shYdAe6tKlEbjQUtwU3LzQhzbDHQyY2m6g39m6B0kOFVuLGBrxxbGg==",
"dev": true,
"license": "MIT",
@@ -3732,9 +4557,9 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.0.tgz",
- "integrity": "sha512-ZU8d7xxpX14uIaFC3nsr4L++5ZS/AkWDm1PzPO6gD9xWhFkOj2hzSbSIxoncsnlJXB1CbLOfGVN4Zk9tg83PUw==",
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.2.tgz",
+ "integrity": "sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==",
"cpu": [
"arm64"
],
@@ -3748,9 +4573,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.0.tgz",
- "integrity": "sha512-DQ3RiUoW2XC9FcSM4ffpfndq1EsLV0fj0/UY33i7eklW5akPUCo6OX2qkcLXZ3jyPdo4sf2flwAED3AAq3Om2Q==",
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.2.tgz",
+ "integrity": "sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==",
"cpu": [
"x64"
],
@@ -3764,9 +4589,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.0.tgz",
- "integrity": "sha512-M+vhTovRS2F//LMx9KtxbkWk627l5Q7AqXWWWrfIzNIaUFiz2/NkOFkxCFyNyGACi5YbA8aekzCLtbDyfF/v5Q==",
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.2.tgz",
+ "integrity": "sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==",
"cpu": [
"arm64"
],
@@ -3780,9 +4605,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.0.tgz",
- "integrity": "sha512-Qn6vOuwaTCx3pNwygpSGtdIu0TfS1KiaYLYXLH5zq1scoTXdwYfdZtwvJTpB1WrLgiQE2Ne2kt8MZok3HlFqmg==",
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.2.tgz",
+ "integrity": "sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==",
"cpu": [
"arm64"
],
@@ -3796,9 +4621,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.0.tgz",
- "integrity": "sha512-yeNh9ofMqzOZ5yTOk+2rwncBzucc6a1lyqtg8xZv0rH5znyjxHOWsoUtSq4cUTeeBIiXXX51QOOe+VoCjdXJRw==",
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.2.tgz",
+ "integrity": "sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==",
"cpu": [
"x64"
],
@@ -3812,9 +4637,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.0.tgz",
- "integrity": "sha512-t9IfNkHQs/uKgPoyEtU912MG6a1j7Had37cSUyLTKx9MnUpjj+ZDKw9OyqTI9OwIIv0wmkr1pkZy+3T5pxhJPg==",
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.2.tgz",
+ "integrity": "sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==",
"cpu": [
"x64"
],
@@ -3828,9 +4653,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.0.tgz",
- "integrity": "sha512-WEAoHyG14t5sTavZa1c6BnOIEukll9iqFRTavqRVPfYmfegOAd5MaZfXgOGG6kGo1RduyGdTHD4+YZQSdsNZXg==",
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.2.tgz",
+ "integrity": "sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==",
"cpu": [
"arm64"
],
@@ -3844,9 +4669,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.0.tgz",
- "integrity": "sha512-J1YdKuJv9xcixzXR24Dv+4SaDKc2jj31IVUEMdO5xJivMTXuE6MAdIi4qPjSymHuFG8O5wbfWKnhJUcHHpj5CA==",
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.2.tgz",
+ "integrity": "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==",
"cpu": [
"x64"
],
@@ -3930,6 +4755,22 @@
"node": ">=14"
}
},
+ "node_modules/@playwright/test": {
+ "version": "1.50.1",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.50.1.tgz",
+ "integrity": "sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.50.1"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@popperjs/core": {
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
@@ -4062,23 +4903,23 @@
}
},
"node_modules/@radix-ui/react-dialog": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.6.tgz",
- "integrity": "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-dismissable-layer": "1.1.5",
- "@radix-ui/react-focus-guards": "1.1.1",
- "@radix-ui/react-focus-scope": "1.1.2",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-portal": "1.1.4",
- "@radix-ui/react-presence": "1.1.2",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-slot": "1.1.2",
- "@radix-ui/react-use-controllable-state": "1.1.0",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.13.tgz",
+ "integrity": "sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.9",
+ "@radix-ui/react-focus-guards": "1.1.2",
+ "@radix-ui/react-focus-scope": "1.1.6",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-portal": "1.1.8",
+ "@radix-ui/react-presence": "1.1.4",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-slot": "1.2.2",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
"aria-hidden": "^1.2.4",
"react-remove-scroll": "^2.6.3"
},
@@ -4097,10 +4938,16 @@
}
}
},
- "node_modules/@radix-ui/react-direction": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
- "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz",
+ "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
"license": "MIT",
"peerDependencies": {
"@types/react": "*",
@@ -4112,46 +4959,32 @@
}
}
},
- "node_modules/@radix-ui/react-dismissable-layer": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz",
- "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
"license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-callback-ref": "1.1.0",
- "@radix-ui/react-use-escape-keydown": "1.1.0"
- },
"peerDependencies": {
"@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
- },
- "@types/react-dom": {
- "optional": true
}
}
},
- "node_modules/@radix-ui/react-dropdown-menu": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.6.tgz",
- "integrity": "sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.9.tgz",
+ "integrity": "sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-menu": "2.1.6",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-controllable-state": "1.1.0"
+ "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
@@ -4168,10 +5001,10 @@
}
}
},
- "node_modules/@radix-ui/react-focus-guards": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz",
- "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz",
+ "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==",
"license": "MIT",
"peerDependencies": {
"@types/react": "*",
@@ -4183,15 +5016,15 @@
}
}
},
- "node_modules/@radix-ui/react-focus-scope": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.2.tgz",
- "integrity": "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.6.tgz",
+ "integrity": "sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==",
"license": "MIT",
"dependencies": {
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-callback-ref": "1.1.0"
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
@@ -4208,13 +5041,13 @@
}
}
},
- "node_modules/@radix-ui/react-id": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz",
- "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
"license": "MIT",
"dependencies": {
- "@radix-ui/react-use-layout-effect": "1.1.0"
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
@@ -4226,13 +5059,14 @@
}
}
},
- "node_modules/@radix-ui/react-label": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.2.tgz",
- "integrity": "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.8.tgz",
+ "integrity": "sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==",
"license": "MIT",
"dependencies": {
- "@radix-ui/react-primitive": "2.0.2"
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
@@ -4249,30 +5083,14 @@
}
}
},
- "node_modules/@radix-ui/react-menu": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.6.tgz",
- "integrity": "sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz",
+ "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-collection": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-dismissable-layer": "1.1.5",
- "@radix-ui/react-focus-guards": "1.1.1",
- "@radix-ui/react-focus-scope": "1.1.2",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-popper": "1.2.2",
- "@radix-ui/react-portal": "1.1.4",
- "@radix-ui/react-presence": "1.1.2",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-roving-focus": "1.1.2",
- "@radix-ui/react-slot": "1.1.2",
- "@radix-ui/react-use-callback-ref": "1.1.0",
- "aria-hidden": "^1.2.4",
- "react-remove-scroll": "^2.6.3"
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
@@ -4289,26 +5107,13 @@
}
}
},
- "node_modules/@radix-ui/react-navigation-menu": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.5.tgz",
- "integrity": "sha512-myMHHQUZ3ZLTi8W381/Vu43Ia0NqakkQZ2vzynMmTUtQQ9kNkjzhOwkZC9TAM5R07OZUVIQyHC06f/9JZJpvvA==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz",
+ "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-collection": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-dismissable-layer": "1.1.5",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-presence": "1.1.2",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-callback-ref": "1.1.0",
- "@radix-ui/react-use-controllable-state": "1.1.0",
- "@radix-ui/react-use-layout-effect": "1.1.0",
- "@radix-ui/react-use-previous": "1.1.0",
- "@radix-ui/react-visually-hidden": "1.1.2"
+ "@radix-ui/react-slot": "1.2.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -4325,148 +5130,117 @@
}
}
},
- "node_modules/@radix-ui/react-popper": {
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": {
"version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz",
- "integrity": "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz",
+ "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==",
"license": "MIT",
"dependencies": {
- "@floating-ui/react-dom": "^2.0.0",
- "@radix-ui/react-arrow": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-callback-ref": "1.1.0",
- "@radix-ui/react-use-layout-effect": "1.1.0",
- "@radix-ui/react-use-rect": "1.1.0",
- "@radix-ui/react-use-size": "1.1.0",
- "@radix-ui/rect": "1.1.0"
+ "@radix-ui/react-compose-refs": "1.1.2"
},
"peerDependencies": {
"@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
- },
- "@types/react-dom": {
- "optional": true
}
}
},
- "node_modules/@radix-ui/react-portal": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz",
- "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
"license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-layout-effect": "1.1.0"
- },
"peerDependencies": {
"@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
- },
- "@types/react-dom": {
- "optional": true
}
}
},
- "node_modules/@radix-ui/react-presence": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz",
- "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
"license": "MIT",
"dependencies": {
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-use-layout-effect": "1.1.0"
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
- },
- "@types/react-dom": {
- "optional": true
}
}
},
- "node_modules/@radix-ui/react-primitive": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz",
- "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
"license": "MIT",
"dependencies": {
- "@radix-ui/react-slot": "1.1.2"
+ "@radix-ui/react-use-callback-ref": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
- },
- "@types/react-dom": {
- "optional": true
}
}
},
- "node_modules/@radix-ui/react-progress": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.2.tgz",
- "integrity": "sha512-u1IgJFQ4zNAUTjGdDL5dcl/U8ntOR6jsnhxKb5RKp5Ozwl88xKR9EqRZOe/Mk8tnx0x5tNUe2F+MzsyjqMg0MA==",
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
"license": "MIT",
- "dependencies": {
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-primitive": "2.0.2"
- },
"peerDependencies": {
"@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
- },
- "@types/react-dom": {
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
+ "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
"optional": true
}
}
},
- "node_modules/@radix-ui/react-roving-focus": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz",
- "integrity": "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==",
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz",
+ "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-collection": "1.1.2",
"@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-id": "1.1.0",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-callback-ref": "1.1.0",
- "@radix-ui/react-use-controllable-state": "1.1.0"
+ "@radix-ui/react-use-escape-keydown": "1.1.0"
},
"peerDependencies": {
"@types/react": "*",
@@ -4483,33 +5257,19 @@
}
}
},
- "node_modules/@radix-ui/react-select": {
+ "node_modules/@radix-ui/react-dropdown-menu": {
"version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.6.tgz",
- "integrity": "sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.6.tgz",
+ "integrity": "sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==",
"license": "MIT",
"dependencies": {
- "@radix-ui/number": "1.1.0",
"@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-collection": "1.1.2",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-dismissable-layer": "1.1.5",
- "@radix-ui/react-focus-guards": "1.1.1",
- "@radix-ui/react-focus-scope": "1.1.2",
"@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-popper": "1.2.2",
- "@radix-ui/react-portal": "1.1.4",
+ "@radix-ui/react-menu": "2.1.6",
"@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-slot": "1.1.2",
- "@radix-ui/react-use-callback-ref": "1.1.0",
- "@radix-ui/react-use-controllable-state": "1.1.0",
- "@radix-ui/react-use-layout-effect": "1.1.0",
- "@radix-ui/react-use-previous": "1.1.0",
- "@radix-ui/react-visually-hidden": "1.1.2",
- "aria-hidden": "^1.2.4",
- "react-remove-scroll": "^2.6.3"
+ "@radix-ui/react-use-controllable-state": "1.1.0"
},
"peerDependencies": {
"@types/react": "*",
@@ -4526,13 +5286,30 @@
}
}
},
- "node_modules/@radix-ui/react-separator": {
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz",
+ "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.2.tgz",
- "integrity": "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.2.tgz",
+ "integrity": "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==",
"license": "MIT",
"dependencies": {
- "@radix-ui/react-primitive": "2.0.2"
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.2",
+ "@radix-ui/react-use-callback-ref": "1.1.0"
},
"peerDependencies": {
"@types/react": "*",
@@ -4549,13 +5326,13 @@
}
}
},
- "node_modules/@radix-ui/react-slot": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz",
- "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==",
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz",
+ "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==",
"license": "MIT",
"dependencies": {
- "@radix-ui/react-compose-refs": "1.1.1"
+ "@radix-ui/react-use-layout-effect": "1.1.0"
},
"peerDependencies": {
"@types/react": "*",
@@ -4567,20 +5344,13 @@
}
}
},
- "node_modules/@radix-ui/react-tabs": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz",
- "integrity": "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==",
+ "node_modules/@radix-ui/react-label": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.2.tgz",
+ "integrity": "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-presence": "1.1.2",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-roving-focus": "1.1.2",
- "@radix-ui/react-use-controllable-state": "1.1.0"
+ "@radix-ui/react-primitive": "2.0.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -4597,24 +5367,30 @@
}
}
},
- "node_modules/@radix-ui/react-tooltip": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz",
- "integrity": "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==",
+ "node_modules/@radix-ui/react-menu": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.6.tgz",
+ "integrity": "sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-collection": "1.1.2",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
"@radix-ui/react-dismissable-layer": "1.1.5",
+ "@radix-ui/react-focus-guards": "1.1.1",
+ "@radix-ui/react-focus-scope": "1.1.2",
"@radix-ui/react-id": "1.1.0",
"@radix-ui/react-popper": "1.2.2",
"@radix-ui/react-portal": "1.1.4",
"@radix-ui/react-presence": "1.1.2",
"@radix-ui/react-primitive": "2.0.2",
+ "@radix-ui/react-roving-focus": "1.1.2",
"@radix-ui/react-slot": "1.1.2",
- "@radix-ui/react-use-controllable-state": "1.1.0",
- "@radix-ui/react-visually-hidden": "1.1.2"
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
},
"peerDependencies": {
"@types/react": "*",
@@ -4631,61 +5407,112 @@
}
}
},
- "node_modules/@radix-ui/react-use-callback-ref": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
- "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
+ "node_modules/@radix-ui/react-navigation-menu": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.5.tgz",
+ "integrity": "sha512-myMHHQUZ3ZLTi8W381/Vu43Ia0NqakkQZ2vzynMmTUtQQ9kNkjzhOwkZC9TAM5R07OZUVIQyHC06f/9JZJpvvA==",
"license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-collection": "1.1.2",
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-dismissable-layer": "1.1.5",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-presence": "1.1.2",
+ "@radix-ui/react-primitive": "2.0.2",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0",
+ "@radix-ui/react-use-previous": "1.1.0",
+ "@radix-ui/react-visually-hidden": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@radix-ui/react-use-controllable-state": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
- "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-callback-ref": "1.1.0"
+ "node_modules/@radix-ui/react-popover": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.13.tgz",
+ "integrity": "sha512-84uqQV3omKDR076izYgcha6gdpN8m3z6w/AeJ83MSBJYVG/AbOHdLjAgsPZkeC/kt+k64moXFCnio8BbqXszlw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.9",
+ "@radix-ui/react-focus-guards": "1.1.2",
+ "@radix-ui/react-focus-scope": "1.1.6",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-popper": "1.2.6",
+ "@radix-ui/react-portal": "1.1.8",
+ "@radix-ui/react-presence": "1.1.4",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-slot": "1.2.2",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
},
"peerDependencies": {
"@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
}
}
},
- "node_modules/@radix-ui/react-use-escape-keydown": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz",
- "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/primitive": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz",
+ "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-arrow": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.6.tgz",
+ "integrity": "sha512-2JMfHJf/eVnwq+2dewT3C0acmCWD3XiVA1Da+jTDqo342UlU13WvXtqHhG+yJw5JeQmu4ue2eMy6gcEArLBlcw==",
"license": "MIT",
"dependencies": {
- "@radix-ui/react-use-callback-ref": "1.1.0"
+ "@radix-ui/react-primitive": "2.1.2"
},
"peerDependencies": {
"@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
}
}
},
- "node_modules/@radix-ui/react-use-layout-effect": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz",
- "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
"license": "MIT",
"peerDependencies": {
"@types/react": "*",
@@ -4697,10 +5524,10 @@
}
}
},
- "node_modules/@radix-ui/react-use-previous": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz",
- "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
"license": "MIT",
"peerDependencies": {
"@types/react": "*",
@@ -4712,32 +5539,38 @@
}
}
},
- "node_modules/@radix-ui/react-use-rect": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz",
- "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.9.tgz",
+ "integrity": "sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==",
"license": "MIT",
"dependencies": {
- "@radix-ui/rect": "1.1.0"
+ "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
}
}
},
- "node_modules/@radix-ui/react-use-size": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz",
- "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz",
+ "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==",
"license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-layout-effect": "1.1.0"
- },
"peerDependencies": {
"@types/react": "*",
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
@@ -4748,13 +5581,15 @@
}
}
},
- "node_modules/@radix-ui/react-visually-hidden": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.2.tgz",
- "integrity": "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.6.tgz",
+ "integrity": "sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==",
"license": "MIT",
"dependencies": {
- "@radix-ui/react-primitive": "2.0.2"
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
@@ -4771,1687 +5606,8483 @@
}
}
},
- "node_modules/@radix-ui/rect": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz",
- "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==",
- "license": "MIT"
- },
- "node_modules/@react-email/render": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.0.1.tgz",
- "integrity": "sha512-W3gTrcmLOVYnG80QuUp22ReIT/xfLsVJ+n7ghSlG2BITB8evNABn1AO2rGQoXuK84zKtDAlxCdm3hRyIpZdGSA==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
"license": "MIT",
"dependencies": {
- "html-to-text": "9.0.5",
- "js-beautify": "^1.14.11",
- "react-promise-suspense": "0.3.4"
- },
- "engines": {
- "node": ">=18.0.0"
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
"peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^18.0 || ^19.0 || ^19.0.0-rc"
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "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,
- "license": "MIT"
- },
- "node_modules/@rushstack/eslint-patch": {
- "version": "1.10.5",
- "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz",
- "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@selderee/plugin-htmlparser2": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz",
- "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.6.tgz",
+ "integrity": "sha512-7iqXaOWIjDBfIG7aq8CUEeCSsQMLFdn7VEE8TaFz704DtEzpPHR7w/uuzRflvKgltqSAImgcmxQ7fFX3X7wasg==",
"license": "MIT",
"dependencies": {
- "domhandler": "^5.0.3",
- "selderee": "^0.11.0"
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.1.6",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-rect": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1",
+ "@radix-ui/rect": "1.1.1"
},
- "funding": {
- "url": "https://ko-fi.com/killymxi"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
- "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-portal": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.8.tgz",
+ "integrity": "sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==",
"license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
"peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
- "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-presence": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz",
+ "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==",
"license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
"peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
- "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz",
+ "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==",
"license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.2"
},
"peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
- "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz",
+ "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==",
"license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
},
"peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
- "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
"license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
"peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
- "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
"license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "dependencies": {
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
"peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
- "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
"license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.1"
},
"peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/babel-plugin-transform-svg-component": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
- "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
"license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
"peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/babel-preset": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
- "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz",
+ "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==",
"license": "MIT",
"dependencies": {
- "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
- "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
- "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
- "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
- "@svgr/babel-plugin-transform-svg-component": "8.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "@radix-ui/rect": "1.1.1"
},
"peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/core": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
- "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-size": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
+ "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.21.3",
- "@svgr/babel-preset": "8.1.0",
- "camelcase": "^6.2.0",
- "cosmiconfig": "^8.1.3",
- "snake-case": "^3.0.4"
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
- "engines": {
- "node": ">=14"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/hast-util-to-babel-ast": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
- "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
+ "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz",
+ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-popper": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz",
+ "integrity": "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.21.3",
- "entities": "^4.4.0"
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.1.2",
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.2",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0",
+ "@radix-ui/react-use-rect": "1.1.0",
+ "@radix-ui/react-use-size": "1.1.0",
+ "@radix-ui/rect": "1.1.0"
},
- "engines": {
- "node": ">=14"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/plugin-jsx": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
- "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz",
+ "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==",
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.21.3",
- "@svgr/babel-preset": "8.1.0",
- "@svgr/hast-util-to-babel-ast": "8.0.0",
- "svg-parser": "^2.0.4"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "@radix-ui/react-primitive": "2.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
},
"peerDependencies": {
- "@svgr/core": "*"
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/plugin-svgo": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz",
- "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==",
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz",
+ "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==",
"license": "MIT",
"dependencies": {
- "cosmiconfig": "^8.1.3",
- "deepmerge": "^4.3.1",
- "svgo": "^3.0.2"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
},
"peerDependencies": {
- "@svgr/core": "*"
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@svgr/webpack": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz",
- "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==",
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz",
+ "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==",
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.21.3",
- "@babel/plugin-transform-react-constant-elements": "^7.21.3",
- "@babel/preset-env": "^7.20.2",
- "@babel/preset-react": "^7.18.6",
- "@babel/preset-typescript": "^7.21.0",
- "@svgr/core": "8.1.0",
- "@svgr/plugin-jsx": "8.1.0",
- "@svgr/plugin-svgo": "8.1.0"
- },
- "engines": {
- "node": ">=14"
+ "@radix-ui/react-slot": "1.1.2"
},
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-progress": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.2.tgz",
+ "integrity": "sha512-u1IgJFQ4zNAUTjGdDL5dcl/U8ntOR6jsnhxKb5RKp5Ozwl88xKR9EqRZOe/Mk8tnx0x5tNUe2F+MzsyjqMg0MA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz",
+ "integrity": "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-collection": "1.1.2",
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.2",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-select": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.6.tgz",
+ "integrity": "sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/number": "1.1.0",
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-collection": "1.1.2",
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-dismissable-layer": "1.1.5",
+ "@radix-ui/react-focus-guards": "1.1.1",
+ "@radix-ui/react-focus-scope": "1.1.2",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-popper": "1.2.2",
+ "@radix-ui/react-portal": "1.1.4",
+ "@radix-ui/react-primitive": "2.0.2",
+ "@radix-ui/react-slot": "1.1.2",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0",
+ "@radix-ui/react-use-previous": "1.1.0",
+ "@radix-ui/react-visually-hidden": "1.1.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-separator": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.2.tgz",
+ "integrity": "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz",
+ "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.4.tgz",
+ "integrity": "sha512-yZCky6XZFnR7pcGonJkr9VyNRu46KcYAbyg1v/gVVCZUr8UJ4x+RpncC27hHtiZ15jC+3WS8Yg/JSgyIHnYYsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-previous": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/primitive": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz",
+ "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz",
+ "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz",
+ "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-previous": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz",
+ "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-use-size": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
+ "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tabs": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz",
+ "integrity": "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-presence": "1.1.2",
+ "@radix-ui/react-primitive": "2.0.2",
+ "@radix-ui/react-roving-focus": "1.1.2",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.13.tgz",
+ "integrity": "sha512-e/e43mQAwgYs8BY4y9l99xTK6ig1bK2uXsFLOMn9IZ16lAgulSTsotcPHVT2ZlSb/ye6Sllq7IgyDB8dGhpeXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/react-collection": "1.1.6",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.9",
+ "@radix-ui/react-portal": "1.1.8",
+ "@radix-ui/react-presence": "1.1.4",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-visually-hidden": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/primitive": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz",
+ "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-collection": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.6.tgz",
+ "integrity": "sha512-PbhRFK4lIEw9ADonj48tiYWzkllz81TM7KVYyyMMw2cwHO7D5h4XKEblL8NlaRisTK3QTe6tBEhDccFUryxHBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-slot": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.9.tgz",
+ "integrity": "sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-portal": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.8.tgz",
+ "integrity": "sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-presence": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz",
+ "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz",
+ "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz",
+ "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-visually-hidden": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.2.tgz",
+ "integrity": "sha512-ORCmRUbNiZIv6uV5mhFrhsIKw4UX/N3syZtyqvry61tbGm4JlgQuSn0hk5TwCARsCjkcnuRkSdCE3xfb+ADHew==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tooltip": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz",
+ "integrity": "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.5",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-popper": "1.2.2",
+ "@radix-ui/react-portal": "1.1.4",
+ "@radix-ui/react-presence": "1.1.2",
+ "@radix-ui/react-primitive": "2.0.2",
+ "@radix-ui/react-slot": "1.1.2",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-visually-hidden": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
+ "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
+ "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-effect-event": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-effect-event/node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz",
+ "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz",
+ "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-previous": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz",
+ "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz",
+ "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/rect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz",
+ "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-visually-hidden": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.2.tgz",
+ "integrity": "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/rect": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz",
+ "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==",
+ "license": "MIT"
+ },
+ "node_modules/@react-email/render": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.0.1.tgz",
+ "integrity": "sha512-W3gTrcmLOVYnG80QuUp22ReIT/xfLsVJ+n7ghSlG2BITB8evNABn1AO2rGQoXuK84zKtDAlxCdm3hRyIpZdGSA==",
+ "license": "MIT",
+ "dependencies": {
+ "html-to-text": "9.0.5",
+ "js-beautify": "^1.14.11",
+ "react-promise-suspense": "0.3.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^18.0 || ^19.0 || ^19.0.0-rc"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz",
+ "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@selderee/plugin-htmlparser2": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz",
+ "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "^5.0.3",
+ "selderee": "^0.11.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/killymxi"
+ }
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
+ "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
+ "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
+ "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
+ "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
+ "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
+ "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
+ "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
+ "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
+ "@svgr/babel-plugin-transform-svg-component": "8.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
+ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^8.1.3",
+ "snake-case": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
+ "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.21.3",
+ "entities": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
+ "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "@svgr/hast-util-to-babel-ast": "8.0.0",
+ "svg-parser": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz",
+ "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^8.1.3",
+ "deepmerge": "^4.3.1",
+ "svgo": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/webpack": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz",
+ "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.21.3",
+ "@babel/preset-env": "^7.20.2",
+ "@babel/preset-react": "^7.18.6",
+ "@babel/preset-typescript": "^7.21.0",
+ "@svgr/core": "8.1.0",
+ "@svgr/plugin-jsx": "8.1.0",
+ "@svgr/plugin-svgo": "8.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.6.tgz",
+ "integrity": "sha512-jb6E0WeSq7OQbVYcIJ6LxnZTeC4HjMvbzFBMCrQff4R50HBlo/obmYNk6V2GCUXDeqiXtvtrQgcIbT+/boB03Q==",
+ "license": "MIT",
+ "dependencies": {
+ "enhanced-resolve": "^5.18.0",
+ "jiti": "^2.4.2",
+ "tailwindcss": "4.0.6"
+ }
+ },
+ "node_modules/@tailwindcss/node/node_modules/tailwindcss": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.6.tgz",
+ "integrity": "sha512-mysewHYJKaXgNOW6pp5xon/emCsfAMnO8WMaGKZZ35fomnR/T5gYnRg2/yRTTrtXiEl1tiVkeRt0eMO6HxEZqw==",
+ "license": "MIT"
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.6.tgz",
+ "integrity": "sha512-lVyKV2y58UE9CeKVcYykULe9QaE1dtKdxDEdrTPIdbzRgBk6bdxHNAoDqvcqXbIGXubn3VOl1O/CFF77v/EqSA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.0.6",
+ "@tailwindcss/oxide-darwin-arm64": "4.0.6",
+ "@tailwindcss/oxide-darwin-x64": "4.0.6",
+ "@tailwindcss/oxide-freebsd-x64": "4.0.6",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.6",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.0.6",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.0.6",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.0.6",
+ "@tailwindcss/oxide-linux-x64-musl": "4.0.6",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.0.6",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.0.6"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.6.tgz",
+ "integrity": "sha512-xDbym6bDPW3D2XqQqX3PjqW3CKGe1KXH7Fdkc60sX5ZLVUbzPkFeunQaoP+BuYlLc2cC1FoClrIRYnRzof9Sow==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.6.tgz",
+ "integrity": "sha512-1f71/ju/tvyGl5c2bDkchZHy8p8EK/tDHCxlpYJ1hGNvsYihZNurxVpZ0DefpN7cNc9RTT8DjrRoV8xXZKKRjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.6.tgz",
+ "integrity": "sha512-s/hg/ZPgxFIrGMb0kqyeaqZt505P891buUkSezmrDY6lxv2ixIELAlOcUVTkVh245SeaeEiUVUPiUN37cwoL2g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.6.tgz",
+ "integrity": "sha512-Z3Wo8FWZnmio8+xlcbb7JUo/hqRMSmhQw8IGIRoRJ7GmLR0C+25Wq+bEX/135xe/yEle2lFkhu9JBHd4wZYiig==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.6.tgz",
+ "integrity": "sha512-SNSwkkim1myAgmnbHs4EjXsPL7rQbVGtjcok5EaIzkHkCAVK9QBQsWeP2Jm2/JJhq4wdx8tZB9Y7psMzHYWCkA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.6.tgz",
+ "integrity": "sha512-tJ+mevtSDMQhKlwCCuhsFEFg058kBiSy4TkoeBG921EfrHKmexOaCyFKYhVXy4JtkaeeOcjJnCLasEeqml4i+Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.6.tgz",
+ "integrity": "sha512-IoArz1vfuTR4rALXMUXI/GWWfx2EaO4gFNtBNkDNOYhlTD4NVEwE45nbBoojYiTulajI4c2XH8UmVEVJTOJKxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.6.tgz",
+ "integrity": "sha512-QtsUfLkEAeWAC3Owx9Kg+7JdzE+k9drPhwTAXbXugYB9RZUnEWWx5x3q/au6TvUYcL+n0RBqDEO2gucZRvRFgQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.6.tgz",
+ "integrity": "sha512-QthvJqIji2KlGNwLcK/PPYo7w1Wsi/8NK0wAtRGbv4eOPdZHkQ9KUk+oCoP20oPO7i2a6X1aBAFQEL7i08nNMA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.6.tgz",
+ "integrity": "sha512-+oka+dYX8jy9iP00DJ9Y100XsqvbqR5s0yfMZJuPR1H/lDVtDfsZiSix1UFBQ3X1HWxoEEl6iXNJHWd56TocVw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.6.tgz",
+ "integrity": "sha512-+o+juAkik4p8Ue/0LiflQXPmVatl6Av3LEZXpBTfg4qkMIbZdhCGWFzHdt2NjoMiLOJCFDddoV6GYaimvK1Olw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/postcss": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.0.6.tgz",
+ "integrity": "sha512-noTaGPHjGCXTCc487TWnfAEN0VMjqDAecssWDOsfxV2hFrcZR0AHthX7IdY/0xHTg/EtpmIPdssddlZ5/B7JnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "@tailwindcss/node": "^4.0.6",
+ "@tailwindcss/oxide": "^4.0.6",
+ "lightningcss": "^1.29.1",
+ "postcss": "^8.4.41",
+ "tailwindcss": "4.0.6"
+ }
+ },
+ "node_modules/@tailwindcss/postcss/node_modules/postcss": {
+ "version": "8.5.2",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
+ "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
+ "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"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.6.tgz",
+ "integrity": "sha512-mysewHYJKaXgNOW6pp5xon/emCsfAMnO8WMaGKZZ35fomnR/T5gYnRg2/yRTTrtXiEl1tiVkeRt0eMO6HxEZqw==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@ts-morph/common": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.19.0.tgz",
+ "integrity": "sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-glob": "^3.2.12",
+ "minimatch": "^7.4.3",
+ "mkdirp": "^2.1.6",
+ "path-browserify": "^1.0.1"
+ }
+ },
+ "node_modules/@ts-morph/common/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==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@ts-morph/common/node_modules/minimatch": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz",
+ "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@ts-morph/common/node_modules/mkdirp": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz",
+ "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==",
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
+ "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/bcrypt": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz",
+ "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bcryptjs": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz",
+ "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint__eslintrc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@types/eslint__eslintrc/-/eslint__eslintrc-2.1.2.tgz",
+ "integrity": "sha512-qXvzPFY7Rz05xD8ZApXJ3S8xStQD2Ibzu3EFIF0UMNOAfLY5xUu3H61q0JrHo2OXD6rcFG75yUxNQbkKtFKBSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint": "*"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "29.5.14",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz",
+ "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expect": "^29.0.0",
+ "pretty-format": "^29.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@types/jest/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "20.17.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.13.tgz",
+ "integrity": "sha512-RNf+4dEeV69PIvyp++4IKM2vnLXtmp/JovfeQm5P5+qpKb6wHoH7INywLdZ7z+gVX46kgBP/fwJJvZYaHxtdyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.19.2"
+ }
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/pg": {
+ "version": "8.11.11",
+ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.11.tgz",
+ "integrity": "sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "pg-protocol": "*",
+ "pg-types": "^4.0.1"
+ }
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.14",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "19.0.7",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.7.tgz",
+ "integrity": "sha512-MoFsEJKkAtZCrC1r6CM8U22GzhG7u2Wir8ons/aCKH6MBdD1ibV24zOSSkdZVUKqN5i396zG5VKLYZ3yaUZdLA==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.0.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.3.tgz",
+ "integrity": "sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==",
+ "devOptional": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.0.0"
+ }
+ },
+ "node_modules/@types/react-syntax-highlighter": {
+ "version": "15.5.13",
+ "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz",
+ "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-transition-group": {
+ "version": "4.4.12",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
+ "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz",
+ "integrity": "sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.20.0",
+ "@typescript-eslint/type-utils": "8.20.0",
+ "@typescript-eslint/utils": "8.20.0",
+ "@typescript-eslint/visitor-keys": "8.20.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.3.1",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.20.0.tgz",
+ "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.20.0",
+ "@typescript-eslint/types": "8.20.0",
+ "@typescript-eslint/typescript-estree": "8.20.0",
+ "@typescript-eslint/visitor-keys": "8.20.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz",
+ "integrity": "sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.20.0",
+ "@typescript-eslint/visitor-keys": "8.20.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.20.0.tgz",
+ "integrity": "sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "8.20.0",
+ "@typescript-eslint/utils": "8.20.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.20.0.tgz",
+ "integrity": "sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.20.0.tgz",
+ "integrity": "sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.20.0",
+ "@typescript-eslint/visitor-keys": "8.20.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/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,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "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.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/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,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.20.0.tgz",
+ "integrity": "sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "8.20.0",
+ "@typescript-eslint/types": "8.20.0",
+ "@typescript-eslint/typescript-estree": "8.20.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.8.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.20.0.tgz",
+ "integrity": "sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.20.0",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "license": "ISC"
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "license": "ISC"
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "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/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,
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/aproba": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
+ "license": "ISC"
+ },
+ "node_modules/are-we-there-yet": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+ "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
+ "dependencies": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz",
+ "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "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.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "license": "MIT",
+ "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.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,
+ "license": "MIT",
+ "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.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ast-types": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
+ "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.16",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
+ "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.10",
+ "caniuse-lite": "^1.0.30001538",
+ "fraction.js": "^4.3.6",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.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,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
+ "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/transform": "^29.7.0",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^29.6.3",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-istanbul/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,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.1.14",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-macros/node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.12",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz",
+ "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.3",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+ "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "core-js-compat": "^3.38.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz",
+ "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz",
+ "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "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==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/bcrypt": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
+ "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mapbox/node-pre-gyp": "^1.0.11",
+ "node-addon-api": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/bcryptjs": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
+ "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==",
+ "license": "MIT"
+ },
+ "node_modules/better-sqlite3": {
+ "version": "11.9.1",
+ "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.9.1.tgz",
+ "integrity": "sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "bindings": "^1.5.0",
+ "prebuild-install": "^7.1.1"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
+ "node_modules/bl": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
+ "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^6.0.3",
+ "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==",
+ "license": "ISC"
+ },
+ "node_modules/bootstrap": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz",
+ "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ],
+ "license": "MIT",
+ "peerDependencies": {
+ "@popperjs/core": "^2.11.8"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "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"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "9.1.3",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-9.1.3.tgz",
+ "integrity": "sha512-Rircqi9ch8AnZscQcsA1C47NFdaO3wukpmIRzYcDOrmvgt78hM/sj5pZhZNec2NM12uk5vTwRHZ4anGcrC4ZTg==",
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "^8.0.0",
+ "map-obj": "5.0.0",
+ "quick-lru": "^6.1.1",
+ "type-fest": "^4.3.2"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/camelcase": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz",
+ "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/quick-lru": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz",
+ "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001692",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
+ "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
+ "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"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "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/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "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,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
+ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/class-variance-authority": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "clsx": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://polar.sh/cva"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
+ "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
+ "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,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/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,
+ "license": "MIT",
+ "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/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cmdk": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz",
+ "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "^1.1.1",
+ "@radix-ui/react-dialog": "^1.1.6",
+ "@radix-ui/react-id": "^1.1.0",
+ "@radix-ui/react-primitive": "^2.0.2"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19 || ^19.0.0-rc",
+ "react-dom": "^18 || ^19 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/code-block-writer": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz",
+ "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==",
+ "license": "MIT"
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "license": "ISC",
+ "bin": {
+ "color-support": "bin.js"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+ "license": "ISC"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
+ "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.40.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz",
+ "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.24.3"
+ },
+ "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==",
+ "license": "MIT",
+ "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/create-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+ "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "prompts": "^2.0.1"
+ },
+ "bin": {
+ "create-jest": "bin/create-jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/create-jest/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/create-jest/node_modules/jest-config": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/test-sequencer": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.7.0",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/create-jest/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/create-jest/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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==",
+ "license": "BSD-2-Clause",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "BSD-2-Clause",
+ "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,
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz",
+ "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/dedent": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+ "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "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/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "license": "MIT"
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/diff": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+ "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/discontinuous-range": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
+ "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==",
+ "license": "MIT"
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "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-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.7",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
+ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/drizzle-kit": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.1.tgz",
+ "integrity": "sha512-PUjYKWtzOzPtdtQlTHQG3qfv4Y0XT8+Eas6UbxCmxTj7qgMf+39dDujf1BP1I+qqZtw9uzwTh8jYtkMuCq+B0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@drizzle-team/brocli": "^0.10.2",
+ "@esbuild-kit/esm-loader": "^2.5.5",
+ "esbuild": "^0.25.2",
+ "esbuild-register": "^3.5.0"
+ },
+ "bin": {
+ "drizzle-kit": "bin.cjs"
+ }
+ },
+ "node_modules/drizzle-orm": {
+ "version": "0.41.0",
+ "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.41.0.tgz",
+ "integrity": "sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "@aws-sdk/client-rds-data": ">=3",
+ "@cloudflare/workers-types": ">=4",
+ "@electric-sql/pglite": ">=0.2.0",
+ "@libsql/client": ">=0.10.0",
+ "@libsql/client-wasm": ">=0.10.0",
+ "@neondatabase/serverless": ">=0.10.0",
+ "@op-engineering/op-sqlite": ">=2",
+ "@opentelemetry/api": "^1.4.1",
+ "@planetscale/database": ">=1",
+ "@prisma/client": "*",
+ "@tidbcloud/serverless": "*",
+ "@types/better-sqlite3": "*",
+ "@types/pg": "*",
+ "@types/sql.js": "*",
+ "@vercel/postgres": ">=0.8.0",
+ "@xata.io/client": "*",
+ "better-sqlite3": ">=7",
+ "bun-types": "*",
+ "expo-sqlite": ">=14.0.0",
+ "gel": ">=2",
+ "knex": "*",
+ "kysely": "*",
+ "mysql2": ">=2",
+ "pg": ">=8",
+ "postgres": ">=3",
+ "sql.js": ">=1",
+ "sqlite3": ">=5"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/client-rds-data": {
+ "optional": true
+ },
+ "@cloudflare/workers-types": {
+ "optional": true
+ },
+ "@electric-sql/pglite": {
+ "optional": true
+ },
+ "@libsql/client": {
+ "optional": true
+ },
+ "@libsql/client-wasm": {
+ "optional": true
+ },
+ "@neondatabase/serverless": {
+ "optional": true
+ },
+ "@op-engineering/op-sqlite": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@planetscale/database": {
+ "optional": true
+ },
+ "@prisma/client": {
+ "optional": true
+ },
+ "@tidbcloud/serverless": {
+ "optional": true
+ },
+ "@types/better-sqlite3": {
+ "optional": true
+ },
+ "@types/pg": {
+ "optional": true
+ },
+ "@types/sql.js": {
+ "optional": true
+ },
+ "@vercel/postgres": {
+ "optional": true
+ },
+ "@xata.io/client": {
+ "optional": true
+ },
+ "better-sqlite3": {
+ "optional": true
+ },
+ "bun-types": {
+ "optional": true
+ },
+ "expo-sqlite": {
+ "optional": true
+ },
+ "gel": {
+ "optional": true
+ },
+ "knex": {
+ "optional": true
+ },
+ "kysely": {
+ "optional": true
+ },
+ "mysql2": {
+ "optional": true
+ },
+ "pg": {
+ "optional": true
+ },
+ "postgres": {
+ "optional": true
+ },
+ "prisma": {
+ "optional": true
+ },
+ "sql.js": {
+ "optional": true
+ },
+ "sqlite3": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
+ "node_modules/editorconfig": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
+ "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@one-ini/wasm": "0.1.1",
+ "commander": "^10.0.0",
+ "minimatch": "9.0.1",
+ "semver": "^7.5.3"
+ },
+ "bin": {
+ "editorconfig": "bin/editorconfig"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/editorconfig/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==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/editorconfig/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/editorconfig/node_modules/minimatch": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+ "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.88",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz",
+ "integrity": "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==",
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz",
+ "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/error-ex/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==",
+ "license": "MIT"
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.9",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz",
+ "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.0",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-regex": "^1.2.1",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.0",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.3",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.18"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.6",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.4",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz",
+ "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.4",
+ "@esbuild/android-arm": "0.25.4",
+ "@esbuild/android-arm64": "0.25.4",
+ "@esbuild/android-x64": "0.25.4",
+ "@esbuild/darwin-arm64": "0.25.4",
+ "@esbuild/darwin-x64": "0.25.4",
+ "@esbuild/freebsd-arm64": "0.25.4",
+ "@esbuild/freebsd-x64": "0.25.4",
+ "@esbuild/linux-arm": "0.25.4",
+ "@esbuild/linux-arm64": "0.25.4",
+ "@esbuild/linux-ia32": "0.25.4",
+ "@esbuild/linux-loong64": "0.25.4",
+ "@esbuild/linux-mips64el": "0.25.4",
+ "@esbuild/linux-ppc64": "0.25.4",
+ "@esbuild/linux-riscv64": "0.25.4",
+ "@esbuild/linux-s390x": "0.25.4",
+ "@esbuild/linux-x64": "0.25.4",
+ "@esbuild/netbsd-arm64": "0.25.4",
+ "@esbuild/netbsd-x64": "0.25.4",
+ "@esbuild/openbsd-arm64": "0.25.4",
+ "@esbuild/openbsd-x64": "0.25.4",
+ "@esbuild/sunos-x64": "0.25.4",
+ "@esbuild/win32-arm64": "0.25.4",
+ "@esbuild/win32-ia32": "0.25.4",
+ "@esbuild/win32-x64": "0.25.4"
+ }
+ },
+ "node_modules/esbuild-register": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
+ "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.12 <1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz",
+ "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.19.0",
+ "@eslint/core": "^0.10.0",
+ "@eslint/eslintrc": "^3.2.0",
+ "@eslint/js": "9.18.0",
+ "@eslint/plugin-kit": "^0.2.5",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.1",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.2.0",
+ "eslint-visitor-keys": "^4.2.0",
+ "espree": "^10.3.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.1.0.tgz",
+ "integrity": "sha512-gADO+nKVseGso3DtOrYX9H7TxB/MuX7AUYhMlvQMqLYvUWu4HrOQuU7cC1HW74tHIqkAvXdwgAz3TCbczzSEXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "15.1.0",
+ "@rushstack/eslint-patch": "^1.10.3",
+ "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-jsx-a11y": "^6.10.0",
+ "eslint-plugin-react": "^7.37.0",
+ "eslint-plugin-react-hooks": "^5.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz",
+ "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "eslint-config-prettier": "build/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,
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz",
+ "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@nolyfill/is-core-module": "1.0.39",
+ "debug": "^4.3.7",
+ "enhanced-resolve": "^5.15.0",
+ "fast-glob": "^3.3.2",
+ "get-tsconfig": "^4.7.5",
+ "is-bun-module": "^1.0.2",
+ "is-glob": "^4.0.3",
+ "stable-hash": "^0.0.4"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*",
+ "eslint-plugin-import-x": "*"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-import": {
+ "optional": true
+ },
+ "eslint-plugin-import-x": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript/node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "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.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript/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,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "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/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "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,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz",
+ "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz",
+ "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "license": "MIT",
+ "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/eslint-plugin-react/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,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
+ "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "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,
+ "license": "BSD-2-Clause",
+ "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,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/execa": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz",
+ "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.1",
+ "human-signals": "^4.3.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^3.0.7",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || ^16.14.0 || >=18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "dev": true,
+ "license": "(MIT OR WTFPL)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/expect-utils": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "license": "MIT",
+ "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==",
+ "license": "ISC",
+ "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,
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
+ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fault": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
+ "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
+ "license": "MIT",
+ "dependencies": {
+ "format": "^0.2.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
+ "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/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==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fs-extra": {
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
+ "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "license": "ISC"
+ },
+ "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,
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gauge": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+ "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.2",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.1",
+ "object-assign": "^4.1.1",
+ "signal-exit": "^3.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "wide-align": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz",
+ "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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",
+ "license": "ISC",
+ "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,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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==",
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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,
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+ "license": "ISC"
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
+ "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-sanitize": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz",
+ "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "unist-util-position": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
+ "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
+ "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "comma-separated-tokens": "^1.0.0",
+ "hast-util-parse-selector": "^2.0.0",
+ "property-information": "^5.0.0",
+ "space-separated-tokens": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript/node_modules/@types/hast": {
+ "version": "2.3.10",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz",
+ "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2"
+ }
+ },
+ "node_modules/hastscript/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/hastscript/node_modules/comma-separated-tokens": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/hastscript/node_modules/property-information": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
+ "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/hastscript/node_modules/space-separated-tokens": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/highlightjs-vue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz",
+ "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/html-to-text": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz",
+ "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==",
+ "license": "MIT",
+ "dependencies": {
+ "@selderee/plugin-htmlparser2": "^0.11.0",
+ "deepmerge": "^4.3.1",
+ "dom-serializer": "^2.0.0",
+ "htmlparser2": "^8.0.2",
+ "selderee": "^0.11.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/html-url-attributes": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
+ "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
+ "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/i": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz",
+ "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz",
+ "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "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.",
+ "license": "ISC",
+ "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==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
+ "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==",
+ "license": "MIT"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz",
+ "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz",
+ "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bun-module": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz",
+ "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.6.3"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
"funding": {
"type": "github",
- "url": "https://github.com/sponsors/gregberge"
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/@swc/counter": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
- "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
- "license": "Apache-2.0"
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "node_modules/@swc/helpers": {
- "version": "0.5.15",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
- "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
- "license": "Apache-2.0",
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "tslib": "^2.8.0"
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@tailwindcss/node": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.6.tgz",
- "integrity": "sha512-jb6E0WeSq7OQbVYcIJ6LxnZTeC4HjMvbzFBMCrQff4R50HBlo/obmYNk6V2GCUXDeqiXtvtrQgcIbT+/boB03Q==",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "enhanced-resolve": "^5.18.0",
- "jiti": "^2.4.2",
- "tailwindcss": "4.0.6"
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.0",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@tailwindcss/node/node_modules/tailwindcss": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.6.tgz",
- "integrity": "sha512-mysewHYJKaXgNOW6pp5xon/emCsfAMnO8WMaGKZZ35fomnR/T5gYnRg2/yRTTrtXiEl1tiVkeRt0eMO6HxEZqw==",
- "license": "MIT"
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "node_modules/@tailwindcss/oxide": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.6.tgz",
- "integrity": "sha512-lVyKV2y58UE9CeKVcYykULe9QaE1dtKdxDEdrTPIdbzRgBk6bdxHNAoDqvcqXbIGXubn3VOl1O/CFF77v/EqSA==",
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
+ "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
"license": "MIT",
"engines": {
- "node": ">= 10"
+ "node": ">=12"
},
- "optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.0.6",
- "@tailwindcss/oxide-darwin-arm64": "4.0.6",
- "@tailwindcss/oxide-darwin-x64": "4.0.6",
- "@tailwindcss/oxide-freebsd-x64": "4.0.6",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.6",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.0.6",
- "@tailwindcss/oxide-linux-arm64-musl": "4.0.6",
- "@tailwindcss/oxide-linux-x64-gnu": "4.0.6",
- "@tailwindcss/oxide-linux-x64-musl": "4.0.6",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.0.6",
- "@tailwindcss/oxide-win32-x64-msvc": "4.0.6"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.6.tgz",
- "integrity": "sha512-xDbym6bDPW3D2XqQqX3PjqW3CKGe1KXH7Fdkc60sX5ZLVUbzPkFeunQaoP+BuYlLc2cC1FoClrIRYnRzof9Sow==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
"engines": {
- "node": ">= 10"
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.6.tgz",
- "integrity": "sha512-1f71/ju/tvyGl5c2bDkchZHy8p8EK/tDHCxlpYJ1hGNvsYihZNurxVpZ0DefpN7cNc9RTT8DjrRoV8xXZKKRjg==",
- "cpu": [
- "arm64"
- ],
+ "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==",
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
"engines": {
- "node": ">= 10"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.6.tgz",
- "integrity": "sha512-s/hg/ZPgxFIrGMb0kqyeaqZt505P891buUkSezmrDY6lxv2ixIELAlOcUVTkVh245SeaeEiUVUPiUN37cwoL2g==",
- "cpu": [
- "x64"
- ],
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.6.tgz",
- "integrity": "sha512-Z3Wo8FWZnmio8+xlcbb7JUo/hqRMSmhQw8IGIRoRJ7GmLR0C+25Wq+bEX/135xe/yEle2lFkhu9JBHd4wZYiig==",
- "cpu": [
- "x64"
- ],
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.6.tgz",
- "integrity": "sha512-SNSwkkim1myAgmnbHs4EjXsPL7rQbVGtjcok5EaIzkHkCAVK9QBQsWeP2Jm2/JJhq4wdx8tZB9Y7psMzHYWCkA==",
- "cpu": [
- "arm"
- ],
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.6.tgz",
- "integrity": "sha512-tJ+mevtSDMQhKlwCCuhsFEFg058kBiSy4TkoeBG921EfrHKmexOaCyFKYhVXy4JtkaeeOcjJnCLasEeqml4i+Q==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/is-unicode-supported": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
+ "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
"engines": {
- "node": ">= 10"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.6.tgz",
- "integrity": "sha512-IoArz1vfuTR4rALXMUXI/GWWfx2EaO4gFNtBNkDNOYhlTD4NVEwE45nbBoojYiTulajI4c2XH8UmVEVJTOJKxA==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
"engines": {
- "node": ">= 10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.6.tgz",
- "integrity": "sha512-QtsUfLkEAeWAC3Owx9Kg+7JdzE+k9drPhwTAXbXugYB9RZUnEWWx5x3q/au6TvUYcL+n0RBqDEO2gucZRvRFgQ==",
- "cpu": [
- "x64"
- ],
+ "node_modules/is-weakref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz",
+ "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "dependencies": {
+ "call-bound": "^1.0.2"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.6.tgz",
- "integrity": "sha512-QthvJqIji2KlGNwLcK/PPYo7w1Wsi/8NK0wAtRGbv4eOPdZHkQ9KUk+oCoP20oPO7i2a6X1aBAFQEL7i08nNMA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.6.tgz",
- "integrity": "sha512-+oka+dYX8jy9iP00DJ9Y100XsqvbqR5s0yfMZJuPR1H/lDVtDfsZiSix1UFBQ3X1HWxoEEl6iXNJHWd56TocVw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">= 10"
+ "node": ">=8"
}
},
- "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.6.tgz",
- "integrity": "sha512-+o+juAkik4p8Ue/0LiflQXPmVatl6Av3LEZXpBTfg4qkMIbZdhCGWFzHdt2NjoMiLOJCFDddoV6GYaimvK1Olw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
"engines": {
- "node": ">= 10"
+ "node": ">=10"
}
},
- "node_modules/@tailwindcss/postcss": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.0.6.tgz",
- "integrity": "sha512-noTaGPHjGCXTCc487TWnfAEN0VMjqDAecssWDOsfxV2hFrcZR0AHthX7IdY/0xHTg/EtpmIPdssddlZ5/B7JnQ==",
- "license": "MIT",
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@alloc/quick-lru": "^5.2.0",
- "@tailwindcss/node": "^4.0.6",
- "@tailwindcss/oxide": "^4.0.6",
- "lightningcss": "^1.29.1",
- "postcss": "^8.4.41",
- "tailwindcss": "4.0.6"
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/@tailwindcss/postcss/node_modules/postcss": {
- "version": "8.5.2",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
- "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
- "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"
- }
- ],
+ "node_modules/istanbul-lib-report/node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.8",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
+ "semver": "^7.5.3"
},
"engines": {
- "node": "^10 || ^12 || >=14"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.6.tgz",
- "integrity": "sha512-mysewHYJKaXgNOW6pp5xon/emCsfAMnO8WMaGKZZ35fomnR/T5gYnRg2/yRTTrtXiEl1tiVkeRt0eMO6HxEZqw==",
- "license": "MIT"
- },
- "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==",
- "license": "ISC",
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
"engines": {
- "node": ">=10.13.0"
+ "node": ">=10"
}
},
- "node_modules/@ts-morph/common": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.19.0.tgz",
- "integrity": "sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==",
- "license": "MIT",
+ "node_modules/istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "fast-glob": "^3.2.12",
- "minimatch": "^7.4.3",
- "mkdirp": "^2.1.6",
- "path-browserify": "^1.0.1"
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@ts-morph/common/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==",
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/@ts-morph/common/node_modules/minimatch": {
- "version": "7.4.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz",
- "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==",
- "license": "ISC",
+ "node_modules/jackspeak": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz",
+ "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "@isaacs/cliui": "^8.0.2"
},
"engines": {
- "node": ">=10"
+ "node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@ts-morph/common/node_modules/mkdirp": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz",
- "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==",
+ "node_modules/jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
+ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "import-local": "^3.0.2",
+ "jest-cli": "^29.7.0"
+ },
"bin": {
- "mkdirp": "dist/cjs/src/bin.js"
+ "jest": "bin/jest.js"
},
"engines": {
- "node": ">=10"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
}
},
- "node_modules/@types/bcryptjs": {
- "version": "2.4.6",
- "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz",
- "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/eslint": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
- "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "node_modules/jest-changed-files": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
+ "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
+ "execa": "^5.0.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@types/eslint__eslintrc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@types/eslint__eslintrc/-/eslint__eslintrc-2.1.2.tgz",
- "integrity": "sha512-qXvzPFY7Rz05xD8ZApXJ3S8xStQD2Ibzu3EFIF0UMNOAfLY5xUu3H61q0JrHo2OXD6rcFG75yUxNQbkKtFKBSw==",
+ "node_modules/jest-changed-files/node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/eslint": "*"
+ "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/@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,
- "license": "MIT"
- },
- "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==",
+ "node_modules/jest-changed-files/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,
- "license": "MIT"
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
},
- "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==",
+ "node_modules/jest-changed-files/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,
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "20.17.13",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.13.tgz",
- "integrity": "sha512-RNf+4dEeV69PIvyp++4IKM2vnLXtmp/JovfeQm5P5+qpKb6wHoH7INywLdZ7z+gVX46kgBP/fwJJvZYaHxtdyw==",
- "devOptional": true,
"license": "MIT",
- "dependencies": {
- "undici-types": "~6.19.2"
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@types/parse-json": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
- "license": "MIT"
- },
- "node_modules/@types/pg": {
- "version": "8.11.10",
- "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.10.tgz",
- "integrity": "sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==",
- "devOptional": true,
+ "node_modules/jest-changed-files/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,
"license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "pg-protocol": "*",
- "pg-types": "^4.0.1"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@types/prop-types": {
- "version": "15.7.14",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
- "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
- "license": "MIT"
- },
- "node_modules/@types/react": {
- "version": "19.0.7",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.7.tgz",
- "integrity": "sha512-MoFsEJKkAtZCrC1r6CM8U22GzhG7u2Wir8ons/aCKH6MBdD1ibV24zOSSkdZVUKqN5i396zG5VKLYZ3yaUZdLA==",
+ "node_modules/jest-changed-files/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,
"license": "MIT",
"dependencies": {
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "19.0.3",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.3.tgz",
- "integrity": "sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==",
- "devOptional": true,
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "^19.0.0"
- }
- },
- "node_modules/@types/react-transition-group": {
- "version": "4.4.12",
- "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
- "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*"
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz",
- "integrity": "sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==",
+ "node_modules/jest-changed-files/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,
"license": "MIT",
"dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.20.0",
- "@typescript-eslint/type-utils": "8.20.0",
- "@typescript-eslint/utils": "8.20.0",
- "@typescript-eslint/visitor-keys": "8.20.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.3.1",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.0.0"
+ "mimic-fn": "^2.1.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=6"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-changed-files/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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@typescript-eslint/parser": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.20.0.tgz",
- "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==",
+ "node_modules/jest-circus": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
+ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.20.0",
- "@typescript-eslint/types": "8.20.0",
- "@typescript-eslint/typescript-estree": "8.20.0",
- "@typescript-eslint/visitor-keys": "8.20.0",
- "debug": "^4.3.4"
- },
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^1.0.0",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^29.7.0",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "^29.7.0",
+ "pure-rand": "^6.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=10"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz",
- "integrity": "sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==",
+ "node_modules/jest-circus/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.20.0",
- "@typescript-eslint/visitor-keys": "8.20.0"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@typescript-eslint/type-utils": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.20.0.tgz",
- "integrity": "sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==",
+ "node_modules/jest-circus/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-cli": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
+ "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.20.0",
- "@typescript-eslint/utils": "8.20.0",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.0.0"
+ "@jest/core": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "create-jest": "^29.7.0",
+ "exit": "^0.1.2",
+ "import-local": "^3.0.2",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "yargs": "^17.3.1"
},
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "bin": {
+ "jest": "bin/jest.js"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
}
},
- "node_modules/@typescript-eslint/types": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.20.0.tgz",
- "integrity": "sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==",
+ "node_modules/jest-cli/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=10"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.20.0.tgz",
- "integrity": "sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==",
+ "node_modules/jest-cli/node_modules/jest-config": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.20.0",
- "@typescript-eslint/visitor-keys": "8.20.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.0.0"
+ "@babel/core": "^7.11.6",
+ "@jest/test-sequencer": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.7.0",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.8.0"
+ "@types/node": "*",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
}
},
- "node_modules/@typescript-eslint/typescript-estree/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==",
+ "node_modules/jest-cli/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "node_modules/jest-cli/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
"dev": true,
"license": "MIT",
"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.8"
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
},
"engines": {
- "node": ">=8.6.0"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@typescript-eslint/typescript-estree/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==",
+ "node_modules/jest-diff/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-diff/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "is-glob": "^4.0.1"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
"engines": {
- "node": ">= 6"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "node_modules/jest-diff/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"dev": true,
- "license": "ISC",
+ "license": "MIT"
+ },
+ "node_modules/jest-docblock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
+ "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "detect-newline": "^3.0.0"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@typescript-eslint/utils": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.20.0.tgz",
- "integrity": "sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==",
+ "node_modules/jest-each": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
+ "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.20.0",
- "@typescript-eslint/types": "8.20.0",
- "@typescript-eslint/typescript-estree": "8.20.0"
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "pretty-format": "^29.7.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-each/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.20.0.tgz",
- "integrity": "sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==",
+ "node_modules/jest-each/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.20.0",
- "eslint-visitor-keys": "^4.2.0"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "license": "ISC"
+ "node_modules/jest-each/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/acorn": {
- "version": "8.14.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
- "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "node_modules/jest-environment-node": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
"dev": true,
"license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
},
"engines": {
- "node": ">=0.4.0"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.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==",
+ "node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
"dev": true,
"license": "MIT",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "node_modules/jest-haste-map": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "debug": "4"
+ "@jest/types": "^29.6.3",
+ "@types/graceful-fs": "^4.1.3",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.8"
},
"engines": {
- "node": ">= 6.0.0"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
}
},
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "node_modules/jest-leak-detector": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
+ "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
"dev": true,
"license": "MIT",
"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"
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "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==",
+ "node_modules/jest-leak-detector/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "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==",
+ "node_modules/jest-leak-detector/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "node_modules/jest-leak-detector/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"dev": true,
"license": "MIT"
},
- "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==",
+ "node_modules/jest-matcher-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
},
"engines": {
- "node": ">= 8"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/aproba": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
- "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
- "license": "ISC"
+ "node_modules/jest-matcher-utils/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
},
- "node_modules/are-we-there-yet": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
- "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
- "deprecated": "This package is no longer supported.",
- "license": "ISC",
+ "node_modules/jest-matcher-utils/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "delegates": "^1.0.0",
- "readable-stream": "^3.6.0"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
"engines": {
- "node": ">=10"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/arg": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
- "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "node_modules/jest-matcher-utils/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"dev": true,
"license": "MIT"
},
- "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==",
- "license": "Python-2.0"
- },
- "node_modules/aria-hidden": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz",
- "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==",
+ "node_modules/jest-message-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "tslib": "^2.0.0"
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^29.6.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
},
"engines": {
- "node": ">=10"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/aria-query": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
- "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "node_modules/jest-message-util/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
- "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "node_modules/jest-message-util/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3",
- "is-array-buffer": "^3.0.5"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "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==",
+ "node_modules/jest-message-util/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
"dev": true,
"license": "MIT",
"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"
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/array.prototype.findlast": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
- "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
"dev": true,
"license": "MIT",
- "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"
+ "node": ">=6"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
}
},
- "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==",
+ "node_modules/jest-regex-util": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
"dev": true,
"license": "MIT",
- "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": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/array.prototype.flat": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
- "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "node_modules/jest-resolve": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
+ "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-shim-unscopables": "^1.0.2"
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^2.0.0",
+ "slash": "^3.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
- "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "node_modules/jest-resolve-dependencies": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
+ "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-shim-unscopables": "^1.0.2"
+ "jest-regex-util": "^29.6.3",
+ "jest-snapshot": "^29.7.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/array.prototype.tosorted": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
- "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "node_modules/jest-runner": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
+ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.3",
- "es-errors": "^1.3.0",
- "es-shim-unscopables": "^1.0.2"
+ "@jest/console": "^29.7.0",
+ "@jest/environment": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-leak-detector": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-resolve": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
- "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "node_modules/jest-runner/node_modules/source-map-support": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "is-array-buffer": "^3.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
}
},
- "node_modules/ast-types": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
- "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
+ "node_modules/jest-runtime": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
+ "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "tslib": "^2.0.1"
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/globals": "^29.7.0",
+ "@jest/source-map": "^29.6.3",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
},
"engines": {
- "node": ">=4"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/ast-types-flow": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
- "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "node_modules/jest-runtime/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,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/autoprefixer": {
- "version": "10.4.16",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
- "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
+ "node_modules/jest-snapshot": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
+ "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
"dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/autoprefixer"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
"license": "MIT",
"dependencies": {
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001538",
- "fraction.js": "^4.3.6",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.0",
- "postcss-value-parser": "^4.2.0"
- },
- "bin": {
- "autoprefixer": "bin/autoprefixer"
+ "@babel/core": "^7.11.6",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-jsx": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/types": "^7.3.3",
+ "@jest/expect-utils": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^29.7.0",
+ "semver": "^7.5.3"
},
"engines": {
- "node": "^10 || ^12 || >=14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.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==",
+ "node_modules/jest-snapshot/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "possible-typed-array-names": "^1.0.0"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/axe-core": {
- "version": "4.10.2",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
- "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
+ "node_modules/jest-snapshot/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
- "license": "MPL-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
"engines": {
- "node": ">=4"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/axobject-query": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
- "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "node_modules/jest-snapshot/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 0.4"
- }
+ "license": "MIT"
},
- "node_modules/babel-plugin-macros": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
- "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.12.5",
- "cosmiconfig": "^7.0.0",
- "resolve": "^1.19.0"
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
},
"engines": {
- "node": ">=10",
- "npm": ">=6"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/babel-plugin-macros/node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "node_modules/jest-validate": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
+ "@jest/types": "^29.6.3",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "leven": "^3.1.0",
+ "pretty-format": "^29.7.0"
},
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.12",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz",
- "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==",
+ "node_modules/jest-validate/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.22.6",
- "@babel/helper-define-polyfill-provider": "^0.6.3",
- "semver": "^6.3.1"
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
+ "node_modules/jest-validate/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.10.6",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
- "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
+ "node_modules/jest-watcher": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
+ "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.2",
- "core-js-compat": "^3.38.0"
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "jest-util": "^29.7.0",
+ "string-length": "^4.0.1"
},
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz",
- "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==",
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.3"
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.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==",
- "license": "MIT"
- },
- "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==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/bcrypt": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
- "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
- "hasInstallScript": true,
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@mapbox/node-pre-gyp": "^1.0.11",
- "node-addon-api": "^5.0.0"
+ "has-flag": "^4.0.0"
},
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/bcryptjs": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
- "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==",
- "license": "MIT"
+ "node_modules/jiti": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
},
- "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,
+ "node_modules/jose": {
+ "version": "4.15.9",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz",
+ "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==",
"license": "MIT",
- "engines": {
- "node": ">=8"
- },
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/panva"
}
},
- "node_modules/bl": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
- "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
+ "node_modules/js-beautify": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.2.tgz",
+ "integrity": "sha512-mcG6CHJxxih+EFAbd5NEBwrosIs6MoJmiNLFYN6kj5SeJMf7n29Ii/H4lt6zGTvmdB9AApuj5cs4zydjuLeqjw==",
"license": "MIT",
"dependencies": {
- "buffer": "^6.0.3",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
+ "config-chain": "^1.1.13",
+ "editorconfig": "^1.0.4",
+ "glob": "^11.0.0",
+ "js-cookie": "^3.0.5",
+ "nopt": "^8.0.0"
+ },
+ "bin": {
+ "css-beautify": "js/bin/css-beautify.js",
+ "html-beautify": "js/bin/html-beautify.js",
+ "js-beautify": "js/bin/js-beautify.js"
+ },
+ "engines": {
+ "node": ">=14"
}
},
- "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==",
- "license": "ISC"
+ "node_modules/js-beautify/node_modules/abbrev": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz",
+ "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
- "node_modules/bootstrap": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz",
- "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/twbs"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/bootstrap"
- }
- ],
+ "node_modules/js-beautify/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==",
"license": "MIT",
- "peerDependencies": {
- "@popperjs/core": "^2.11.8"
+ "dependencies": {
+ "balanced-match": "^1.0.0"
}
},
- "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==",
- "license": "MIT",
+ "node_modules/js-beautify/node_modules/glob": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
+ "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==",
+ "license": "ISC",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^4.0.1",
+ "minimatch": "^10.0.0",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^2.0.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "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==",
- "license": "MIT",
+ "node_modules/js-beautify/node_modules/minimatch": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
+ "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+ "license": "ISC",
"dependencies": {
- "fill-range": "^7.1.1"
+ "brace-expansion": "^2.0.1"
},
"engines": {
- "node": ">=8"
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/browserslist": {
- "version": "4.24.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
- "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
- "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"
- }
- ],
- "license": "MIT",
+ "node_modules/js-beautify/node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/js-beautify/node_modules/nopt": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
+ "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
+ "license": "ISC",
"dependencies": {
- "caniuse-lite": "^1.0.30001688",
- "electron-to-chromium": "^1.5.73",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.1"
+ "abbrev": "^3.0.0"
},
"bin": {
- "browserslist": "cli.js"
+ "nopt": "bin/nopt.js"
},
"engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "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/js-cookie": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
+ "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
"license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
+ "engines": {
+ "node": ">=14"
}
},
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "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==",
"license": "MIT"
},
- "node_modules/busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "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==",
+ "license": "MIT",
"dependencies": {
- "streamsearch": "^1.1.0"
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
},
"engines": {
- "node": ">=10.16.0"
+ "node": ">=6"
}
},
- "node_modules/call-bind": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
- "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "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,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz",
+ "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==",
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.0",
- "es-define-property": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.2"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "isarray": "^2.0.5",
+ "jsonify": "^0.0.1",
+ "object-keys": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
@@ -6460,3810 +14091,4292 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/call-bind-apply-helpers": {
+ "node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
- "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+ "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,
+ "license": "MIT"
+ },
+ "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,
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
+ "minimist": "^1.2.0"
},
- "engines": {
- "node": ">= 0.4"
+ "bin": {
+ "json5": "lib/cli.js"
}
},
- "node_modules/call-bound": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
- "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
- "dev": true,
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "get-intrinsic": "^1.2.6"
- },
- "engines": {
- "node": ">= 0.4"
+ "universalify": "^2.0.0"
},
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz",
+ "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==",
+ "license": "Public Domain",
"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==",
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
"engines": {
- "node": ">=6"
+ "node": ">=4.0"
}
},
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "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,
"license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "dependencies": {
+ "json-buffer": "3.0.1"
}
},
- "node_modules/camelcase-css": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
- "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
- "dev": true,
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
"license": "MIT",
"engines": {
- "node": ">= 6"
+ "node": ">=6"
}
},
- "node_modules/caniuse-lite": {
- "version": "1.0.30001692",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz",
- "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==",
- "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"
- }
- ],
- "license": "CC-BY-4.0"
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "dev": true,
+ "license": "CC0-1.0"
},
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "language-subtag-registry": "^0.3.20"
},
"engines": {
- "node": ">=10"
- },
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/leac": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz",
+ "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==",
+ "license": "MIT",
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://ko-fi.com/killymxi"
}
},
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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,
"license": "MIT",
"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"
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
},
"engines": {
- "node": ">= 8.10.0"
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz",
+ "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
},
"funding": {
- "url": "https://paulmillr.com/funding/"
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
- "fsevents": "~2.3.2"
+ "lightningcss-darwin-arm64": "1.29.1",
+ "lightningcss-darwin-x64": "1.29.1",
+ "lightningcss-freebsd-x64": "1.29.1",
+ "lightningcss-linux-arm-gnueabihf": "1.29.1",
+ "lightningcss-linux-arm64-gnu": "1.29.1",
+ "lightningcss-linux-arm64-musl": "1.29.1",
+ "lightningcss-linux-x64-gnu": "1.29.1",
+ "lightningcss-linux-x64-musl": "1.29.1",
+ "lightningcss-win32-arm64-msvc": "1.29.1",
+ "lightningcss-win32-x64-msvc": "1.29.1"
}
},
- "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,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz",
+ "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">= 6"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "license": "ISC",
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz",
+ "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=10"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/class-variance-authority": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
- "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
- "license": "Apache-2.0",
- "dependencies": {
- "clsx": "^2.1.1"
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz",
+ "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
},
"funding": {
- "url": "https://polar.sh/cva"
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/cli-cursor": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
- "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
- "license": "MIT",
- "dependencies": {
- "restore-cursor": "^4.0.0"
- },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz",
+ "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">= 12.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "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==",
- "license": "MIT",
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz",
+ "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6"
+ "node": ">= 12.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/client-only": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
- "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
- "license": "MIT"
- },
- "node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "license": "MIT",
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz",
+ "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=0.8"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
- "license": "MIT",
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz",
+ "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/code-block-writer": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz",
- "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==",
- "license": "MIT"
- },
- "node_modules/color": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
- "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
- "license": "MIT",
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz",
+ "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
"optional": true,
- "dependencies": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
- },
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=12.5.0"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "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==",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz",
+ "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=7.0.0"
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "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==",
- "license": "MIT"
- },
- "node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
- "license": "MIT",
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.29.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz",
+ "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
"optional": true,
- "dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
- "license": "ISC",
+ "node_modules/lightningcss/node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "license": "Apache-2.0",
"bin": {
- "color-support": "bin.js"
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
}
},
- "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==",
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 10"
+ "node": ">=10"
}
},
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "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==",
"license": "MIT"
},
- "node_modules/config-chain": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
- "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "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,
"license": "MIT",
"dependencies": {
- "ini": "^1.3.4",
- "proto-list": "~1.2.1"
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
- "license": "ISC"
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
},
- "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==",
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"license": "MIT"
},
- "node_modules/cookie": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
- "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
+ "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,
+ "license": "MIT"
},
- "node_modules/core-js-compat": {
- "version": "3.40.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz",
- "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==",
+ "node_modules/log-symbols": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz",
+ "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==",
"license": "MIT",
"dependencies": {
- "browserslist": "^4.24.3"
+ "chalk": "^5.0.0",
+ "is-unicode-supported": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=12"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
+ "node_modules/log-symbols/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
"license": "MIT",
- "dependencies": {
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0",
- "path-type": "^4.0.0"
- },
"engines": {
- "node": ">=14"
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/d-fischer"
- },
- "peerDependencies": {
- "typescript": ">=4.9.5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
"license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "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==",
- "license": "BSD-2-Clause",
- "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"
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "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==",
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"license": "MIT",
"dependencies": {
- "mdn-data": "2.0.30",
- "source-map-js": "^1.0.1"
+ "js-tokens": "^3.0.0 || ^4.0.0"
},
- "engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ "bin": {
+ "loose-envify": "cli.js"
}
},
- "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==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
}
},
- "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,
+ "node_modules/lowlight": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
+ "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
"license": "MIT",
- "bin": {
- "cssesc": "bin/cssesc"
+ "dependencies": {
+ "fault": "^1.0.0",
+ "highlight.js": "~10.7.0"
},
- "engines": {
- "node": ">=4"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/csso": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
- "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
- "license": "MIT",
+ "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==",
+ "license": "ISC",
"dependencies": {
- "css-tree": "~2.2.0"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
- "npm": ">=7.0.0"
+ "node": ">=10"
}
},
- "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==",
+ "node_modules/lucide-react": {
+ "version": "0.475.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.475.0.tgz",
+ "integrity": "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"license": "MIT",
"dependencies": {
- "mdn-data": "2.0.28",
- "source-map-js": "^1.0.1"
+ "semver": "^6.0.0"
},
"engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
- "npm": ">=7.0.0"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
- "license": "CC0-1.0"
- },
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "license": "MIT"
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
},
- "node_modules/damerau-levenshtein": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
- "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
"dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/data-uri-to-buffer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
- "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
- "license": "MIT",
- "engines": {
- "node": ">= 12"
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tmpl": "1.0.5"
}
},
- "node_modules/data-view-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
- "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
- "dev": true,
+ "node_modules/map-obj": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.0.tgz",
+ "integrity": "sha512-2L3MIgJynYrZ3TYMriLDLWocz15okFakV6J12HXvMXDHui2x/zgChzg1u9mFFGbbGWE+GsLpQByt4POb9Or+uA==",
"license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.2"
- },
"engines": {
- "node": ">= 0.4"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/data-view-byte-length": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
- "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
- "dev": true,
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
"license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
"funding": {
- "url": "https://github.com/sponsors/inspect-js"
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/data-view-byte-offset": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
- "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
- "dev": true,
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- },
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
"license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
},
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "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,
- "license": "MIT"
- },
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
"license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
- "license": "MIT",
- "dependencies": {
- "clone": "^1.0.2"
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "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==",
- "dev": true,
+ "node_modules/mdast-util-gfm": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
"license": "MIT",
"dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
+ "mdast-util-gfm-footnote": "^2.0.0",
+ "mdast-util-gfm-strikethrough": "^2.0.0",
+ "mdast-util-gfm-table": "^2.0.0",
+ "mdast-util-gfm-task-list-item": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "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,
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
"license": "MIT",
"dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
+ "@types/mdast": "^4.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-find-and-replace": "^3.0.0",
+ "micromark-util-character": "^2.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
- "license": "MIT"
- },
- "node_modules/detect-libc": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
- "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/detect-node-es": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
- "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
- "license": "MIT"
- },
- "node_modules/didyoumean": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
- "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/diff": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
- "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.3.1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/dlv": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/doctrine": {
+ "node_modules/mdast-util-gfm-footnote": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "license": "Apache-2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+ "license": "MIT",
"dependencies": {
- "esutils": "^2.0.2"
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0"
},
- "engines": {
- "node": ">=0.10.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/dom-serializer": {
+ "node_modules/mdast-util-gfm-table": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
- "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
"license": "MIT",
"dependencies": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.2",
- "entities": "^4.2.0"
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "markdown-table": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
},
"funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "license": "BSD-2-Clause"
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
},
- "node_modules/domhandler": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
- "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
- "license": "BSD-2-Clause",
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "license": "MIT",
"dependencies": {
- "domelementtype": "^2.3.0"
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
},
- "engines": {
- "node": ">= 4"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
},
"funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/domutils": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
- "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
- "license": "BSD-2-Clause",
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "license": "MIT",
"dependencies": {
- "dom-serializer": "^2.0.0",
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3"
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
},
"funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
"license": "MIT",
"dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/drizzle-kit": {
- "version": "0.30.1",
- "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.30.1.tgz",
- "integrity": "sha512-HmA/NeewvHywhJ2ENXD3KvOuM/+K2dGLJfxVfIHsGwaqKICJnS+Ke2L6UcSrSrtMJLJaT0Im1Qv4TFXfaZShyw==",
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+ "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
"license": "MIT",
"dependencies": {
- "@drizzle-team/brocli": "^0.10.2",
- "@esbuild-kit/esm-loader": "^2.5.5",
- "esbuild": "^0.19.7",
- "esbuild-register": "^3.5.0"
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
},
- "bin": {
- "drizzle-kit": "bin.cjs"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/drizzle-orm": {
- "version": "0.38.3",
- "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.38.3.tgz",
- "integrity": "sha512-w41Y+PquMpSff/QDRGdItG0/aWca+/J3Sda9PPGkTxBtjWQvgU1jxlFBXdjog5tYvTu58uvi3PwR1NuCx0KeZg==",
- "license": "Apache-2.0",
- "peerDependencies": {
- "@aws-sdk/client-rds-data": ">=3",
- "@cloudflare/workers-types": ">=4",
- "@electric-sql/pglite": ">=0.2.0",
- "@libsql/client": ">=0.10.0",
- "@libsql/client-wasm": ">=0.10.0",
- "@neondatabase/serverless": ">=0.10.0",
- "@op-engineering/op-sqlite": ">=2",
- "@opentelemetry/api": "^1.4.1",
- "@planetscale/database": ">=1",
- "@prisma/client": "*",
- "@tidbcloud/serverless": "*",
- "@types/better-sqlite3": "*",
- "@types/pg": "*",
- "@types/react": ">=18",
- "@types/sql.js": "*",
- "@vercel/postgres": ">=0.8.0",
- "@xata.io/client": "*",
- "better-sqlite3": ">=7",
- "bun-types": "*",
- "expo-sqlite": ">=14.0.0",
- "knex": "*",
- "kysely": "*",
- "mysql2": ">=2",
- "pg": ">=8",
- "postgres": ">=3",
- "react": ">=18",
- "sql.js": ">=1",
- "sqlite3": ">=5"
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
},
- "peerDependenciesMeta": {
- "@aws-sdk/client-rds-data": {
- "optional": true
- },
- "@cloudflare/workers-types": {
- "optional": true
- },
- "@electric-sql/pglite": {
- "optional": true
- },
- "@libsql/client": {
- "optional": true
- },
- "@libsql/client-wasm": {
- "optional": true
- },
- "@neondatabase/serverless": {
- "optional": true
- },
- "@op-engineering/op-sqlite": {
- "optional": true
- },
- "@opentelemetry/api": {
- "optional": true
- },
- "@planetscale/database": {
- "optional": true
- },
- "@prisma/client": {
- "optional": true
- },
- "@tidbcloud/serverless": {
- "optional": true
- },
- "@types/better-sqlite3": {
- "optional": true
- },
- "@types/pg": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- },
- "@types/sql.js": {
- "optional": true
- },
- "@vercel/postgres": {
- "optional": true
- },
- "@xata.io/client": {
- "optional": true
- },
- "better-sqlite3": {
- "optional": true
- },
- "bun-types": {
- "optional": true
- },
- "expo-sqlite": {
- "optional": true
- },
- "knex": {
- "optional": true
- },
- "kysely": {
- "optional": true
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "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==",
+ "license": "CC0-1.0"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
},
- "mysql2": {
- "optional": true
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
},
- "pg": {
- "optional": true
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
+ "micromark-extension-gfm-footnote": "^2.0.0",
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
+ "micromark-extension-gfm-table": "^2.0.0",
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
},
- "postgres": {
- "optional": true
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
},
- "prisma": {
- "optional": true
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
},
- "react": {
- "optional": true
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
},
- "sql.js": {
- "optional": true
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
},
- "sqlite3": {
- "optional": true
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
}
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
}
},
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "dev": true,
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
- "engines": {
- "node": ">= 0.4"
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
}
},
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "license": "MIT"
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
},
- "node_modules/editorconfig": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
- "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==",
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "@one-ini/wasm": "0.1.1",
- "commander": "^10.0.0",
- "minimatch": "9.0.1",
- "semver": "^7.5.3"
- },
- "bin": {
- "editorconfig": "bin/editorconfig"
- },
- "engines": {
- "node": ">=14"
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
}
},
- "node_modules/editorconfig/node_modules/brace-expansion": {
+ "node_modules/micromark-util-combine-extensions": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
}
},
- "node_modules/editorconfig/node_modules/commander": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
- "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
"license": "MIT",
- "engines": {
- "node": ">=14"
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
}
},
- "node_modules/editorconfig/node_modules/minimatch": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
- "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
- "license": "ISC",
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
}
},
- "node_modules/electron-to-chromium": {
- "version": "1.5.88",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz",
- "integrity": "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==",
- "license": "ISC"
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
},
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
"license": "MIT"
},
- "node_modules/enhanced-resolve": {
- "version": "5.18.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz",
- "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==",
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
}
},
- "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==",
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
"license": "MIT",
"dependencies": {
- "is-arrayish": "^0.2.1"
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
}
},
- "node_modules/error-ex/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==",
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
"license": "MIT"
},
- "node_modules/es-abstract": {
- "version": "1.23.9",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz",
- "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
- "dev": true,
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"license": "MIT",
"dependencies": {
- "array-buffer-byte-length": "^1.0.2",
- "arraybuffer.prototype.slice": "^1.0.4",
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "data-view-buffer": "^1.0.2",
- "data-view-byte-length": "^1.0.2",
- "data-view-byte-offset": "^1.0.1",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-set-tostringtag": "^2.1.0",
- "es-to-primitive": "^1.3.0",
- "function.prototype.name": "^1.1.8",
- "get-intrinsic": "^1.2.7",
- "get-proto": "^1.0.0",
- "get-symbol-description": "^1.1.0",
- "globalthis": "^1.0.4",
- "gopd": "^1.2.0",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "internal-slot": "^1.1.0",
- "is-array-buffer": "^3.0.5",
- "is-callable": "^1.2.7",
- "is-data-view": "^1.0.2",
- "is-regex": "^1.2.1",
- "is-shared-array-buffer": "^1.0.4",
- "is-string": "^1.1.1",
- "is-typed-array": "^1.1.15",
- "is-weakref": "^1.1.0",
- "math-intrinsics": "^1.1.0",
- "object-inspect": "^1.13.3",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.7",
- "own-keys": "^1.0.1",
- "regexp.prototype.flags": "^1.5.3",
- "safe-array-concat": "^1.1.3",
- "safe-push-apply": "^1.0.0",
- "safe-regex-test": "^1.1.0",
- "set-proto": "^1.0.0",
- "string.prototype.trim": "^1.2.10",
- "string.prototype.trimend": "^1.0.9",
- "string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.3",
- "typed-array-byte-length": "^1.0.3",
- "typed-array-byte-offset": "^1.0.4",
- "typed-array-length": "^1.0.7",
- "unbox-primitive": "^1.1.0",
- "which-typed-array": "^1.1.18"
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8.6"
}
},
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "dev": true,
+ "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==",
"license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
+ "node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/es-iterator-helpers": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
- "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
- "dev": true,
- "license": "MIT",
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
"dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.6",
- "es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.0.3",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.6",
- "globalthis": "^1.0.4",
- "gopd": "^1.2.0",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.2.0",
- "has-symbols": "^1.1.0",
- "internal-slot": "^1.1.0",
- "iterator.prototype": "^1.1.4",
- "safe-array-concat": "^1.1.3"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">= 0.4"
+ "node": "*"
}
},
- "node_modules/es-object-atoms": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.0.tgz",
- "integrity": "sha512-Ujz8Al/KfOVR7fkaghAB1WvnLsdYxHDWmfoi2vlA2jZWRg31XhIC1a4B+/I24muD8iSbHxJ1JkrfqmWb65P/Mw==",
- "dev": true,
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
- },
+ "node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "license": "ISC",
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "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,
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"license": "MIT",
"dependencies": {
- "hasown": "^2.0.0"
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/es-to-primitive": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
- "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
- "dev": true,
- "license": "MIT",
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
"dependencies": {
- "is-callable": "^1.2.7",
- "is-date-object": "^1.0.5",
- "is-symbol": "^1.0.4"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8"
}
},
- "node_modules/esbuild": {
- "version": "0.19.12",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
- "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
- "hasInstallScript": true,
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"license": "MIT",
"bin": {
- "esbuild": "bin/esbuild"
+ "mkdirp": "bin/cmd.js"
},
"engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.19.12",
- "@esbuild/android-arm": "0.19.12",
- "@esbuild/android-arm64": "0.19.12",
- "@esbuild/android-x64": "0.19.12",
- "@esbuild/darwin-arm64": "0.19.12",
- "@esbuild/darwin-x64": "0.19.12",
- "@esbuild/freebsd-arm64": "0.19.12",
- "@esbuild/freebsd-x64": "0.19.12",
- "@esbuild/linux-arm": "0.19.12",
- "@esbuild/linux-arm64": "0.19.12",
- "@esbuild/linux-ia32": "0.19.12",
- "@esbuild/linux-loong64": "0.19.12",
- "@esbuild/linux-mips64el": "0.19.12",
- "@esbuild/linux-ppc64": "0.19.12",
- "@esbuild/linux-riscv64": "0.19.12",
- "@esbuild/linux-s390x": "0.19.12",
- "@esbuild/linux-x64": "0.19.12",
- "@esbuild/netbsd-x64": "0.19.12",
- "@esbuild/openbsd-x64": "0.19.12",
- "@esbuild/sunos-x64": "0.19.12",
- "@esbuild/win32-arm64": "0.19.12",
- "@esbuild/win32-ia32": "0.19.12",
- "@esbuild/win32-x64": "0.19.12"
+ "node": ">=10"
+ }
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
}
},
- "node_modules/esbuild-register": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
- "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
+ "node_modules/moo": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
+ "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==",
+ "license": "BSD-3-Clause"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "debug": "^4.3.4"
- },
- "peerDependencies": {
- "esbuild": ">=0.12 <1"
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
}
},
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
"license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
"engines": {
- "node": ">=6"
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
- "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==",
+ "node_modules/napi-build-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
+ "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/nearley": {
+ "version": "2.20.1",
+ "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz",
+ "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==",
"license": "MIT",
- "engines": {
- "node": ">=10"
+ "dependencies": {
+ "commander": "^2.19.0",
+ "moo": "^0.5.0",
+ "railroad-diagrams": "^1.0.0",
+ "randexp": "0.4.6"
+ },
+ "bin": {
+ "nearley-railroad": "bin/nearley-railroad.js",
+ "nearley-test": "bin/nearley-test.js",
+ "nearley-unparse": "bin/nearley-unparse.js",
+ "nearleyc": "bin/nearleyc.js"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "individual",
+ "url": "https://nearley.js.org/#give-to-nearley"
}
},
- "node_modules/eslint": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz",
- "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==",
- "dev": true,
+ "node_modules/nearley/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT"
+ },
+ "node_modules/next": {
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.3.2.tgz",
+ "integrity": "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==",
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.12.1",
- "@eslint/config-array": "^0.19.0",
- "@eslint/core": "^0.10.0",
- "@eslint/eslintrc": "^3.2.0",
- "@eslint/js": "9.18.0",
- "@eslint/plugin-kit": "^0.2.5",
- "@humanfs/node": "^0.16.6",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@humanwhocodes/retry": "^0.4.1",
- "@types/estree": "^1.0.6",
- "@types/json-schema": "^7.0.15",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.6",
- "debug": "^4.3.2",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^8.2.0",
- "eslint-visitor-keys": "^4.2.0",
- "espree": "^10.3.0",
- "esquery": "^1.5.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^8.0.0",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3"
+ "@next/env": "15.3.2",
+ "@swc/counter": "0.1.3",
+ "@swc/helpers": "0.5.15",
+ "busboy": "1.6.0",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
},
"bin": {
- "eslint": "bin/eslint.js"
+ "next": "dist/bin/next"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
},
- "funding": {
- "url": "https://eslint.org/donate"
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "15.3.2",
+ "@next/swc-darwin-x64": "15.3.2",
+ "@next/swc-linux-arm64-gnu": "15.3.2",
+ "@next/swc-linux-arm64-musl": "15.3.2",
+ "@next/swc-linux-x64-gnu": "15.3.2",
+ "@next/swc-linux-x64-musl": "15.3.2",
+ "@next/swc-win32-arm64-msvc": "15.3.2",
+ "@next/swc-win32-x64-msvc": "15.3.2",
+ "sharp": "^0.34.1"
},
"peerDependencies": {
- "jiti": "*"
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.41.2",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "sass": "^1.3.0"
},
"peerDependenciesMeta": {
- "jiti": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
"optional": true
}
}
},
- "node_modules/eslint-config-next": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.1.0.tgz",
- "integrity": "sha512-gADO+nKVseGso3DtOrYX9H7TxB/MuX7AUYhMlvQMqLYvUWu4HrOQuU7cC1HW74tHIqkAvXdwgAz3TCbczzSEXw==",
- "dev": true,
- "license": "MIT",
+ "node_modules/next-auth": {
+ "version": "4.24.11",
+ "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.11.tgz",
+ "integrity": "sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==",
+ "license": "ISC",
"dependencies": {
- "@next/eslint-plugin-next": "15.1.0",
- "@rushstack/eslint-patch": "^1.10.3",
- "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
- "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
- "eslint-import-resolver-node": "^0.3.6",
- "eslint-import-resolver-typescript": "^3.5.2",
- "eslint-plugin-import": "^2.31.0",
- "eslint-plugin-jsx-a11y": "^6.10.0",
- "eslint-plugin-react": "^7.37.0",
- "eslint-plugin-react-hooks": "^5.0.0"
+ "@babel/runtime": "^7.20.13",
+ "@panva/hkdf": "^1.0.2",
+ "cookie": "^0.7.0",
+ "jose": "^4.15.5",
+ "oauth": "^0.9.15",
+ "openid-client": "^5.4.0",
+ "preact": "^10.6.3",
+ "preact-render-to-string": "^5.1.19",
+ "uuid": "^8.3.2"
},
"peerDependencies": {
- "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0",
- "typescript": ">=3.3.1"
+ "@auth/core": "0.34.2",
+ "next": "^12.2.5 || ^13 || ^14 || ^15",
+ "nodemailer": "^6.6.5",
+ "react": "^17.0.2 || ^18 || ^19",
+ "react-dom": "^17.0.2 || ^18 || ^19"
},
"peerDependenciesMeta": {
- "typescript": {
+ "@auth/core": {
+ "optional": true
+ },
+ "nodemailer": {
"optional": true
}
}
},
- "node_modules/eslint-config-prettier": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz",
- "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==",
- "dev": true,
+ "node_modules/next-auth/node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/next-themes": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.4.tgz",
+ "integrity": "sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==",
"license": "MIT",
- "bin": {
- "eslint-config-prettier": "build/bin/cli.js"
- },
"peerDependencies": {
- "eslint": ">=7.0.0"
+ "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
}
},
- "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,
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
"license": "MIT",
"dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.13.0",
- "resolve": "^1.22.4"
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
}
},
- "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==",
+ "node_modules/node-abi": {
+ "version": "3.74.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz",
+ "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ms": "^2.1.1"
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/eslint-import-resolver-typescript": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz",
- "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==",
- "dev": true,
- "license": "ISC",
+ "node_modules/node-addon-api": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
+ "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
+ "license": "MIT"
+ },
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.5.0"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
"dependencies": {
- "@nolyfill/is-core-module": "1.0.39",
- "debug": "^4.3.7",
- "enhanced-resolve": "^5.15.0",
- "fast-glob": "^3.3.2",
- "get-tsconfig": "^4.7.5",
- "is-bun-module": "^1.0.2",
- "is-glob": "^4.0.3",
- "stable-hash": "^0.0.4"
+ "whatwg-url": "^5.0.0"
},
"engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
+ "node": "4.x || >=6.0.0"
},
"peerDependencies": {
- "eslint": "*",
- "eslint-plugin-import": "*",
- "eslint-plugin-import-x": "*"
+ "encoding": "^0.1.0"
},
"peerDependenciesMeta": {
- "eslint-plugin-import": {
- "optional": true
- },
- "eslint-plugin-import-x": {
+ "encoding": {
"optional": true
}
}
},
- "node_modules/eslint-import-resolver-typescript/node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
"dev": true,
- "license": "MIT",
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "license": "MIT"
+ },
+ "node_modules/nopt": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+ "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "license": "ISC",
"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.8"
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
},
"engines": {
- "node": ">=8.6.0"
+ "node": ">=6"
}
},
- "node_modules/eslint-import-resolver-typescript/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==",
+ "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,
- "license": "ISC",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-11.2.0.tgz",
+ "integrity": "sha512-PcnFC6gTo9VDkxVaQ1/mZAS3JoWrDjAI+a6e2NgfYQSGDwftJlbdV0jBMi2V8xQPqbGcWaa7p3UP0SKF+Bhm2g==",
+ "bundleDependencies": [
+ "@isaacs/string-locale-compare",
+ "@npmcli/arborist",
+ "@npmcli/config",
+ "@npmcli/fs",
+ "@npmcli/map-workspaces",
+ "@npmcli/package-json",
+ "@npmcli/promise-spawn",
+ "@npmcli/redact",
+ "@npmcli/run-script",
+ "@sigstore/tuf",
+ "abbrev",
+ "archy",
+ "cacache",
+ "chalk",
+ "ci-info",
+ "cli-columns",
+ "fastest-levenshtein",
+ "fs-minipass",
+ "glob",
+ "graceful-fs",
+ "hosted-git-info",
+ "ini",
+ "init-package-json",
+ "is-cidr",
+ "json-parse-even-better-errors",
+ "libnpmaccess",
+ "libnpmdiff",
+ "libnpmexec",
+ "libnpmfund",
+ "libnpmorg",
+ "libnpmpack",
+ "libnpmpublish",
+ "libnpmsearch",
+ "libnpmteam",
+ "libnpmversion",
+ "make-fetch-happen",
+ "minimatch",
+ "minipass",
+ "minipass-pipeline",
+ "ms",
+ "node-gyp",
+ "nopt",
+ "normalize-package-data",
+ "npm-audit-report",
+ "npm-install-checks",
+ "npm-package-arg",
+ "npm-pick-manifest",
+ "npm-profile",
+ "npm-registry-fetch",
+ "npm-user-validate",
+ "p-map",
+ "pacote",
+ "parse-conflict-json",
+ "proc-log",
+ "qrcode-terminal",
+ "read",
+ "semver",
+ "spdx-expression-parse",
+ "ssri",
+ "supports-color",
+ "tar",
+ "text-table",
+ "tiny-relative-date",
+ "treeverse",
+ "validate-npm-package-name",
+ "which"
+ ],
+ "dev": true,
+ "license": "Artistic-2.0",
+ "workspaces": [
+ "docs",
+ "smoke-tests",
+ "mock-globals",
+ "mock-registry",
+ "workspaces/*"
+ ],
"dependencies": {
- "is-glob": "^4.0.1"
+ "@isaacs/string-locale-compare": "^1.1.0",
+ "@npmcli/arborist": "^9.0.1",
+ "@npmcli/config": "^10.1.0",
+ "@npmcli/fs": "^4.0.0",
+ "@npmcli/map-workspaces": "^4.0.2",
+ "@npmcli/package-json": "^6.1.1",
+ "@npmcli/promise-spawn": "^8.0.2",
+ "@npmcli/redact": "^3.1.1",
+ "@npmcli/run-script": "^9.0.1",
+ "@sigstore/tuf": "^3.0.0",
+ "abbrev": "^3.0.0",
+ "archy": "~1.0.0",
+ "cacache": "^19.0.1",
+ "chalk": "^5.4.1",
+ "ci-info": "^4.1.0",
+ "cli-columns": "^4.0.0",
+ "fastest-levenshtein": "^1.0.16",
+ "fs-minipass": "^3.0.3",
+ "glob": "^10.4.5",
+ "graceful-fs": "^4.2.11",
+ "hosted-git-info": "^8.0.2",
+ "ini": "^5.0.0",
+ "init-package-json": "^8.0.0",
+ "is-cidr": "^5.1.1",
+ "json-parse-even-better-errors": "^4.0.0",
+ "libnpmaccess": "^10.0.0",
+ "libnpmdiff": "^8.0.1",
+ "libnpmexec": "^10.1.0",
+ "libnpmfund": "^7.0.1",
+ "libnpmorg": "^8.0.0",
+ "libnpmpack": "^9.0.1",
+ "libnpmpublish": "^11.0.0",
+ "libnpmsearch": "^9.0.0",
+ "libnpmteam": "^8.0.0",
+ "libnpmversion": "^8.0.0",
+ "make-fetch-happen": "^14.0.3",
+ "minimatch": "^9.0.5",
+ "minipass": "^7.1.1",
+ "minipass-pipeline": "^1.2.4",
+ "ms": "^2.1.2",
+ "node-gyp": "^11.1.0",
+ "nopt": "^8.1.0",
+ "normalize-package-data": "^7.0.0",
+ "npm-audit-report": "^6.0.0",
+ "npm-install-checks": "^7.1.1",
+ "npm-package-arg": "^12.0.2",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-profile": "^11.0.1",
+ "npm-registry-fetch": "^18.0.2",
+ "npm-user-validate": "^3.0.0",
+ "p-map": "^7.0.3",
+ "pacote": "^21.0.0",
+ "parse-conflict-json": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "qrcode-terminal": "^0.12.0",
+ "read": "^4.1.0",
+ "semver": "^7.7.1",
+ "spdx-expression-parse": "^4.0.0",
+ "ssri": "^12.0.0",
+ "supports-color": "^10.0.0",
+ "tar": "^6.2.1",
+ "text-table": "~0.2.0",
+ "tiny-relative-date": "^1.3.0",
+ "treeverse": "^3.0.0",
+ "validate-npm-package-name": "^6.0.0",
+ "which": "^5.0.0"
+ },
+ "bin": {
+ "npm": "bin/npm-cli.js",
+ "npx": "bin/npx-cli.js"
},
"engines": {
- "node": ">= 6"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "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,
+ "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==",
"license": "MIT",
"dependencies": {
- "debug": "^3.2.7"
+ "path-key": "^4.0.0"
},
"engines": {
- "node": ">=4"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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,
+ "node_modules/npm-run-path/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==",
"license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
+ "node_modules/npm/node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"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"
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
},
"engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ "node": ">=12"
}
},
- "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==",
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "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==",
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
"dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
+ "inBundle": true,
+ "license": "MIT"
},
- "node_modules/eslint-plugin-jsx-a11y": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
- "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "aria-query": "^5.3.2",
- "array-includes": "^3.1.8",
- "array.prototype.flatmap": "^1.3.2",
- "ast-types-flow": "^0.0.8",
- "axe-core": "^4.10.0",
- "axobject-query": "^4.1.0",
- "damerau-levenshtein": "^1.0.8",
+ "eastasianwidth": "^0.2.0",
"emoji-regex": "^9.2.2",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^3.3.5",
- "language-tags": "^1.0.9",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.8",
- "safe-regex-test": "^1.0.3",
- "string.prototype.includes": "^2.0.1"
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": ">=4.0"
+ "node": ">=12"
},
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-plugin-react": {
- "version": "7.37.4",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz",
- "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==",
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "array-includes": "^3.1.8",
- "array.prototype.findlast": "^1.2.5",
- "array.prototype.flatmap": "^1.3.3",
- "array.prototype.tosorted": "^1.1.4",
- "doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.2.1",
- "estraverse": "^5.3.0",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.8",
- "object.fromentries": "^2.0.8",
- "object.values": "^1.2.1",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.5",
- "semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.12",
- "string.prototype.repeat": "^1.0.0"
+ "ansi-regex": "^6.0.1"
},
"engines": {
- "node": ">=4"
+ "node": ">=12"
},
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/eslint-plugin-react-hooks": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz",
- "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==",
+ "node_modules/npm/node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
},
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ "engines": {
+ "node": ">=18.0.0"
}
},
- "node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.5",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
- "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "node_modules/npm/node_modules/@isaacs/string-locale-compare": {
+ "version": "1.1.0",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/@npmcli/agent": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/eslint-plugin-react/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/npm/node_modules/@npmcli/arborist": {
+ "version": "9.0.1",
"dev": true,
+ "inBundle": true,
"license": "ISC",
+ "dependencies": {
+ "@isaacs/string-locale-compare": "^1.1.0",
+ "@npmcli/fs": "^4.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/map-workspaces": "^4.0.1",
+ "@npmcli/metavuln-calculator": "^9.0.0",
+ "@npmcli/name-from-folder": "^3.0.0",
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^6.0.1",
+ "@npmcli/query": "^4.0.0",
+ "@npmcli/redact": "^3.0.0",
+ "@npmcli/run-script": "^9.0.1",
+ "bin-links": "^5.0.0",
+ "cacache": "^19.0.1",
+ "common-ancestor-path": "^1.0.1",
+ "hosted-git-info": "^8.0.0",
+ "json-stringify-nice": "^1.1.4",
+ "lru-cache": "^10.2.2",
+ "minimatch": "^9.0.4",
+ "nopt": "^8.0.0",
+ "npm-install-checks": "^7.1.0",
+ "npm-package-arg": "^12.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^18.0.1",
+ "pacote": "^21.0.0",
+ "parse-conflict-json": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "proggy": "^3.0.0",
+ "promise-all-reject-late": "^1.0.0",
+ "promise-call-limit": "^3.0.1",
+ "read-package-json-fast": "^4.0.0",
+ "semver": "^7.3.7",
+ "ssri": "^12.0.0",
+ "treeverse": "^3.0.0",
+ "walk-up-path": "^4.0.0"
+ },
"bin": {
- "semver": "bin/semver.js"
+ "arborist": "bin/index.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/eslint-scope": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
- "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+ "node_modules/npm/node_modules/@npmcli/config": {
+ "version": "10.1.0",
"dev": true,
- "license": "BSD-2-Clause",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
+ "@npmcli/map-workspaces": "^4.0.1",
+ "@npmcli/package-json": "^6.0.1",
+ "ci-info": "^4.0.0",
+ "ini": "^5.0.0",
+ "nopt": "^8.1.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "walk-up-path": "^4.0.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/eslint-visitor-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "node_modules/npm/node_modules/@npmcli/fs": {
+ "version": "4.0.0",
"dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "semver": "^7.3.5"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/espree": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
- "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "node_modules/npm/node_modules/@npmcli/git": {
+ "version": "6.0.3",
"dev": true,
- "license": "BSD-2-Clause",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "acorn": "^8.14.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.0"
+ "@npmcli/promise-spawn": "^8.0.0",
+ "ini": "^5.0.0",
+ "lru-cache": "^10.0.1",
+ "npm-pick-manifest": "^10.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "semver": "^7.3.5",
+ "which": "^5.0.0"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "license": "BSD-2-Clause",
+ "node_modules/npm/node_modules/@npmcli/installed-package-contents": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-bundled": "^4.0.0",
+ "npm-normalize-package-bin": "^4.0.0"
+ },
"bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "installed-package-contents": "bin/index.js"
},
"engines": {
- "node": ">=4"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "node_modules/npm/node_modules/@npmcli/map-workspaces": {
+ "version": "4.0.2",
"dev": true,
- "license": "BSD-3-Clause",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "estraverse": "^5.1.0"
+ "@npmcli/name-from-folder": "^3.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "glob": "^10.2.2",
+ "minimatch": "^9.0.0"
},
"engines": {
- "node": ">=0.10"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "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==",
+ "node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
+ "version": "9.0.0",
"dev": true,
- "license": "BSD-2-Clause",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "estraverse": "^5.2.0"
+ "cacache": "^19.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "pacote": "^21.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5"
},
"engines": {
- "node": ">=4.0"
+ "node": "^20.17.0 || >=22.9.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==",
+ "node_modules/npm/node_modules/@npmcli/name-from-folder": {
+ "version": "3.0.0",
"dev": true,
- "license": "BSD-2-Clause",
+ "inBundle": true,
+ "license": "ISC",
"engines": {
- "node": ">=4.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "license": "BSD-2-Clause",
+ "node_modules/npm/node_modules/@npmcli/node-gyp": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"engines": {
- "node": ">=0.10.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/execa": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz",
- "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==",
- "license": "MIT",
+ "node_modules/npm/node_modules/@npmcli/package-json": {
+ "version": "6.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.1",
- "human-signals": "^4.3.0",
- "is-stream": "^3.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^5.1.0",
- "onetime": "^6.0.0",
- "signal-exit": "^3.0.7",
- "strip-final-newline": "^3.0.0"
+ "@npmcli/git": "^6.0.0",
+ "glob": "^10.2.2",
+ "hosted-git-info": "^8.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.5.3",
+ "validate-npm-package-license": "^3.0.4"
},
"engines": {
- "node": "^14.18.0 || ^16.14.0 || >=18.0.0"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "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==",
+ "node_modules/npm/node_modules/@npmcli/promise-spawn": {
+ "version": "8.0.2",
"dev": true,
- "license": "MIT"
- },
- "node_modules/fast-glob": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
- "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"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"
+ "which": "^5.0.0"
},
"engines": {
- "node": ">=8.6.0"
+ "node": "^18.17.0 || >=20.5.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==",
+ "node_modules/npm/node_modules/@npmcli/query": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
"license": "ISC",
"dependencies": {
- "is-glob": "^4.0.1"
+ "postcss-selector-parser": "^6.1.2"
},
"engines": {
- "node": ">= 6"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "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==",
+ "node_modules/npm/node_modules/@npmcli/redact": {
+ "version": "3.1.1",
"dev": true,
- "license": "MIT"
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
- "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==",
+ "node_modules/npm/node_modules/@npmcli/run-script": {
+ "version": "9.0.2",
"dev": true,
- "license": "MIT"
- },
- "node_modules/fastq": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
- "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
+ "inBundle": true,
"license": "ISC",
"dependencies": {
- "reusify": "^1.0.4"
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "node-gyp": "^11.0.0",
+ "proc-log": "^5.0.0",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/fetch-blob": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
- "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
+ "node_modules/npm/node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/bundle": {
+ "version": "3.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
"dependencies": {
- "node-domexception": "^1.0.0",
- "web-streams-polyfill": "^3.0.3"
+ "@sigstore/protobuf-specs": "^0.4.0"
},
"engines": {
- "node": "^12.20 || >= 14.13"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "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==",
+ "node_modules/npm/node_modules/@sigstore/core": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/protobuf-specs": {
+ "version": "0.4.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign": {
+ "version": "3.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "make-fetch-happen": "^14.0.2",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/tuf": {
+ "version": "3.1.0",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "Apache-2.0",
"dependencies": {
- "flat-cache": "^4.0.0"
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "tuf-js": "^3.0.1"
},
"engines": {
- "node": ">=16.0.0"
+ "node": "^18.17.0 || >=20.5.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==",
- "license": "MIT",
+ "node_modules/npm/node_modules/@sigstore/verify": {
+ "version": "2.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
"dependencies": {
- "to-regex-range": "^5.0.1"
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0"
},
"engines": {
- "node": ">=8"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "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==",
- "license": "MIT"
- },
- "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==",
+ "node_modules/npm/node_modules/@tufjs/canonical-json": {
+ "version": "2.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": "^16.14.0 || >=18.0.0"
}
},
- "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==",
+ "node_modules/npm/node_modules/@tufjs/models": {
+ "version": "3.0.1",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
+ "@tufjs/canonical-json": "2.0.0",
+ "minimatch": "^9.0.5"
},
"engines": {
- "node": ">=16"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/flatted": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
- "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+ "node_modules/npm/node_modules/abbrev": {
+ "version": "3.0.0",
"dev": true,
- "license": "ISC"
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
- "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==",
+ "node_modules/npm/node_modules/agent-base": {
+ "version": "7.1.3",
"dev": true,
+ "inBundle": true,
"license": "MIT",
- "dependencies": {
- "is-callable": "^1.1.3"
+ "engines": {
+ "node": ">= 14"
}
},
- "node_modules/foreground-child": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
- "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
- "license": "ISC",
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^4.0.1"
- },
+ "node_modules/npm/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
"engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=8"
}
},
- "node_modules/foreground-child/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==",
- "license": "ISC",
+ "node_modules/npm/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/formdata-polyfill": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
- "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
- "license": "MIT",
+ "node_modules/npm/node_modules/aproba": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/archy": {
+ "version": "1.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/bin-links": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "fetch-blob": "^3.1.2"
+ "cmd-shim": "^7.0.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "read-cmd-shim": "^5.0.0",
+ "write-file-atomic": "^6.0.0"
},
"engines": {
- "node": ">=12.20.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/fraction.js": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
- "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "node_modules/npm/node_modules/binary-extensions": {
+ "version": "3.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"engines": {
- "node": "*"
+ "node": ">=18.20"
},
"funding": {
- "type": "patreon",
- "url": "https://github.com/sponsors/rawify"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/fs-extra": {
- "version": "11.3.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
- "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
+ "node_modules/npm/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "node_modules/npm/node_modules/cacache": {
+ "version": "19.0.1",
+ "dev": true,
+ "inBundle": true,
"license": "ISC",
"dependencies": {
- "minipass": "^3.0.0"
+ "@npmcli/fs": "^4.0.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^7.0.2",
+ "ssri": "^12.0.0",
+ "tar": "^7.4.3",
+ "unique-filename": "^4.0.0"
},
"engines": {
- "node": ">= 8"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/fs-minipass/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
+ "node_modules/npm/node_modules/cacache/node_modules/chownr": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=8"
+ "node": ">=18"
}
},
- "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==",
- "license": "ISC"
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "node_modules/npm/node_modules/cacache/node_modules/minizlib": {
+ "version": "3.0.1",
"dev": true,
- "hasInstallScript": true,
+ "inBundle": true,
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "dependencies": {
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
"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==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 18"
}
},
- "node_modules/function.prototype.name": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
- "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "node_modules/npm/node_modules/cacache/node_modules/mkdirp": {
+ "version": "3.0.1",
"dev": true,
+ "inBundle": true,
"license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "functions-have-names": "^1.2.3",
- "hasown": "^2.0.2",
- "is-callable": "^1.2.7"
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "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==",
+ "node_modules/npm/node_modules/cacache/node_modules/tar": {
+ "version": "7.4.3",
"dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gauge": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
- "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
- "deprecated": "This package is no longer supported.",
+ "inBundle": true,
"license": "ISC",
"dependencies": {
- "aproba": "^1.0.3 || ^2.0.0",
- "color-support": "^1.1.2",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.1",
- "object-assign": "^4.1.1",
- "signal-exit": "^3.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "wide-align": "^1.1.2"
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "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==",
- "license": "MIT",
+ "node_modules/npm/node_modules/cacache/node_modules/yallist": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
}
},
- "node_modules/get-intrinsic": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
- "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.0",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- },
+ "node_modules/npm/node_modules/chalk": {
+ "version": "5.4.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/get-nonce": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
- "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
- "license": "MIT",
+ "node_modules/npm/node_modules/chownr": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"engines": {
- "node": ">=6"
+ "node": ">=10"
}
},
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "node_modules/npm/node_modules/ci-info": {
+ "version": "4.1.0",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "inBundle": true,
"license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "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==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
+ "node_modules/npm/node_modules/cidr-regex": {
+ "version": "4.1.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "ip-regex": "^5.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=14"
}
},
- "node_modules/get-symbol-description": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
- "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "node_modules/npm/node_modules/cli-columns": {
+ "version": "4.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6"
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 10"
}
},
- "node_modules/get-tsconfig": {
- "version": "4.8.1",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz",
- "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==",
+ "node_modules/npm/node_modules/cmd-shim": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/color-convert": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "resolve-pkg-maps": "^1.0.0"
+ "color-name": "~1.1.4"
},
- "funding": {
- "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ "engines": {
+ "node": ">=7.0.0"
}
},
- "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",
- "license": "ISC",
+ "node_modules/npm/node_modules/color-name": {
+ "version": "1.1.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/common-ancestor-path": {
+ "version": "1.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
"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"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
},
"engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">= 8"
}
},
- "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==",
+ "node_modules/npm/node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
"dev": true,
+ "inBundle": true,
"license": "ISC",
"dependencies": {
- "is-glob": "^4.0.3"
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">= 8"
}
},
- "node_modules/globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "node_modules/npm/node_modules/cssesc": {
+ "version": "3.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
- "engines": {
- "node": ">=18"
+ "bin": {
+ "cssesc": "bin/cssesc"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "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==",
+ "node_modules/npm/node_modules/debug": {
+ "version": "4.4.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "define-properties": "^1.2.1",
- "gopd": "^1.0.1"
+ "ms": "^2.1.3"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=6.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "node_modules/npm/node_modules/diff": {
+ "version": "7.0.0",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.3.1"
}
},
- "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==",
- "license": "ISC"
+ "node_modules/npm/node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
},
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "node_modules/npm/node_modules/emoji-regex": {
+ "version": "8.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT"
},
- "node_modules/has-bigints": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
- "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "node_modules/npm/node_modules/encoding": {
+ "version": "0.1.13",
"dev": true,
+ "inBundle": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
}
},
- "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==",
+ "node_modules/npm/node_modules/env-paths": {
+ "version": "2.2.1",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "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==",
+ "node_modules/npm/node_modules/err-code": {
+ "version": "2.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/exponential-backoff": {
+ "version": "3.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/npm/node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
"dev": true,
+ "inBundle": true,
"license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">= 4.9.1"
}
},
- "node_modules/has-proto": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
- "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "node_modules/npm/node_modules/foreground-child": {
+ "version": "3.3.1",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "dunder-proto": "^1.0.0"
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=14"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "node_modules/npm/node_modules/fs-minipass": {
+ "version": "3.0.3",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "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==",
+ "node_modules/npm/node_modules/glob": {
+ "version": "10.4.5",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "has-symbols": "^1.0.3"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
},
- "engines": {
- "node": ">= 0.4"
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+ "node_modules/npm/node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "dev": true,
+ "inBundle": true,
"license": "ISC"
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "license": "MIT",
+ "node_modules/npm/node_modules/hosted-git-info": {
+ "version": "8.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "function-bind": "^1.1.2"
+ "lru-cache": "^10.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/hoist-non-react-statics": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "react-is": "^16.7.0"
- }
+ "node_modules/npm/node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause"
},
- "node_modules/html-to-text": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz",
- "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==",
+ "node_modules/npm/node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "@selderee/plugin-htmlparser2": "^0.11.0",
- "deepmerge": "^4.3.1",
- "dom-serializer": "^2.0.0",
- "htmlparser2": "^8.0.2",
- "selderee": "^0.11.0"
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
},
"engines": {
- "node": ">=14"
- }
- },
- "node_modules/htmlparser2": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
- "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3",
- "domutils": "^3.0.1",
- "entities": "^4.4.0"
+ "node": ">= 14"
}
},
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "node_modules/npm/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "agent-base": "6",
+ "agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
- "node": ">= 6"
- }
- },
- "node_modules/human-signals": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
- "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=14.18.0"
+ "node": ">= 14"
}
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "BSD-3-Clause"
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "node_modules/npm/node_modules/iconv-lite": {
+ "version": "0.6.3",
"dev": true,
+ "inBundle": true,
"license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
"engines": {
- "node": ">= 4"
+ "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==",
- "license": "MIT",
+ "node_modules/npm/node_modules/ignore-walk": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
+ "minimatch": "^9.0.0"
},
"engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/imurmurhash": {
+ "node_modules/npm/node_modules/imurmurhash": {
"version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"engines": {
"node": ">=0.8.19"
}
},
- "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.",
+ "node_modules/npm/node_modules/ini": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
"license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "license": "ISC"
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "license": "ISC"
- },
- "node_modules/internal-slot": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
- "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "node_modules/npm/node_modules/init-package-json": {
+ "version": "8.0.0",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "es-errors": "^1.3.0",
- "hasown": "^2.0.2",
- "side-channel": "^1.1.0"
+ "@npmcli/package-json": "^6.1.0",
+ "npm-package-arg": "^12.0.0",
+ "promzard": "^2.0.0",
+ "read": "^4.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4",
+ "validate-npm-package-name": "^6.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/is-array-buffer": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
- "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "node_modules/npm/node_modules/ip-address": {
+ "version": "9.0.5",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "get-intrinsic": "^1.2.6"
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 12"
}
},
- "node_modules/is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/is-async-function": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz",
- "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==",
+ "node_modules/npm/node_modules/ip-regex": {
+ "version": "5.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "get-proto": "^1.0.1",
- "has-tostringtag": "^1.0.2",
- "safe-regex-test": "^1.1.0"
- },
"engines": {
- "node": ">= 0.4"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-bigint": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
- "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "node_modules/npm/node_modules/is-cidr": {
+ "version": "5.1.1",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "has-bigints": "^1.0.2"
+ "cidr-regex": "^4.1.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=14"
}
},
- "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==",
+ "node_modules/npm/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
"engines": {
"node": ">=8"
}
},
- "node_modules/is-boolean-object": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz",
- "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==",
+ "node_modules/npm/node_modules/isexe": {
+ "version": "2.0.0",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/jackspeak": {
+ "version": "3.4.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "call-bound": "^1.0.2",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
+ "@isaacs/cliui": "^8.0.2"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
}
},
- "node_modules/is-bun-module": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz",
- "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==",
+ "node_modules/npm/node_modules/jsbn": {
+ "version": "1.1.0",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "semver": "^7.6.3"
- }
+ "inBundle": true,
+ "license": "MIT"
},
- "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==",
+ "node_modules/npm/node_modules/json-parse-even-better-errors": {
+ "version": "4.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/is-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
+ "node_modules/npm/node_modules/json-stringify-nice": {
+ "version": "1.1.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/is-data-view": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
- "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "node_modules/npm/node_modules/jsonparse": {
+ "version": "1.3.1",
"dev": true,
- "license": "MIT",
+ "engines": [
+ "node >= 0.2.0"
+ ],
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/just-diff": {
+ "version": "6.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/just-diff-apply": {
+ "version": "5.5.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/libnpmaccess": {
+ "version": "10.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "call-bound": "^1.0.2",
- "get-intrinsic": "^1.2.6",
- "is-typed-array": "^1.1.13"
+ "npm-package-arg": "^12.0.0",
+ "npm-registry-fetch": "^18.0.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/is-date-object": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
- "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "node_modules/npm/node_modules/libnpmdiff": {
+ "version": "8.0.1",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "call-bound": "^1.0.2",
- "has-tostringtag": "^1.0.2"
+ "@npmcli/arborist": "^9.0.1",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "binary-extensions": "^3.0.0",
+ "diff": "^7.0.0",
+ "minimatch": "^9.0.4",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^21.0.0",
+ "tar": "^6.2.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "license": "MIT",
+ "node_modules/npm/node_modules/libnpmexec": {
+ "version": "10.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^9.0.1",
+ "@npmcli/package-json": "^6.1.1",
+ "@npmcli/run-script": "^9.0.1",
+ "ci-info": "^4.0.0",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^21.0.0",
+ "proc-log": "^5.0.0",
+ "read": "^4.0.0",
+ "read-package-json-fast": "^4.0.0",
+ "semver": "^7.3.7",
+ "walk-up-path": "^4.0.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/is-finalizationregistry": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
- "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "node_modules/npm/node_modules/libnpmfund": {
+ "version": "7.0.1",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "call-bound": "^1.0.3"
+ "@npmcli/arborist": "^9.0.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "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==",
- "license": "MIT",
+ "node_modules/npm/node_modules/libnpmorg": {
+ "version": "8.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^18.0.1"
+ },
"engines": {
- "node": ">=8"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/is-generator-function": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
- "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+ "node_modules/npm/node_modules/libnpmpack": {
+ "version": "9.0.1",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "call-bound": "^1.0.3",
- "get-proto": "^1.0.0",
- "has-tostringtag": "^1.0.2",
- "safe-regex-test": "^1.1.0"
+ "@npmcli/arborist": "^9.0.1",
+ "@npmcli/run-script": "^9.0.1",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^21.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "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==",
- "license": "MIT",
+ "node_modules/npm/node_modules/libnpmpublish": {
+ "version": "11.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "is-extglob": "^2.1.1"
+ "ci-info": "^4.0.0",
+ "normalize-package-data": "^7.0.0",
+ "npm-package-arg": "^12.0.0",
+ "npm-registry-fetch": "^18.0.1",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.7",
+ "sigstore": "^3.0.0",
+ "ssri": "^12.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/is-interactive": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
- "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
+ "node_modules/npm/node_modules/libnpmsearch": {
+ "version": "9.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-registry-fetch": "^18.0.1"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/is-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
- "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "node_modules/npm/node_modules/libnpmteam": {
+ "version": "8.0.0",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^18.0.1"
},
- "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==",
- "license": "MIT",
"engines": {
- "node": ">=0.12.0"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/is-number-object": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
- "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "node_modules/npm/node_modules/libnpmversion": {
+ "version": "8.0.0",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "call-bound": "^1.0.3",
- "has-tostringtag": "^1.0.2"
+ "@npmcli/git": "^6.0.1",
+ "@npmcli/run-script": "^9.0.1",
+ "json-parse-even-better-errors": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.7"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/is-regex": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
- "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "node_modules/npm/node_modules/lru-cache": {
+ "version": "10.4.3",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/make-fetch-happen": {
+ "version": "14.0.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "call-bound": "^1.0.2",
- "gopd": "^1.2.0",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
+ "@npmcli/agent": "^3.0.0",
+ "cacache": "^19.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^1.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^12.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/is-set": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
- "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": {
+ "version": "1.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 0.6"
}
},
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
- "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "node_modules/npm/node_modules/minimatch": {
+ "version": "9.0.5",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "call-bound": "^1.0.3"
+ "brace-expansion": "^2.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=16 || 14 >=14.17"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "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==",
- "license": "MIT",
+ "node_modules/npm/node_modules/minipass": {
+ "version": "7.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-collect": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
}
},
- "node_modules/is-string": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
- "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "node_modules/npm/node_modules/minipass-fetch": {
+ "version": "4.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3",
- "has-tostringtag": "^1.0.2"
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^3.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^18.17.0 || >=20.5.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
}
},
- "node_modules/is-symbol": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
- "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "node_modules/npm/node_modules/minipass-fetch/node_modules/minizlib": {
+ "version": "3.0.1",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.2",
- "has-symbols": "^1.1.0",
- "safe-regex-test": "^1.1.0"
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 18"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
- "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "node_modules/npm/node_modules/minipass-flush": {
+ "version": "1.0.5",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "which-typed-array": "^1.1.16"
+ "minipass": "^3.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 8"
}
},
- "node_modules/is-unicode-supported": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
- "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
+ "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/is-weakmap": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
- "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "node_modules/npm/node_modules/minipass-pipeline": {
+ "version": "1.2.4",
"dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/is-weakref": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz",
- "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==",
+ "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "call-bound": "^1.0.2"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8"
}
},
- "node_modules/is-weakset": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
- "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "node_modules/npm/node_modules/minipass-sized": {
+ "version": "1.0.3",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "call-bound": "^1.0.3",
- "get-intrinsic": "^1.2.6"
+ "minipass": "^3.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8"
}
},
- "node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": {
+ "version": "3.3.6",
"dev": true,
- "license": "MIT"
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "license": "ISC"
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/iterator.prototype": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
- "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "node_modules/npm/node_modules/minizlib": {
+ "version": "2.1.2",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "define-data-property": "^1.1.4",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.6",
- "get-proto": "^1.0.0",
- "has-symbols": "^1.1.0",
- "set-function-name": "^2.0.2"
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">= 8"
}
},
- "node_modules/jackspeak": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz",
- "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==",
- "license": "BlueOak-1.0.0",
+ "node_modules/npm/node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "@isaacs/cliui": "^8.0.2"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=8"
}
},
- "node_modules/jiti": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
- "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+ "node_modules/npm/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"bin": {
- "jiti": "lib/jiti-cli.mjs"
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/jose": {
- "version": "4.15.9",
- "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz",
- "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/panva"
+ "node_modules/npm/node_modules/ms": {
+ "version": "2.1.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/mute-stream": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/js-beautify": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.2.tgz",
- "integrity": "sha512-mcG6CHJxxih+EFAbd5NEBwrosIs6MoJmiNLFYN6kj5SeJMf7n29Ii/H4lt6zGTvmdB9AApuj5cs4zydjuLeqjw==",
+ "node_modules/npm/node_modules/node-gyp": {
+ "version": "11.1.0",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "config-chain": "^1.1.13",
- "editorconfig": "^1.0.4",
- "glob": "^11.0.0",
- "js-cookie": "^3.0.5",
- "nopt": "^8.0.0"
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^14.0.3",
+ "nopt": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "tar": "^7.4.3",
+ "which": "^5.0.0"
},
"bin": {
- "css-beautify": "js/bin/css-beautify.js",
- "html-beautify": "js/bin/html-beautify.js",
- "js-beautify": "js/bin/js-beautify.js"
+ "node-gyp": "bin/node-gyp.js"
},
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/js-beautify/node_modules/abbrev": {
+ "node_modules/npm/node_modules/node-gyp/node_modules/chownr": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz",
- "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==",
- "license": "ISC",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": ">=18"
}
},
- "node_modules/js-beautify/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==",
+ "node_modules/npm/node_modules/node-gyp/node_modules/minizlib": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
+ "engines": {
+ "node": ">= 18"
}
},
- "node_modules/js-beautify/node_modules/glob": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
- "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==",
- "license": "ISC",
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^4.0.1",
- "minimatch": "^10.0.0",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^2.0.0"
- },
+ "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
"bin": {
- "glob": "dist/esm/bin.mjs"
+ "mkdirp": "dist/cjs/src/bin.js"
},
"engines": {
- "node": "20 || >=22"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/js-beautify/node_modules/minimatch": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
- "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+ "node_modules/npm/node_modules/node-gyp/node_modules/tar": {
+ "version": "7.4.3",
+ "dev": true,
+ "inBundle": true,
"license": "ISC",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
},
"engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=18"
}
},
- "node_modules/js-beautify/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "license": "ISC",
+ "node_modules/npm/node_modules/node-gyp/node_modules/yallist": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=18"
}
},
- "node_modules/js-beautify/node_modules/nopt": {
+ "node_modules/npm/node_modules/nopt": {
"version": "8.1.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
- "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
+ "dev": true,
+ "inBundle": true,
"license": "ISC",
"dependencies": {
"abbrev": "^3.0.0"
},
"bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
- "node_modules/js-cookie": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
- "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
- "license": "MIT",
- "engines": {
- "node": ">=14"
- }
- },
- "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==",
- "license": "MIT"
- },
- "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==",
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/jsesc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
+ "node_modules/npm/node_modules/normalize-package-data": {
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^8.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
},
"engines": {
- "node": ">=6"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "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==",
+ "node_modules/npm/node_modules/npm-audit-report": {
+ "version": "6.0.0",
"dev": true,
- "license": "MIT"
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
- "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==",
- "license": "MIT"
+ "node_modules/npm/node_modules/npm-bundled": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
- "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==",
+ "node_modules/npm/node_modules/npm-install-checks": {
+ "version": "7.1.1",
"dev": true,
- "license": "MIT"
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "semver": "^7.1.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
- "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==",
+ "node_modules/npm/node_modules/npm-normalize-package-bin": {
+ "version": "4.0.0",
"dev": true,
- "license": "MIT"
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
- "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==",
+ "node_modules/npm/node_modules/npm-package-arg": {
+ "version": "12.0.2",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "minimist": "^1.2.0"
+ "hosted-git-info": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^6.0.0"
},
- "bin": {
- "json5": "lib/cli.js"
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "license": "MIT",
+ "node_modules/npm/node_modules/npm-packlist": {
+ "version": "10.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "universalify": "^2.0.0"
+ "ignore-walk": "^7.0.0"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/jsx-ast-utils": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
- "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "node_modules/npm/node_modules/npm-pick-manifest": {
+ "version": "10.0.0",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flat": "^1.3.1",
- "object.assign": "^4.1.4",
- "object.values": "^1.1.6"
+ "npm-install-checks": "^7.1.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "npm-package-arg": "^12.0.0",
+ "semver": "^7.3.5"
},
"engines": {
- "node": ">=4.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "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==",
+ "node_modules/npm/node_modules/npm-profile": {
+ "version": "11.0.1",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "license": "MIT",
+ "npm-registry-fetch": "^18.0.0",
+ "proc-log": "^5.0.0"
+ },
"engines": {
- "node": ">=6"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/language-subtag-registry": {
- "version": "0.3.23",
- "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
- "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "node_modules/npm/node_modules/npm-registry-fetch": {
+ "version": "18.0.2",
"dev": true,
- "license": "CC0-1.0"
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/redact": "^3.0.0",
+ "jsonparse": "^1.3.1",
+ "make-fetch-happen": "^14.0.0",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minizlib": "^3.0.1",
+ "npm-package-arg": "^12.0.0",
+ "proc-log": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
- "node_modules/language-tags": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
- "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minizlib": {
+ "version": "3.0.1",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "language-subtag-registry": "^0.3.20"
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
},
"engines": {
- "node": ">=0.10"
+ "node": ">= 18"
}
},
- "node_modules/leac": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz",
- "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==",
+ "node_modules/npm/node_modules/npm-user-validate": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/p-map": {
+ "version": "7.0.3",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
"funding": {
- "url": "https://ko-fi.com/killymxi"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
+ "node_modules/npm/node_modules/package-json-from-dist": {
+ "version": "1.0.1",
"dev": true,
- "license": "MIT",
+ "inBundle": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/npm/node_modules/pacote": {
+ "version": "21.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
+ "@npmcli/git": "^6.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "@npmcli/run-script": "^9.0.0",
+ "cacache": "^19.0.0",
+ "fs-minipass": "^3.0.0",
+ "minipass": "^7.0.2",
+ "npm-package-arg": "^12.0.0",
+ "npm-packlist": "^10.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^18.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "sigstore": "^3.0.0",
+ "ssri": "^12.0.0",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "pacote": "bin/index.js"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/lightningcss": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz",
- "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==",
- "license": "MPL-2.0",
+ "node_modules/npm/node_modules/parse-conflict-json": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "detect-libc": "^1.0.3"
+ "json-parse-even-better-errors": "^4.0.0",
+ "just-diff": "^6.0.0",
+ "just-diff-apply": "^5.2.0"
},
"engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "lightningcss-darwin-arm64": "1.29.1",
- "lightningcss-darwin-x64": "1.29.1",
- "lightningcss-freebsd-x64": "1.29.1",
- "lightningcss-linux-arm-gnueabihf": "1.29.1",
- "lightningcss-linux-arm64-gnu": "1.29.1",
- "lightningcss-linux-arm64-musl": "1.29.1",
- "lightningcss-linux-x64-gnu": "1.29.1",
- "lightningcss-linux-x64-musl": "1.29.1",
- "lightningcss-win32-arm64-msvc": "1.29.1",
- "lightningcss-win32-x64-msvc": "1.29.1"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/lightningcss-darwin-arm64": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz",
- "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "node_modules/npm/node_modules/path-key": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
"engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
+ "node": ">=8"
}
},
- "node_modules/lightningcss-darwin-x64": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz",
- "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
+ "node_modules/npm/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
"engines": {
- "node": ">= 12.0.0"
+ "node": ">=16 || 14 >=14.18"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/lightningcss-freebsd-x64": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz",
- "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 12.0.0"
+ "node_modules/npm/node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz",
- "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==",
- "cpu": [
- "arm"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
+ "node_modules/npm/node_modules/proc-log": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz",
- "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
+ "node_modules/npm/node_modules/proggy": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"engines": {
- "node": ">= 12.0.0"
- },
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/promise-all-reject-late": {
+ "version": "1.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz",
- "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
+ "node_modules/npm/node_modules/promise-call-limit": {
+ "version": "3.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz",
- "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
+ "node_modules/npm/node_modules/promise-retry": {
+ "version": "2.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/lightningcss-linux-x64-musl": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz",
- "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
+ "node_modules/npm/node_modules/promzard": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "read": "^4.0.0"
+ },
"engines": {
- "node": ">= 12.0.0"
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/qrcode-terminal": {
+ "version": "0.12.0",
+ "dev": true,
+ "inBundle": true,
+ "bin": {
+ "qrcode-terminal": "bin/qrcode-terminal.js"
+ }
+ },
+ "node_modules/npm/node_modules/read": {
+ "version": "4.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "mute-stream": "^2.0.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz",
- "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
+ "node_modules/npm/node_modules/read-cmd-shim": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"engines": {
- "node": ">= 12.0.0"
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/read-package-json-fast": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "json-parse-even-better-errors": "^4.0.0",
+ "npm-normalize-package-bin": "^4.0.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz",
- "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
+ "node_modules/npm/node_modules/retry": {
+ "version": "0.12.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
"engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
+ "node": ">= 4"
}
},
- "node_modules/lightningcss/node_modules/detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
- "license": "Apache-2.0",
+ "node_modules/npm/node_modules/rimraf": {
+ "version": "5.0.10",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^10.3.7"
+ },
"bin": {
- "detect-libc": "bin/detect-libc.js"
+ "rimraf": "dist/esm/bin.mjs"
},
- "engines": {
- "node": ">=0.10"
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "node_modules/npm/node_modules/safer-buffer": {
+ "version": "2.1.2",
"dev": true,
+ "inBundle": true,
"license": "MIT",
+ "optional": true
+ },
+ "node_modules/npm/node_modules/semver": {
+ "version": "7.7.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
"node": ">=10"
}
},
- "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==",
- "license": "MIT"
- },
- "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==",
+ "node_modules/npm/node_modules/shebang-command": {
+ "version": "2.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "p-locate": "^5.0.0"
+ "shebang-regex": "^3.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "license": "MIT"
- },
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
- "license": "MIT"
+ "node_modules/npm/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "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==",
+ "node_modules/npm/node_modules/signal-exit": {
+ "version": "4.1.0",
"dev": true,
- "license": "MIT"
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
},
- "node_modules/log-symbols": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz",
- "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==",
- "license": "MIT",
+ "node_modules/npm/node_modules/sigstore": {
+ "version": "3.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
"dependencies": {
- "chalk": "^5.0.0",
- "is-unicode-supported": "^1.1.0"
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "@sigstore/sign": "^3.1.0",
+ "@sigstore/tuf": "^3.1.0",
+ "@sigstore/verify": "^2.1.0"
},
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/log-symbols/node_modules/chalk": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
- "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "node_modules/npm/node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"engines": {
- "node": "^12.17.0 || ^14.13 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
}
},
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "node_modules/npm/node_modules/socks": {
+ "version": "2.8.4",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
+ "ip-address": "^9.0.5",
+ "smart-buffer": "^4.2.0"
},
- "bin": {
- "loose-envify": "cli.js"
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
}
},
- "node_modules/lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "node_modules/npm/node_modules/socks-proxy-agent": {
+ "version": "8.0.5",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "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==",
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
},
"engines": {
- "node": ">=10"
+ "node": ">= 14"
}
},
- "node_modules/lucide-react": {
- "version": "0.475.0",
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.475.0.tgz",
- "integrity": "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg==",
- "license": "ISC",
- "peerDependencies": {
- "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ "node_modules/npm/node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "semver": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "node_modules/make-dir/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
+ "node_modules/npm/node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "CC-BY-3.0"
},
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "node_modules/npm/node_modules/spdx-expression-parse": {
+ "version": "4.0.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "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==",
+ "node_modules/npm/node_modules/spdx-license-ids": {
+ "version": "3.0.21",
+ "dev": true,
+ "inBundle": true,
"license": "CC0-1.0"
},
- "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==",
- "license": "MIT"
+ "node_modules/npm/node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "BSD-3-Clause"
},
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "license": "MIT",
+ "node_modules/npm/node_modules/ssri": {
+ "version": "12.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
"engines": {
- "node": ">= 8"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "node_modules/npm/node_modules/string-width": {
+ "version": "4.2.3",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
},
"engines": {
- "node": ">=8.6"
+ "node": ">=8"
}
},
- "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==",
+ "node_modules/npm/node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "license": "ISC",
+ "node_modules/npm/node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "ansi-regex": "^5.0.1"
},
"engines": {
- "node": "*"
+ "node": ">=8"
}
},
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "node_modules/npm/node_modules/supports-color": {
+ "version": "10.0.0",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "node_modules/npm/node_modules/tar": {
+ "version": "6.2.1",
+ "dev": true,
+ "inBundle": true,
"license": "ISC",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "license": "MIT",
+ "node_modules/npm/node_modules/tar/node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
+ "minipass": "^3.0.0"
},
"engines": {
"node": ">= 8"
}
},
- "node_modules/minizlib/node_modules/minipass": {
+ "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
"version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "inBundle": true,
"license": "ISC",
"dependencies": {
"yallist": "^4.0.0"
@@ -10272,289 +18385,261 @@
"node": ">=8"
}
},
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "license": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "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==",
- "license": "MIT"
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "node_modules/npm/node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.8",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
- "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
+ "inBundle": true,
+ "license": "ISC",
"engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ "node": ">=8"
}
},
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "node_modules/npm/node_modules/text-table": {
+ "version": "0.2.0",
"dev": true,
+ "inBundle": true,
"license": "MIT"
},
- "node_modules/next": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/next/-/next-15.1.0.tgz",
- "integrity": "sha512-QKhzt6Y8rgLNlj30izdMbxAwjHMFANnLwDwZ+WQh5sMhyt4lEBqDK9QpvWHtIM4rINKPoJ8aiRZKg5ULSybVHw==",
+ "node_modules/npm/node_modules/tiny-relative-date": {
+ "version": "1.3.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/treeverse": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "@next/env": "15.1.0",
- "@swc/counter": "0.1.3",
- "@swc/helpers": "0.5.15",
- "busboy": "1.6.0",
- "caniuse-lite": "^1.0.30001579",
- "postcss": "8.4.31",
- "styled-jsx": "5.1.6"
- },
- "bin": {
- "next": "dist/bin/next"
+ "@tufjs/models": "3.0.1",
+ "debug": "^4.3.6",
+ "make-fetch-happen": "^14.0.1"
},
"engines": {
- "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
- },
- "optionalDependencies": {
- "@next/swc-darwin-arm64": "15.1.0",
- "@next/swc-darwin-x64": "15.1.0",
- "@next/swc-linux-arm64-gnu": "15.1.0",
- "@next/swc-linux-arm64-musl": "15.1.0",
- "@next/swc-linux-x64-gnu": "15.1.0",
- "@next/swc-linux-x64-musl": "15.1.0",
- "@next/swc-win32-arm64-msvc": "15.1.0",
- "@next/swc-win32-x64-msvc": "15.1.0",
- "sharp": "^0.33.5"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.1.0",
- "@playwright/test": "^1.41.2",
- "babel-plugin-react-compiler": "*",
- "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
- "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
- "sass": "^1.3.0"
- },
- "peerDependenciesMeta": {
- "@opentelemetry/api": {
- "optional": true
- },
- "@playwright/test": {
- "optional": true
- },
- "babel-plugin-react-compiler": {
- "optional": true
- },
- "sass": {
- "optional": true
- }
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/next-auth": {
- "version": "4.24.11",
- "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.11.tgz",
- "integrity": "sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==",
+ "node_modules/npm/node_modules/unique-filename": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
"license": "ISC",
"dependencies": {
- "@babel/runtime": "^7.20.13",
- "@panva/hkdf": "^1.0.2",
- "cookie": "^0.7.0",
- "jose": "^4.15.5",
- "oauth": "^0.9.15",
- "openid-client": "^5.4.0",
- "preact": "^10.6.3",
- "preact-render-to-string": "^5.1.19",
- "uuid": "^8.3.2"
- },
- "peerDependencies": {
- "@auth/core": "0.34.2",
- "next": "^12.2.5 || ^13 || ^14 || ^15",
- "nodemailer": "^6.6.5",
- "react": "^17.0.2 || ^18 || ^19",
- "react-dom": "^17.0.2 || ^18 || ^19"
+ "unique-slug": "^5.0.0"
},
- "peerDependenciesMeta": {
- "@auth/core": {
- "optional": true
- },
- "nodemailer": {
- "optional": true
- }
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/next-auth/node_modules/cookie": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
- "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
- "license": "MIT",
+ "node_modules/npm/node_modules/unique-slug": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
"engines": {
- "node": ">= 0.6"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/next-themes": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.4.tgz",
- "integrity": "sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
- }
+ "node_modules/npm/node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
},
- "node_modules/no-case": {
+ "node_modules/npm/node_modules/validate-npm-package-license": {
"version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "node_modules/node-addon-api": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
- "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
- "license": "MIT"
+ "node_modules/npm/node_modules/validate-npm-package-name": {
+ "version": "6.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
- "node_modules/node-domexception": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
- "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "github",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
- "license": "MIT",
+ "node_modules/npm/node_modules/walk-up-path": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"engines": {
- "node": ">=10.5.0"
+ "node": "20 || >=22"
}
},
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "license": "MIT",
+ "node_modules/npm/node_modules/which": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
"dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
+ "isexe": "^3.1.1"
},
- "peerDependencies": {
- "encoding": "^0.1.0"
+ "bin": {
+ "node-which": "bin/which.js"
},
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/node-releases": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
- "license": "MIT"
- },
- "node_modules/nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "node_modules/npm/node_modules/which/node_modules/isexe": {
+ "version": "3.1.1",
+ "dev": true,
+ "inBundle": true,
"license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
"dependencies": {
- "abbrev": "1"
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
},
- "bin": {
- "nopt": "bin/nopt.js"
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"engines": {
- "node": ">=6"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "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==",
+ "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.1.0",
"dev": true,
+ "inBundle": true,
"license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "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==",
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "5.1.2",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
"dependencies": {
- "path-key": "^4.0.0"
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/npm-run-path/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==",
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "dev": true,
+ "inBundle": true,
"license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
"engines": {
"node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/write-file-atomic": {
+ "version": "6.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
+ "node_modules/npm/node_modules/yallist": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC"
+ },
"node_modules/npmlog": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
@@ -10621,7 +18706,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -10720,7 +18804,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
"integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
- "devOptional": true,
+ "dev": true,
"license": "MIT"
},
"node_modules/oidc-token-hash": {
@@ -10901,6 +18985,16 @@
"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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/package-json-from-dist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
@@ -10919,6 +19013,31 @@
"node": ">=6"
}
},
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -11043,14 +19162,15 @@
}
},
"node_modules/pg": {
- "version": "8.13.1",
- "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz",
- "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==",
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.14.1.tgz",
+ "integrity": "sha512-0TdbqfjwIun9Fm/r89oB7RFQ0bLgduAhiIqIXOsyKoiC/L54DbuAAzIEN/9Op0f1Po9X7iCPXGoa/Ah+2aI8Xw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"pg-connection-string": "^2.7.0",
- "pg-pool": "^3.7.0",
- "pg-protocol": "^1.7.0",
+ "pg-pool": "^3.8.0",
+ "pg-protocol": "^1.8.0",
"pg-types": "^2.1.0",
"pgpass": "1.x"
},
@@ -11073,6 +19193,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz",
"integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==",
+ "dev": true,
"license": "MIT",
"optional": true
},
@@ -11080,47 +19201,109 @@
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz",
"integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/pg-int8": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
"integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+ "dev": true,
"license": "ISC",
"engines": {
"node": ">=4.0.0"
}
},
+ "node_modules/pg-mem": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/pg-mem/-/pg-mem-3.0.5.tgz",
+ "integrity": "sha512-Bh8xHD6u/wUXCoyFE2vyRs5pgaKbqjWFQowKDlbKWCiF0vOlo2A0PZdiUxmf2PKgb6Vb6C7gwAlA7jKvsfDHZA==",
+ "license": "MIT",
+ "dependencies": {
+ "functional-red-black-tree": "^1.0.1",
+ "immutable": "^4.3.4",
+ "json-stable-stringify": "^1.0.1",
+ "lru-cache": "^6.0.0",
+ "moment": "^2.27.0",
+ "object-hash": "^2.0.3",
+ "pgsql-ast-parser": "^12.0.1"
+ },
+ "peerDependencies": {
+ "@mikro-orm/core": ">=4.5.3",
+ "@mikro-orm/postgresql": ">=4.5.3",
+ "knex": ">=0.20",
+ "kysely": ">=0.26",
+ "pg-promise": ">=10.8.7",
+ "pg-server": "^0.1.5",
+ "postgres": "^3.4.4",
+ "slonik": ">=23.0.1",
+ "typeorm": ">=0.2.29"
+ },
+ "peerDependenciesMeta": {
+ "@mikro-orm/core": {
+ "optional": true
+ },
+ "@mikro-orm/postgresql": {
+ "optional": true
+ },
+ "knex": {
+ "optional": true
+ },
+ "kysely": {
+ "optional": true
+ },
+ "mikro-orm": {
+ "optional": true
+ },
+ "pg-promise": {
+ "optional": true
+ },
+ "pg-server": {
+ "optional": true
+ },
+ "postgres": {
+ "optional": true
+ },
+ "slonik": {
+ "optional": true
+ },
+ "typeorm": {
+ "optional": true
+ }
+ }
+ },
"node_modules/pg-numeric": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz",
"integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==",
- "devOptional": true,
+ "dev": true,
"license": "ISC",
"engines": {
"node": ">=4"
}
},
"node_modules/pg-pool": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz",
- "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==",
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.8.0.tgz",
+ "integrity": "sha512-VBw3jiVm6ZOdLBTIcXLNdSotb6Iy3uOCwDGFAksZCXmi10nyRvnP2v3jl4d+IsLYRyXf6o9hIm/ZtUzlByNUdw==",
+ "dev": true,
"license": "MIT",
"peerDependencies": {
"pg": ">=8.0"
}
},
"node_modules/pg-protocol": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz",
- "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.8.0.tgz",
+ "integrity": "sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==",
+ "dev": true,
"license": "MIT"
},
"node_modules/pg-types": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz",
"integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"dependencies": {
"pg-int8": "1.0.1",
@@ -11139,6 +19322,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
"integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"pg-int8": "1.0.1",
@@ -11155,6 +19339,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
"integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
@@ -11164,6 +19349,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
"integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -11173,6 +19359,7 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
"integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -11182,6 +19369,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
"integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"xtend": "^4.0.0"
@@ -11194,11 +19382,22 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
"integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"split2": "^4.1.0"
}
},
+ "node_modules/pgsql-ast-parser": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/pgsql-ast-parser/-/pgsql-ast-parser-12.0.1.tgz",
+ "integrity": "sha512-pe8C6Zh5MsS+o38WlSu18NhrTjAv1UNMeDTs2/Km2ZReZdYBYtwtbWGZKK2BM2izv5CrQpbmP0oI10wvHOwv4A==",
+ "license": "MIT",
+ "dependencies": {
+ "moo": "^0.5.1",
+ "nearley": "^2.19.5"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -11237,6 +19436,122 @@
"node": ">= 6"
}
},
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/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,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/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,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/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,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/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,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/playwright": {
+ "version": "1.50.1",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.50.1.tgz",
+ "integrity": "sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright-core": "1.50.1"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.50.1",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.50.1.tgz",
+ "integrity": "sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/playwright/node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"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",
@@ -11388,7 +19703,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz",
"integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -11398,7 +19713,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz",
"integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"dependencies": {
"obuf": "~1.1.2"
@@ -11411,7 +19726,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz",
"integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -11421,7 +19736,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz",
"integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -11431,7 +19746,7 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz",
"integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==",
- "devOptional": true,
+ "dev": true,
"license": "MIT"
},
"node_modules/preact": {
@@ -11456,6 +19771,33 @@
"preact": ">=10"
}
},
+ "node_modules/prebuild-install": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
+ "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^2.0.0",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "bin": {
+ "prebuild-install": "bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -11488,6 +19830,15 @@
"integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==",
"license": "MIT"
},
+ "node_modules/prismjs": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
+ "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -11512,12 +19863,33 @@
"react-is": "^16.13.1"
}
},
+ "node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/proto-list": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
"integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
"license": "ISC"
},
+ "node_modules/pump": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
+ "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -11528,6 +19900,23 @@
"node": ">=6"
}
},
+ "node_modules/pure-rand": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
+ "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -11548,17 +19937,62 @@
],
"license": "MIT"
},
- "node_modules/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/railroad-diagrams": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
+ "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/randexp": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz",
+ "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "discontinuous-range": "1.0.0",
+ "ret": "~0.1.10"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.10.0"
}
},
"node_modules/react": {
@@ -11613,6 +20047,33 @@
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"license": "MIT"
},
+ "node_modules/react-markdown": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz",
+ "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "html-url-attributes": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "unified": "^11.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18",
+ "react": ">=18"
+ }
+ },
"node_modules/react-promise-suspense": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/react-promise-suspense/-/react-promise-suspense-0.3.4.tgz",
@@ -11697,6 +20158,36 @@
}
}
},
+ "node_modules/react-syntax-highlighter": {
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz",
+ "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.3.1",
+ "highlight.js": "^10.4.1",
+ "highlightjs-vue": "^1.0.0",
+ "lowlight": "^1.17.0",
+ "prismjs": "^1.27.0",
+ "refractor": "^3.6.0"
+ },
+ "peerDependencies": {
+ "react": ">= 0.14.0"
+ }
+ },
+ "node_modules/react-toastify": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.0.5.tgz",
+ "integrity": "sha512-EpqHBGvnSTtHYhCPLxML05NLY2ZX0JURbAdNYa6BUkk+amz4wbKBQvoKQAB0ardvSarUBuY4Q4s1sluAzZwkmA==",
+ "license": "MIT",
+ "dependencies": {
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19",
+ "react-dom": "^18 || ^19"
+ }
+ },
"node_modules/react-transition-group": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
@@ -11789,6 +20280,122 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/refractor": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
+ "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
+ "license": "MIT",
+ "dependencies": {
+ "hastscript": "^6.0.0",
+ "parse-entities": "^2.0.0",
+ "prismjs": "~1.27.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/prismjs": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
+ "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -11807,12 +20414,6 @@
"node": ">=4"
}
},
- "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==",
- "license": "MIT"
- },
"node_modules/regenerator-transform": {
"version": "0.15.2",
"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
@@ -11890,6 +20491,96 @@
"node": ">=6"
}
},
+ "node_modules/rehype-sanitize": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz",
+ "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-sanitize": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-gfm": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-gfm": "^3.0.0",
+ "micromark-extension-gfm": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-stringify": "^11.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
+ "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-stringify": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/resend": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/resend/-/resend-4.1.2.tgz",
@@ -11922,6 +20613,29 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-cwd/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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -11935,11 +20649,22 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
"integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
}
},
+ "node_modules/resolve.exports": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz",
+ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/restore-cursor": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
@@ -11980,6 +20705,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -12123,9 +20857,9 @@
}
},
"node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -12150,7 +20884,6 @@
"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==",
- "dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.1.4",
@@ -12342,16 +21075,16 @@
}
},
"node_modules/sharp": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
- "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz",
+ "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==",
"hasInstallScript": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"color": "^4.2.3",
"detect-libc": "^2.0.3",
- "semver": "^7.6.3"
+ "semver": "^7.7.1"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -12360,25 +21093,26 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-darwin-arm64": "0.33.5",
- "@img/sharp-darwin-x64": "0.33.5",
- "@img/sharp-libvips-darwin-arm64": "1.0.4",
- "@img/sharp-libvips-darwin-x64": "1.0.4",
- "@img/sharp-libvips-linux-arm": "1.0.5",
- "@img/sharp-libvips-linux-arm64": "1.0.4",
- "@img/sharp-libvips-linux-s390x": "1.0.4",
- "@img/sharp-libvips-linux-x64": "1.0.4",
- "@img/sharp-libvips-linuxmusl-arm64": "1.0.4",
- "@img/sharp-libvips-linuxmusl-x64": "1.0.4",
- "@img/sharp-linux-arm": "0.33.5",
- "@img/sharp-linux-arm64": "0.33.5",
- "@img/sharp-linux-s390x": "0.33.5",
- "@img/sharp-linux-x64": "0.33.5",
- "@img/sharp-linuxmusl-arm64": "0.33.5",
- "@img/sharp-linuxmusl-x64": "0.33.5",
- "@img/sharp-wasm32": "0.33.5",
- "@img/sharp-win32-ia32": "0.33.5",
- "@img/sharp-win32-x64": "0.33.5"
+ "@img/sharp-darwin-arm64": "0.34.1",
+ "@img/sharp-darwin-x64": "0.34.1",
+ "@img/sharp-libvips-darwin-arm64": "1.1.0",
+ "@img/sharp-libvips-darwin-x64": "1.1.0",
+ "@img/sharp-libvips-linux-arm": "1.1.0",
+ "@img/sharp-libvips-linux-arm64": "1.1.0",
+ "@img/sharp-libvips-linux-ppc64": "1.1.0",
+ "@img/sharp-libvips-linux-s390x": "1.1.0",
+ "@img/sharp-libvips-linux-x64": "1.1.0",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.1.0",
+ "@img/sharp-libvips-linuxmusl-x64": "1.1.0",
+ "@img/sharp-linux-arm": "0.34.1",
+ "@img/sharp-linux-arm64": "0.34.1",
+ "@img/sharp-linux-s390x": "0.34.1",
+ "@img/sharp-linux-x64": "0.34.1",
+ "@img/sharp-linuxmusl-arm64": "0.34.1",
+ "@img/sharp-linuxmusl-x64": "0.34.1",
+ "@img/sharp-wasm32": "0.34.1",
+ "@img/sharp-win32-ia32": "0.34.1",
+ "@img/sharp-win32-x64": "0.34.1"
}
},
"node_modules/shebang-command": {
@@ -12484,6 +21218,53 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"license": "ISC"
},
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "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"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "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"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -12500,6 +21281,16 @@
"integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
"license": "MIT"
},
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/snake-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
@@ -12532,21 +21323,40 @@
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/split2": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
"integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "dev": true,
"license": "ISC",
"engines": {
"node": ">= 10.x"
}
},
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
"node_modules/stable-hash": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz",
@@ -12554,6 +21364,29 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/stdin-discarder": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz",
@@ -12586,6 +21419,20 @@
"safe-buffer": "~5.2.0"
}
},
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -12740,6 +21587,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -12799,6 +21660,24 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/style-to-js": {
+ "version": "1.1.17",
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz",
+ "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==",
+ "license": "MIT",
+ "dependencies": {
+ "style-to-object": "1.0.9"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz",
+ "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.4"
+ }
+ },
"node_modules/styled-jsx": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
@@ -13123,6 +22002,95 @@
"node": ">=10"
}
},
+ "node_modules/tar-fs": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz",
+ "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "node_modules/tar-fs/node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar-stream/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,
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/tar-stream/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"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -13152,6 +22120,13 @@
"integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
"license": "MIT"
},
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -13170,6 +22145,26 @@
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
"license": "MIT"
},
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/ts-api-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz",
@@ -13219,6 +22214,39 @@
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
+ "node_modules/tsx": {
+ "version": "4.19.3",
+ "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz",
+ "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "~0.25.0",
+ "get-tsconfig": "^4.7.5"
+ },
+ "bin": {
+ "tsx": "dist/cli.mjs"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ }
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -13232,6 +22260,29 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/typed-array-buffer": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
@@ -13347,7 +22398,7 @@
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
- "devOptional": true,
+ "dev": true,
"license": "MIT"
},
"node_modules/unicode-canonical-property-names-ecmascript": {
@@ -13390,6 +22441,93 @@
"node": ">=4"
}
},
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
@@ -13439,6 +22577,15 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/url-pattern": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/url-pattern/-/url-pattern-1.0.3.tgz",
+ "integrity": "sha512-uQcEj/2puA4aq1R3A2+VNVBgaWYR24FdWjl7VNW83rnWftlhyzOZ/tBjezRiC2UkIzuxC8Top3IekN3vUf1WxA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
"node_modules/use-callback-ref": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
@@ -13497,6 +22644,59 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
"node_modules/wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
@@ -13750,6 +22950,20 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC"
},
+ "node_modules/write-file-atomic": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -13759,6 +22973,16 @@
"node": ">=0.4"
}
},
+ "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,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -13774,6 +22998,35 @@
"node": ">= 6"
}
},
+ "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,
+ "license": "MIT",
+ "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,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -13795,6 +23048,16 @@
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
}
}
}
diff --git a/package.json b/package.json
index c979c572..993e21ab 100644
--- a/package.json
+++ b/package.json
@@ -6,68 +6,93 @@
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
- "lint": "next lint"
+ "lint": "next lint",
+ "test:e2e": "npx playwright test",
+ "test:e2e:ui": "npx playwright test --ui"
},
"dependencies": {
"@emotion/cache": "^11.14.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",
+ "@heroicons/react": "^2.2.0",
"@hookform/resolvers": "^3.10.0",
"@mui/material": "^6.4.2",
"@mui/material-nextjs": "^6.4.2",
"@radix-ui/react-checkbox": "^1.1.4",
- "@radix-ui/react-dialog": "^1.1.6",
+ "@radix-ui/react-dialog": "^1.1.13",
"@radix-ui/react-dropdown-menu": "^2.1.6",
"@radix-ui/react-label": "^2.1.2",
"@radix-ui/react-navigation-menu": "^1.2.5",
+ "@radix-ui/react-popover": "^1.1.13",
"@radix-ui/react-progress": "^1.1.2",
"@radix-ui/react-select": "^2.1.6",
"@radix-ui/react-separator": "^1.1.2",
"@radix-ui/react-slot": "^1.1.2",
+ "@radix-ui/react-switch": "^1.2.4",
"@radix-ui/react-tabs": "^1.1.3",
+ "@radix-ui/react-toast": "^1.2.13",
"@radix-ui/react-tooltip": "^1.1.8",
"@svgr/webpack": "^8.1.0",
"@tailwindcss/postcss": "^4.0.6",
"bcrypt": "^5.1.1",
"bcryptjs": "^2.4.3",
"bootstrap": "^5.3.3",
+ "camelcase-keys": "^9.1.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
+ "cmdk": "^1.1.1",
"cookie": "^1.0.2",
- "drizzle-kit": "^0.30.1",
- "drizzle-orm": "^0.38.3",
"lucide-react": "^0.475.0",
- "next": "15.1.0",
+ "next": "^15.3.2",
"next-auth": "^4.24.11",
"next-themes": "^0.4.4",
- "pg": "^8.13.1",
+ "pg-mem": "^3.0.5",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-hook-form": "^7.54.2",
"react-icons": "^5.4.0",
+ "react-markdown": "^10.1.0",
+ "react-syntax-highlighter": "^15.6.1",
+ "react-toastify": "^11.0.5",
+ "rehype-sanitize": "^6.0.0",
+ "remark-gfm": "^4.0.1",
"resend": "^4.1.2",
"server-only": "^0.0.1",
"shadcn-ui": "^0.9.4",
"tailwind-merge": "^3.0.1",
+ "url-pattern": "^1.0.3",
"zod": "^3.24.1"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
+ "@playwright/test": "^1.50.1",
+ "@types/bcrypt": "^5.0.2",
"@types/bcryptjs": "^2.4.6",
"@types/eslint__eslintrc": "^2.1.2",
+ "@types/jest": "^29.5.14",
"@types/node": "^20",
- "@types/pg": "^8.11.10",
+ "@types/pg": "^8.11.11",
"@types/react": "^19",
"@types/react-dom": "^19",
+ "@types/react-syntax-highlighter": "^15.5.13",
"autoprefixer": "^10.4.16",
+ "better-sqlite3": "^11.9.1",
+ "dotenv": "^16.4.7",
+ "drizzle-kit": "^0.31.1",
+ "drizzle-orm": "^0.41.0",
"eslint": "^9",
"eslint-config-next": "15.1.0",
"eslint-config-prettier": "^10.0.1",
+ "i": "^0.3.7",
+ "jest": "^29.7.0",
"jiti": "^2.4.2",
+ "npm": "^11.2.0",
+ "pg": "^8.14.1",
"postcss": "^8.4.31",
"prettier": "^3.4.2",
"tailwindcss": "^3.3.0",
"tailwindcss-animate": "^1.0.7",
+ "tsx": "^4.19.3",
"typescript": "^5"
}
}
diff --git a/playwright.config.ts b/playwright.config.ts
new file mode 100644
index 00000000..356584ea
--- /dev/null
+++ b/playwright.config.ts
@@ -0,0 +1,72 @@
+import { defineConfig, devices } from '@playwright/test';
+
+/**
+ * Read environment variables from file.
+ * https://github.com/motdotla/dotenv
+ */
+// import dotenv from 'dotenv';
+// import path from 'path';
+// dotenv.config({ path: path.resolve(__dirname, '.env') });
+
+/**
+ * See https://playwright.dev/docs/test-configuration.
+ */
+export default defineConfig({
+ testDir: './tests',
+ /* Run tests in files in parallel */
+ fullyParallel: true,
+ /* Fail the build on CI if you accidentally left test.only in the source code. */
+ forbidOnly: !!process.env.CI,
+ /* Retry on CI only */
+ retries: process.env.CI ? 2 : 0,
+ /* Opt out of parallel tests on CI. */
+ workers: process.env.CI ? 1 : undefined,
+ /* Reporter to use. See https://playwright.dev/docs/test-reporters */
+ reporter: 'html',
+ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
+ use: {
+ /* Base URL to use in actions like `await page.goto('/')`. */
+ // baseURL: 'http://127.0.0.1:3000',
+
+ baseURL: " http://localhost:3001",
+ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+ trace: 'on-first-retry',
+ },
+
+ /* Configure projects for major browsers */
+ projects: [
+ {
+
+ name: 'chromium',
+ use: { ...devices['Desktop Chrome'] },
+ },
+
+
+ /* Test against mobile viewports. */
+ // {
+ // name: 'Mobile Chrome',
+ // use: { ...devices['Pixel 5'] },
+ // },
+ // {
+ // name: 'Mobile Safari',
+ // use: { ...devices['iPhone 12'] },
+ // },
+
+ /* Test against branded browsers. */
+ // {
+ // name: 'Microsoft Edge',
+ // use: { ...devices['Desktop Edge'], channel: 'msedge' },
+ // },
+ // {
+ // name: 'Google Chrome',
+ // use: { ...devices['Desktop Chrome'], channel: 'chrome' },
+ // },
+ ],
+
+ /* Run your local dev server before starting the tests */
+ webServer: {
+ command: 'npm run dev',
+ url: 'http://127.0.0.1:3001',
+ reuseExistingServer: !process.env.CI,
+ },
+});
diff --git a/postcss.config.js b/postcss.config.js
index 0cc9a9de..12a703d9 100644
--- a/postcss.config.js
+++ b/postcss.config.js
@@ -3,4 +3,4 @@ module.exports = {
tailwindcss: {},
autoprefixer: {},
},
-}
\ No newline at end of file
+};
diff --git a/src/app/(admin-only)/api/create-training/_expectedBody.ts b/src/app/(admin-only)/api/create-training/_expectedBody.ts
deleted file mode 100644
index bbaf19e8..00000000
--- a/src/app/(admin-only)/api/create-training/_expectedBody.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { z } from "zod";
-
-const expectedBody = z.object({
- title: z.string(),
- description: z.string(),
- startDate: z.string().date(),
- duration: z.number().int().positive(),
-});
-
-export default expectedBody;
diff --git a/src/app/(admin-only)/api/create-training/route.ts b/src/app/(admin-only)/api/create-training/route.ts
deleted file mode 100644
index d2fe4a17..00000000
--- a/src/app/(admin-only)/api/create-training/route.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { db } from "@/lib/db";
-import { Trainings } from "@/lib/db/schema/training/Trainings";
-import { NextRequest, NextResponse } from "next/server";
-import { userData } from "@/lib/session";
-import adminOnly from "@/middelwares/adminOnly";
-import expectedBody from "./_expectedBody";
-
-async function POSTfn(request: NextRequest, user: userData) {
- try {
- const { success, data: trainingData } = expectedBody.safeParse(
- await request.json(),
- );
- if (!success) {
- return new NextResponse(null, { status: 400 });
- }
- const training = {
- ...trainingData,
- headId: user.userId,
- };
- db.insert(Trainings).values(training).execute();
- return new NextResponse(null, { status: 201 });
- } catch (e) {
- console.log(e);
- return new NextResponse(null, { status: 500 });
- }
-}
-
-const POST = adminOnly(POSTfn);
-export { POST } ;
diff --git a/src/app/(admin-only)/create-training/page.module.css b/src/app/(admin-only)/create-training/page.module.css
deleted file mode 100644
index 6ab65d83..00000000
--- a/src/app/(admin-only)/create-training/page.module.css
+++ /dev/null
@@ -1,74 +0,0 @@
-.container {
- max-width: 800px;
- margin: 2rem auto;
- padding: 2rem;
- background: white;
- border-radius: 8px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.title {
- color: #1a1a1a;
- font-size: 2rem;
- margin-bottom: 2rem;
- font-weight: 600;
-}
-
-.form {
- display: grid;
- gap: 1.5rem;
-}
-
-.formGroup {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
-}
-
-.label {
- font-weight: 500;
- color: #4a4a4a;
-}
-
-.input,
-.textarea {
- padding: 0.75rem;
- border: 1px solid #e0e0e0;
- border-radius: 4px;
- font-size: 1rem;
- transition: border-color 0.2s;
-}
-
-.input:focus,
-.textarea:focus {
- outline: none;
- border-color: #2563eb;
- box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.1);
-}
-
-.textarea {
- min-height: 100px;
- resize: vertical;
-}
-
-.button {
- background-color: #2563eb;
- color: white;
- padding: 0.75rem 1.5rem;
- border: none;
- border-radius: 4px;
- font-size: 1rem;
- font-weight: 500;
- cursor: pointer;
- transition: background-color 0.2s;
- justify-self: start;
- margin-top: 1rem;
-}
-
-.button:hover {
- background-color: #1d4ed8;
-}
-
-.button:active {
- background-color: #1e40af;
-}
\ No newline at end of file
diff --git a/src/app/(admin-only)/create-training/page.tsx b/src/app/(admin-only)/create-training/page.tsx
deleted file mode 100644
index e478e9da..00000000
--- a/src/app/(admin-only)/create-training/page.tsx
+++ /dev/null
@@ -1,116 +0,0 @@
-'use client';
-
-import expectedBody from "../api/create-training/_expectedBody";
-import styles from './page.module.css';
-import { useState } from 'react';
-
-export default function Page() {
- const [isSubmitting, setIsSubmitting] = useState(false);
-
- return (
-
- );
-
- async function onSubmit(event: React.FormEvent) {
- event.preventDefault();
- setIsSubmitting(true);
-
- try {
- const form = event.currentTarget;
- const formData = new FormData(form);
- const givenBody = Object.fromEntries(formData.entries());
- const givenData = {
- ...givenBody,
- duration: Number(givenBody.duration),
- }
-
-
- const { success, data } = expectedBody.safeParse(
- givenData
- );
-
- if (!success) {
- alert("Please check your input and try again");
- return;
- }
-
- const response = await fetch('/api/create-training', {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- credentials: "include",
- body: JSON.stringify(data),
- });
-
- if (response.status === 201) {
- alert("Training created successfully");
- form.reset();
- } else {
- throw new Error('Failed to create training');
- }
- } catch {
- alert("An error occurred while creating the training");
- } finally {
- setIsSubmitting(false);
- }
- }
-}
diff --git a/src/app/(admin-only)/layout.tsx b/src/app/(admin-only)/layout.tsx
deleted file mode 100644
index 173379cf..00000000
--- a/src/app/(admin-only)/layout.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import type { Metadata } from "next";
-import "@/app/globals.css";
-import { cookies } from "next/headers";
-import { decryptSession, type userData } from "@/lib/session";
-import { redirect } from "next/navigation";
-import "@/app/page.module.css";
-
-export const metadata: Metadata = {
- title: "ICPC Platform",
- description: "A platform for managing ICPC-style programming competitions",
-};
-
-export default async function RootLayout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- const cookieStore = await cookies();
- const session = cookieStore.get("session")?.value;
- const validation = await decryptSession(session);
- if (!validation) {
- redirect("/login");
- }
- const user = validation as userData;
- if (user.role !== "admin") {
- // unauthorized access
- redirect("/");
- }
- return <>{children}>;
-}
diff --git a/src/app/(authorized-only)/api/edit-profile/route.ts b/src/app/(authorized-only)/api/edit-profile/route.ts
deleted file mode 100644
index 7dd5962d..00000000
--- a/src/app/(authorized-only)/api/edit-profile/route.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { db } from "@/lib/db";
-import { UsersFullData } from "@/lib/db/schema/user/UsersFullData";
-import { type userData } from "@/lib/session";
-import authOnly from "@/middelwares/authOnly";
-import { eq } from "drizzle-orm";
-import { NextResponse, type NextRequest } from "next/server";
-import { userFullData as userFulldataValidations } from "@/lib/validation/userFulldataValidations";
-import { Users } from "@/lib/db/schema/user/Users";
-
-async function POSTfn(request: NextRequest, user: userData) {
- try {
- const { success, data } = userFulldataValidations.safeParse(
- await request.json(),
- );
- if (!success) {
- return new NextResponse(null, { status: 400 });
- }
- const userFullData = await db
- .select()
- .from(UsersFullData)
- .where(eq(UsersFullData.userId, user.userId))
- .execute();
- if (userFullData.length === 0) {
- const userData = (
- await db
- .select({ cfHandle: Users.cfHandle })
- .from(Users)
- .where(eq(Users.userId, user.userId))
- .execute()
- )[0];
- await db
- .insert(UsersFullData)
- .values({
- userId: user.userId,
- cfHandle: userData.cfHandle,
- username: user.username,
- })
- .execute();
- }
- await db
- .update(UsersFullData)
- .set(data)
- .where(eq(UsersFullData.userId, user.userId))
- .execute();
- return new NextResponse(null, { status: 201 });
- } catch (e) {
- console.error(e);
- return new NextResponse(null, { status: 500 });
- }
-}
-
-const POST = authOnly(POSTfn);
-export { POST };
diff --git a/src/app/(authorized-only)/api/logout/route.ts b/src/app/(authorized-only)/api/logout/route.ts
deleted file mode 100644
index df0b5682..00000000
--- a/src/app/(authorized-only)/api/logout/route.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-export function GET() {
-}
diff --git a/src/app/(authorized-only)/dashboard/page.tsx b/src/app/(authorized-only)/dashboard/page.tsx
deleted file mode 100644
index da470b05..00000000
--- a/src/app/(authorized-only)/dashboard/page.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-"use client";
-
-import { useState } from "react";
-import { TrainingCard } from "@/components/training/TrainingCard";
-import { mockUserTrainings, mockAvailableTrainings } from "@/lib/mock/trainings";
-import { Button } from "@/components/ui/button";
-import { Input } from "@/components/ui/input";
-import { Search } from "lucide-react";
-
-export default function DashboardPage() {
- const [searchQuery, setSearchQuery] = useState("");
-
- const filteredUserTrainings = mockUserTrainings.filter(training =>
- training.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
- training.description.toLowerCase().includes(searchQuery.toLowerCase())
- );
-
- const filteredAvailableTrainings = mockAvailableTrainings.filter(training =>
- training.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
- training.description.toLowerCase().includes(searchQuery.toLowerCase())
- );
-
- const handleEnroll = async (trainingId: string) => {
- // This will be replaced with actual API call later
- console.log(`Enrolling in training: ${trainingId}`);
- };
-
- return (
-
-
- {/* Search Bar */}
-
-
- setSearchQuery(e.target.value)}
- />
-
-
- {/* My Trainings Section */}
-
-
-
My Trainings
- View All
-
- {filteredUserTrainings.length === 0 ? (
-
-
You haven't joined any trainings yet.
-
- ) : (
-
- {filteredUserTrainings.map((training) => (
-
- ))}
-
- )}
-
-
- {/* Available Trainings Section */}
-
-
-
Available Trainings
- View All
-
- {filteredAvailableTrainings.length === 0 ? (
-
-
No trainings found matching your search.
-
- ) : (
-
- {filteredAvailableTrainings.map((training) => (
-
- ))}
-
- )}
-
-
-
- );
-}
\ No newline at end of file
diff --git a/src/app/(authorized-only)/edit-profile/_academicForm.tsx b/src/app/(authorized-only)/edit-profile/_academicForm.tsx
deleted file mode 100644
index a37eabb0..00000000
--- a/src/app/(authorized-only)/edit-profile/_academicForm.tsx
+++ /dev/null
@@ -1,190 +0,0 @@
-"use client";
-
-import {
- FormControl,
- FormDescription,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@/components/ui/form";
-import { Input } from "@/components/ui/input";
-import { useFormContext } from "react-hook-form";
-import { userFullData } from "@/lib/validation/userFulldataValidations";
-import { z } from "zod";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@/components/ui/select";
-
-export default function AcademicForm() {
- const form = useFormContext>();
- const universityOptions = userFullData.shape.university._def.innerType.options;
- const facultyOptions = userFullData.shape.faculty._def.innerType.options;
- const departmentOptions = userFullData.shape.department._def.innerType.options;
-
- return (
-
- (
-
- University
-
-
-
-
-
-
-
- {universityOptions.map((option) => (
-
- {option}
-
- ))}
-
-
-
- Select the university you are currently enrolled in or graduated from.
-
-
-
- )}
- />
- (
-
- Faculty
-
-
-
-
-
-
-
- {facultyOptions.map((option) => (
-
- {option}
-
- ))}
-
-
-
- Choose your faculty or college within the university.
-
-
-
- )}
- />
- (
-
- Department
-
-
-
-
-
-
-
- {departmentOptions.map((option) => (
-
- {option}
-
- ))}
-
-
-
- Select your specific department or major.
-
-
-
- )}
- />
- (
-
- Expected Graduation Date
-
-
-
-
- Your expected or actual graduation date.
-
-
-
- )}
- />
- (
-
- Current Academic Year
-
-
-
-
- Your current year of study (1st year, 2nd year, etc.).
-
-
-
- )}
- />
-
- );
-}
diff --git a/src/app/(authorized-only)/edit-profile/_academicFrom.tsx b/src/app/(authorized-only)/edit-profile/_academicFrom.tsx
deleted file mode 100644
index b9139ca3..00000000
--- a/src/app/(authorized-only)/edit-profile/_academicFrom.tsx
+++ /dev/null
@@ -1,116 +0,0 @@
-"use client";
-
-import {
- FormControl,
- FormDescription,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@/components/ui/form";
-import { Input } from "@/components/ui/input";
-import { useFormContext } from "react-hook-form";
-import { userFullData } from "@/lib/validation/userFulldataValidations";
-import { z } from "zod";
-
-export default function AcademicForm() {
- const form = useFormContext>();
- const universityOptions =
- userFullData.shape.university._def.innerType.options;
- const facultyOptions = userFullData.shape.faculty._def.innerType.options;
- const departmentOptions =
- userFullData.shape.department._def.innerType.options;
- return (
-
- (
-
- University
-
-
-
- {universityOptions.map((option, index) => (
-
- {option}
-
- ))}
-
-
-
-
- )}
- />
- (
-
- Faculty
-
-
-
- {facultyOptions.map((option, index) => (
-
- {option}
-
- ))}
-
-
-
-
- )}
- />
- (
-
- Department
-
-
-
- {departmentOptions.map((option, index) => (
-
- {option}
-
- ))}
-
-
- this is your department.
-
-
- )}
- />
- (
-
- graduation year
-
-
-
- this is your department.
-
-
- )}
- />
- (
-
- academic year
-
-
-
- this is year you are in.
-
-
- )}
- />
-
- );
-}
diff --git a/src/app/(authorized-only)/edit-profile/_handlesForm.tsx b/src/app/(authorized-only)/edit-profile/_handlesForm.tsx
deleted file mode 100644
index d0fa2076..00000000
--- a/src/app/(authorized-only)/edit-profile/_handlesForm.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-"use client";
-import {
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@/components/ui/form";
-import { Input } from "@/components/ui/input";
-import { userFullData } from "@/lib/validation/userFulldataValidations";
-import { useFormContext } from "react-hook-form";
-import { z } from "zod";
-
-export default function HandlesForm() {
- const form = useFormContext>();
- const handles = [
- { id: "vjudge", label: "VJudge Handle", placeholder: "Enter your VJudge username" },
- { id: "atcoder", label: "AtCoder Handle", placeholder: "Enter your AtCoder username" },
- { id: "topcoder", label: "TopCoder Handle", placeholder: "Enter your TopCoder username" },
- { id: "spoj", label: "SPOJ Handle", placeholder: "Enter your SPOJ username" },
- { id: "codechef", label: "CodeChef Handle", placeholder: "Enter your CodeChef username" },
- { id: "csacademy", label: "CS Academy Handle", placeholder: "Enter your CS Academy username" },
- { id: "leetcode", label: "LeetCode Handle", placeholder: "Enter your LeetCode username" },
- { id: "cses", label: "CSES Handle", placeholder: "Enter your CSES username" },
- ] as const;
-
- return (
-
- {handles.map((handle) => (
- (
-
- {handle.label}
-
-
-
-
-
- )}
- />
- ))}
-
- );
-}
diff --git a/src/app/(authorized-only)/edit-profile/_personalForm.tsx b/src/app/(authorized-only)/edit-profile/_personalForm.tsx
deleted file mode 100644
index b5b7e366..00000000
--- a/src/app/(authorized-only)/edit-profile/_personalForm.tsx
+++ /dev/null
@@ -1,134 +0,0 @@
-"use client";
-import {
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@/components/ui/form";
-import { Input } from "@/components/ui/input";
-import { userFullData } from "@/lib/validation/userFulldataValidations";
-import { useFormContext } from "react-hook-form";
-import { z } from "zod";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@/components/ui/select";
-
-export default function PersonList() {
- const form = useFormContext>();
-
- const personalFields = [
- { name: "nameEnFirst", label: "First Name (English)" },
- { name: "nameEnLast", label: "Last Name (English)" },
- { name: "nameAR1", label: "First Name (Arabic)" },
- { name: "nameAR2", label: "Second Name (Arabic)" },
- { name: "nameAR3", label: "Third Name (Arabic)" },
- { name: "nameAR4", label: "Last Name (Arabic)" },
- ] as const;
-
- const countryOptions = userFullData.shape.country._def.innerType.options;
- return (
-
- {personalFields.map((field) => (
- (
-
- {field.label}
-
-
-
-
-
- )}
- />
- ))}
- (
-
-
- National ID Number
-
-
-
-
-
-
- )}
- />
- (
-
-
- Country of Residence
-
-
-
-
-
-
-
-
- {countryOptions.map((option) => (
-
- {option}
-
- ))}
-
-
-
-
- )}
- />
- (
-
- City
-
-
-
-
-
- )}
- />
-
- );
-}
diff --git a/src/app/(authorized-only)/edit-profile/_socialForm.tsx b/src/app/(authorized-only)/edit-profile/_socialForm.tsx
deleted file mode 100644
index 898b0fe7..00000000
--- a/src/app/(authorized-only)/edit-profile/_socialForm.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-"use client";
-import {
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@/components/ui/form";
-import { Input } from "@/components/ui/input";
-import { userFullData } from "@/lib/validation/userFulldataValidations";
-import { useFormContext } from "react-hook-form";
-import { z } from "zod";
-
-export default function SocialForm() {
- const form = useFormContext>();
- const socialProfiles = [
- {
- id: "facebook",
- label: "Facebook Profile",
- placeholder: "Enter your Facebook profile URL"
- },
- {
- id: "linkedIn",
- label: "LinkedIn Profile",
- placeholder: "Enter your LinkedIn profile URL"
- },
- {
- id: "twitter",
- label: "Twitter/X Profile",
- placeholder: "Enter your Twitter/X profile URL"
- },
- {
- id: "github",
- label: "GitHub Profile",
- placeholder: "Enter your GitHub profile URL"
- }
- ] as const;
-
- return (
-
- {socialProfiles.map((profile) => (
- (
-
- {profile.label}
-
-
-
-
-
- )}
- />
- ))}
-
- );
-}
diff --git a/src/app/(authorized-only)/join-training/_trainingComp.tsx b/src/app/(authorized-only)/join-training/_trainingComp.tsx
deleted file mode 100644
index 8e29fcdb..00000000
--- a/src/app/(authorized-only)/join-training/_trainingComp.tsx
+++ /dev/null
@@ -1,78 +0,0 @@
-"use client";
-import { useRouter } from "next/navigation";
-import type { TrainingType } from "./page";
-import styles from "./training.module.css";
-
-export default function TrainingComp({ training }: { training: TrainingType }) {
- const router = useRouter();
-
- const formatDate = (dateString: string) => {
- return new Date(dateString).toLocaleDateString('en-US', {
- year: 'numeric',
- month: 'long',
- day: 'numeric',
- hour: '2-digit',
- minute: '2-digit',
- });
- };
-
- const formatDuration = (duration: number | null) => {
- if (!duration) return 'Duration not specified';
- if (duration < 60) return `${duration} minutes`;
- const hours = Math.floor(duration / 60);
- const minutes = duration % 60;
- return `${hours}h${minutes ? ` ${minutes}m` : ''}`;
- };
-
- return (
-
-
-
-
-
{training.title}
- Active
-
-
-
{training.description}
-
-
-
-
-
-
-
{formatDate(training.startDate)}
-
-
-
-
-
-
{formatDuration(training.duration)}
-
-
-
-
-
{
- fetch("/api/training/join/" + training.id).then((res) => {
- if (res.ok) {
- alert("You have successfully joined the training!");
- router.push("/profile");
- } else {
- alert("Failed to join the training. Please try again.");
- }
- });
- }}
- className={styles.button}
- >
- Join Training
-
-
-
-
-
-
- );
-}
diff --git a/src/app/(authorized-only)/join-training/page.tsx b/src/app/(authorized-only)/join-training/page.tsx
deleted file mode 100644
index 2d27b0c0..00000000
--- a/src/app/(authorized-only)/join-training/page.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { db } from "@/lib/db";
-import { Trainings } from "@/lib/db/schema/training/Trainings";
-import { eq } from "drizzle-orm";
-import type { Metadata } from "next";
-import TrainingComp from "./_trainingComp";
-import styles from "./training.module.css";
-
-export const metadata: Metadata = {
- title: "Available Trainings | ICPC Platform",
- description: "Browse and join upcoming ICPC-style programming training sessions",
-};
-export const dynamic = "force-dynamic";
-export default async function Page() {
- const trainings = (await db
- .select({
- id: Trainings.trainingId,
- title: Trainings.title,
- description: Trainings.description,
- startDate: Trainings.startDate,
- duration: Trainings.duration,
- })
- .from(Trainings)
- .where(eq(Trainings.status, "active"))
- .execute()) satisfies Array;
-
- return (
-
-
-
-
Available Trainings
-
- Join our ICPC-style programming training sessions to enhance your competitive programming skills
-
-
-
-
- {trainings.map((training) => (
-
- ))}
-
-
- {trainings.length === 0 && (
-
-
No Active Trainings
-
- There are no training sessions available at the moment. Please check back later.
-
-
- )}
-
-
- );
-}
-
-export type TrainingType = {
- id: number;
- title: string;
- description: string;
- startDate: string;
- duration: number | null;
-};
diff --git a/src/app/(authorized-only)/join-training/training.module.css b/src/app/(authorized-only)/join-training/training.module.css
deleted file mode 100644
index f7d83616..00000000
--- a/src/app/(authorized-only)/join-training/training.module.css
+++ /dev/null
@@ -1,182 +0,0 @@
-/* Page Layout */
-.pageContainer {
- min-height: 100vh;
- background-color: var(--background);
- padding: 2rem 1rem;
-}
-
-.contentWrapper {
- max-width: 1400px;
- margin: 0 auto;
- width: 100%;
-}
-
-.headerSection {
- text-align: center;
- margin-bottom: 3rem;
- max-width: 800px;
- margin-left: auto;
- margin-right: auto;
-}
-
-.pageTitle {
- font-size: 2.5rem;
- font-weight: 700;
- color: var(--text-primary);
- margin-bottom: 1rem;
-}
-
-.pageDescription {
- font-size: 1.125rem;
- color: var(--text-secondary);
- line-height: 1.6;
-}
-
-.trainingsGrid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
- gap: 2rem;
- margin-bottom: 2rem;
-}
-
-.emptyState {
- background-color: var(--content-bg);
- border-radius: 0.75rem;
- padding: 3rem 2rem;
- text-align: center;
- max-width: 600px;
- margin: 2rem auto;
-}
-
-.emptyStateTitle {
- font-size: 1.5rem;
- font-weight: 600;
- color: var(--text-primary);
- margin-bottom: 1rem;
-}
-
-.emptyStateText {
- color: var(--text-secondary);
- font-size: 1.125rem;
-}
-
-/* Training Card Styles */
-.trainingCard {
- background-color: var(--content-bg);
- border-radius: 0.75rem;
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1);
- border: 1px solid var(--border-color);
- transition: all 0.3s;
- height: 100%;
-}
-
-.trainingCard:hover {
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.2);
- transform: translateY(-2px);
-}
-
-.cardContent {
- padding: 1.5rem;
- display: flex;
- flex-direction: column;
- height: 100%;
- gap: 1.5rem;
-}
-
-.header {
- display: flex;
- align-items: center;
- justify-content: space-between;
-}
-
-.title {
- font-size: 1.25rem;
- font-weight: 600;
- color: var(--text-primary);
- transition: color 0.2s;
-}
-
-.trainingCard:hover .title {
- color: var(--accent-color);
-}
-
-.badge {
- padding: 0.25rem 0.75rem;
- font-size: 0.875rem;
- font-weight: 500;
- color: var(--text-primary);
- background-color: var(--border-color);
- border-radius: 9999px;
-}
-
-.description {
- font-size: 1rem;
- color: var(--text-secondary);
- display: -webkit-box;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical;
- overflow: hidden;
- line-height: 1.5;
-}
-
-.infoList {
- display: flex;
- flex-direction: column;
- gap: 1rem;
-}
-
-.infoItem {
- display: flex;
- align-items: center;
- color: var(--text-secondary);
- font-size: 0.875rem;
-}
-
-.icon {
- width: 1rem;
- height: 1rem;
- margin-right: 0.75rem;
- color: var(--text-secondary);
-}
-
-.button {
- width: 100%;
- background-color: var(--accent-color);
- color: var(--background);
- font-weight: 500;
- padding: 0.75rem 1.5rem;
- border-radius: 0.5rem;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 0.75rem;
- transition: all 0.2s;
- cursor: pointer;
- border: none;
- margin-top: auto;
-}
-
-.button:hover {
- background-color: var(--text-primary);
- transform: translateY(-1px);
-}
-
-.button:focus {
- outline: none;
- box-shadow: 0 0 0 2px var(--background), 0 0 0 4px var(--accent-color);
-}
-
-/* Responsive adjustments */
-@media (max-width: 768px) {
- .pageContainer {
- padding: 1rem;
- }
-
- .pageTitle {
- font-size: 2rem;
- }
-
- .trainingsGrid {
- grid-template-columns: 1fr;
- }
-}
\ No newline at end of file
diff --git a/src/app/(authorized-only)/layout.tsx b/src/app/(authorized-only)/layout.tsx
deleted file mode 100644
index 236189e7..00000000
--- a/src/app/(authorized-only)/layout.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import type { Metadata } from "next";
-import "@/app/globals.css";
-import { cookies } from "next/headers";
-import { decryptSession } from "@/lib/session";
-import { redirect } from "next/navigation";
-import "@/app/page.module.css";
-
-export const metadata: Metadata = {
- title: "ICPC Platform",
- description: "A platform for managing ICPC-style programming competitions",
-};
-
-export default async function RootLayout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- const cookieStore = await cookies();
- const session = cookieStore.get("session")?.value;
- const validation = await decryptSession(session);
- if (!validation) {
- // is not logged in
- redirect("/login");
- }
- return <> {children} >;
-}
diff --git a/src/app/(authorized-only)/my-trainings/page.tsx b/src/app/(authorized-only)/my-trainings/page.tsx
deleted file mode 100644
index 2afc57e7..00000000
--- a/src/app/(authorized-only)/my-trainings/page.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-"use client";
-
-import { useState } from "react";
-import { TrainingCard } from "@/components/training/TrainingCard";
-import { mockUserTrainings } from "@/lib/mock/trainings";
-import { Input } from "@/components/ui/input";
-import { Search } from "lucide-react";
-
-export default function MyTrainingsPage() {
- const [searchQuery, setSearchQuery] = useState("");
-
- const filteredTrainings = mockUserTrainings.filter(training =>
- training.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
- training.description.toLowerCase().includes(searchQuery.toLowerCase())
- );
-
- return (
-
-
-
-
My Trainings
-
- Track your progress in enrolled training programs.
-
-
-
- {/* Search Bar */}
-
-
- setSearchQuery(e.target.value)}
- />
-
-
- {/* Trainings Grid */}
- {filteredTrainings.length === 0 ? (
-
-
You haven't joined any trainings yet.
-
- ) : (
-
- {filteredTrainings.map((training) => (
-
- ))}
-
- )}
-
-
- );
-}
\ No newline at end of file
diff --git a/src/app/(authorized-only)/profile/_Profile.tsx b/src/app/(authorized-only)/profile/_Profile.tsx
deleted file mode 100644
index 3676bf21..00000000
--- a/src/app/(authorized-only)/profile/_Profile.tsx
+++ /dev/null
@@ -1,241 +0,0 @@
-"use client";
-import React, { useContext } from "react";
-import { useState } from "react";
-import Image from "next/image";
-import { type User } from "./page";
-import {
- FaGraduationCap,
- FaLink,
- FaCode,
- FaMapMarkerAlt,
- FaGithub,
- FaTwitter,
- FaUserEdit,
-} from "react-icons/fa";
-import { SiLeetcode, SiCodechef, SiCodeforces } from "react-icons/si";
-import Link from "next/link";
-
-const activeButtonStyle = "text-primary border-b-2 border-primary";
-const unactiveButtonStyle =
- "text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-300";
-const tabStyle = "tab px-3 md:px-4 py-2 font-medium text-sm md:text-base";
-
-const UserContext = React.createContext({} as User);
-
-export default function Profile({
- user,
- className,
- allowEdit = false,
-}: {
- user: User;
- className?: string;
- allowEdit: boolean;
-}) {
- const userContent = userData(user);
- const [activeTab, setActiveTab] = useState("cp");
-
- return (
-
-
-
-
-
-
- setActiveTab("cp")}
- >
-
- Competitive Programming
-
- setActiveTab("academic")}
- >
-
- Academic
-
- setActiveTab("socials")}
- >
-
- Social Links
-
- {allowEdit && (
-
-
- edit profile
-
- )}
-
-
-
-
-
-
- {userContent[activeTab].map((data, index) => {
- if (!data.value) return null;
- return (
-
-
-
- {data.icon || }
-
-
-
- {data.name}
-
-
- {data.value}
-
-
-
-
- );
- })}
-
-
-
-
-
- );
-}
-
-function Info() {
- const user = useContext(UserContext);
- return (
-
-
-
-
-
-
- @{user.username}
-
-
-
-
-
{`${user.nameEnFirst ?? ""} ${user.nameEnLast ?? ""}`}
- {user.nameAR1 && (
-
- {`${user.nameAR1} ${user.nameAR2 ?? ""} ${user.nameAR3 ?? ""} ${user.nameAR4 ?? ""}`}
-
- )}
-
-
-
- {user.country && (
-
-
- {`${user.city ?? ""}, ${user.country ?? ""}`}
-
- )}
-
-
-
- );
-}
-
-function userData(user: User) {
- return {
- socials: [
- {
- name: "LinkedIn",
- value: user.linkedIn,
- icon: ,
- },
- {
- name: "Facebook",
- value: user.facebook,
- icon: ,
- },
- {
- name: "Twitter",
- value: user.twitter,
- icon: ,
- },
- {
- name: "GitHub",
- value: user.github,
- icon: ,
- },
- ],
- academic: [
- {
- name: "University",
- value: user.university,
- icon: ,
- },
- {
- name: "Faculty",
- value: user.faculty,
- icon: ,
- },
- {
- name: "Department",
- value: user.department,
- icon: ,
- },
- {
- name: "Academic Year",
- value: user.academicYear,
- icon: ,
- },
- {
- name: "Expected Graduation",
- value: user.graduationYear
- ? new Date(user.graduationYear).getFullYear()
- : null,
- icon: ,
- },
- ],
-
- cp: [
- {
- name: "Codeforces",
- value: user.cfHandle,
- icon: ,
- },
- { name: "Vjudge", value: user.vjudge },
- { name: "AtCoder", value: user.atcoder },
- {
- name: "CodeChef",
- value: user.codechef,
- icon: ,
- },
- {
- name: "LeetCode",
- value: user.leetcode,
- icon: ,
- },
- { name: "SPOJ", value: user.spoj },
- { name: "CSES", value: user.cses },
- { name: "TopCoder", value: user.topcoder },
- { name: "CS Academy", value: user.csacademy },
- ],
- };
-}
diff --git a/src/app/(authorized-only)/profile/page.tsx b/src/app/(authorized-only)/profile/page.tsx
deleted file mode 100644
index b1d3a576..00000000
--- a/src/app/(authorized-only)/profile/page.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import "@/app/globals.css";
-
-import Sidebar from "./_Sidebar";
-import Profile from "./_Profile";
-import { UsersFullData } from "@/lib/db/schema/user/UsersFullData";
-import { cookies } from "next/headers";
-import { decryptSession } from "@/lib/session";
-import { db } from "@/lib/db";
-import { eq } from "drizzle-orm";
-
-export type User = typeof UsersFullData.$inferSelect;
-
-export default async function ProfilePage() {
- const cookieStore = await cookies();
- const session = cookieStore.get("session")?.value;
- const validation = await decryptSession(session);
- if (!validation) return null;
- const { userId } = validation;
- const user: User | undefined = (
- await db
- .select()
- .from(UsersFullData)
- .where(eq(UsersFullData.userId, userId))
- .execute()
- )[0]?? { userId };
-
- return (
-
- );
-}
diff --git a/src/app/(authorized-only)/training/[id]/_TrainingView.tsx b/src/app/(authorized-only)/training/[id]/_TrainingView.tsx
deleted file mode 100644
index 6da2828b..00000000
--- a/src/app/(authorized-only)/training/[id]/_TrainingView.tsx
+++ /dev/null
@@ -1,296 +0,0 @@
-import { Training } from '@/lib/types/training';
-import { Button } from '@/components/ui/button';
-import { Checkbox } from '@/components/ui/checkbox';
-import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
-import { Input } from '@/components/ui/input';
-import { Badge } from '@/components/ui/badge';
-import { Send, Bot, MessageCircle, Book, FileText, Trophy, BellRing, Users, Medal } from 'lucide-react';
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
-
-interface TrainingViewProps {
- training: Training;
-}
-
-export default function TrainingView({ training }: TrainingViewProps) {
- // Mock standings data
- const standings = [
- { name: "Ahmed Hassan", score: 850, solved: 12 },
- { name: "Sarah Mohamed", score: 780, solved: 11 },
- { name: "Omar Ali", score: 720, solved: 10 },
- { name: "Nour Ibrahim", score: 690, solved: 9 },
- { name: "Youssef Ahmed", score: 650, solved: 8 },
- ];
-
- return (
-
- {/* Header */}
-
-
-
-
Phase 2: Dynamic Programming and Graph
-
- Master advanced algorithms and problem-solving techniques
-
-
-
- Continue Learning
-
-
-
-
-
- {/* Main Content - Left Column */}
-
- {/* Tasks Section */}
-
-
-
-
- Tasks
-
- View All
-
-
-
- {training.tasks.map((task) => (
-
-
-
- {task.title}
-
-
- {task.completed ? "Completed" : "Pending"}
-
-
- ))}
-
-
-
-
- {/* Practice & Contest Section */}
-
-
-
-
- Practice & Contests
-
-
-
-
-
- Practice Sheets
- Contest Sheets
-
-
-
- {['Basic Algorithms Practice', 'Data Structures Practice', 'Graph Problems'].map((sheet, index) => (
-
-
-
{sheet}
-
15 problems
-
-
- Start Practice
-
-
- ))}
-
-
-
-
- {['Weekly Contest 1', 'Weekly Contest 2', 'Mock ICPC'].map((contest, index) => (
-
-
-
{contest}
-
Duration: 3 hours
-
-
- View Contest
-
-
- ))}
-
-
-
-
-
-
- {/* Materials Section */}
-
-
-
-
- Learning Materials
-
-
-
-
-
- {[1, 2, 3, 4].map((week) => (
-
- Week {week}
-
- ))}
-
-
- {['Introduction to Algorithms', 'Data Structures Basics', 'Graph Theory', 'Dynamic Programming'].map((topic, index) => (
-
-
- {topic}
-
- Week 1
-
- View Material
-
-
-
-
- ))}
-
-
-
-
-
-
- {/* Sidebar - Right Column */}
-
- {/* Standings Section */}
-
-
-
-
- Standings
-
-
-
-
- {standings.map((trainee, index) => (
-
-
-
- {index + 1}
-
- {trainee.name}
-
-
- {trainee.score}
- {trainee.solved} solved
-
-
- ))}
-
-
-
-
- {/* Announcements Section */}
-
-
-
-
- Announcements
-
-
-
-
- {training.announcements.map((announcement, index) => (
-
-
- {announcement.date}
-
-
- {announcement.message}
-
-
- ))}
-
-
-
-
- {/* Chat Section */}
-
-
-
-
-
-
- Group
-
-
-
- Mentor
-
-
-
- AI
-
-
-
-
- {training.chatMessages.map((message, index) => (
-
-
-
- {message.sender}
-
-
-
- {message.message}
-
-
-
-
- ))}
-
-
-
-
-
- Start a conversation with your mentor
-
-
-
-
-
-
- Ask AI mentor for help
-
-
-
-
-
-
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/src/app/(authorized-only)/training/[id]/page.tsx b/src/app/(authorized-only)/training/[id]/page.tsx
deleted file mode 100644
index 734ecb53..00000000
--- a/src/app/(authorized-only)/training/[id]/page.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { notFound } from 'next/navigation';
-import TrainingView from './_TrainingView';
-import { mockTraining } from '@/lib/mock/training-data';
-
-type Props = {
- params: Promise<{ id: string }>;
- searchParams?: Promise<{ [key: string]: string | string[] | undefined }>;
-}
-
-export default async function TrainingPage({
- params,
-}: Props) {
- const id = (await params).id;
- // For now, we only support the 'test' ID
- if (id !== 'test') {
- notFound();
- }
-
- return ;
-}
\ No newline at end of file
diff --git a/src/app/(authorized-only)/trainings/page.tsx b/src/app/(authorized-only)/trainings/page.tsx
deleted file mode 100644
index 2a65f1b2..00000000
--- a/src/app/(authorized-only)/trainings/page.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-"use client";
-
-import { useState } from "react";
-import { TrainingCard } from "@/components/training/TrainingCard";
-import { mockAvailableTrainings } from "@/lib/mock/trainings";
-import { Input } from "@/components/ui/input";
-import { Search } from "lucide-react";
-
-export default function TrainingsPage() {
- const [searchQuery, setSearchQuery] = useState("");
-
- const filteredTrainings = mockAvailableTrainings.filter(training =>
- training.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
- training.description.toLowerCase().includes(searchQuery.toLowerCase())
- );
-
- const handleEnroll = async (trainingId: string) => {
- // This will be replaced with actual API call later
- console.log(`Enrolling in training: ${trainingId}`);
- };
-
- return (
-
-
-
-
Available Trainings
-
- Browse and apply for our comprehensive training programs.
-
-
-
- {/* Search Bar */}
-
-
- setSearchQuery(e.target.value)}
- />
-
-
- {/* Trainings Grid */}
- {filteredTrainings.length === 0 ? (
-
-
No trainings found matching your search.
-
- ) : (
-
- {filteredTrainings.map((training) => (
-
- ))}
-
- )}
-
-
- );
-}
\ No newline at end of file
diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx
index 63061c6d..91eeef54 100644
--- a/src/app/about/page.tsx
+++ b/src/app/about/page.tsx
@@ -21,7 +21,7 @@ import {
} from "lucide-react";
import Link from "next/link";
-export default function AboutPage() {
+export default function Page() {
return (
{/* Hero Section */}
@@ -39,10 +39,12 @@ export default function AboutPage() {
About Us
- Welcome to ICPC Assiut University Community - where coding excellence meets innovation! 🚀
- As a student-led initiative at Assiut University, we're dedicated to nurturing the next generation
- of competitive programmers. Our mission is simple: transform passionate students into problem-solving
- champions through comprehensive training and mentorship in competitive programming.
+ Welcome to ICPC Assiut University Community - where coding
+ excellence meets innovation! 🚀 As a student-led initiative at
+ Assiut University, we're dedicated to nurturing the next
+ generation of competitive programmers. Our mission is simple:
+ transform passionate students into problem-solving champions through
+ comprehensive training and mentorship in competitive programming.
@@ -177,14 +179,19 @@ export default function AboutPage() {
{/* Achievements */}
- Achievements and Impact
+
+ Achievements and Impact
+
- Our community consistently qualifies teams for prestigious contests like ECPC, ACPC, and ICPC.
- Our alumni have gone on to conquer the tech world, landing roles at giants like Microsoft, Amazon,
- and Huawei. But we're not just creating programmers – we're building a community of problem
- solvers who can tackle any challenge, debug any error, and maybe even fix the office printer!
- (Okay, maybe not the printer... those are beyond anyone's skills 🖨️)
+ Our community consistently qualifies teams for prestigious contests
+ like ECPC, ACPC, and ICPC. Our alumni have gone on to conquer the
+ tech world, landing roles at giants like Microsoft, Amazon, and
+ Huawei. But we're not just creating programmers – we're
+ building a community of problem solvers who can tackle any
+ challenge, debug any error, and maybe even fix the office printer!
+ (Okay, maybe not the printer... those are beyond anyone's
+ skills 🖨️)
@@ -193,7 +200,7 @@ export default function AboutPage() {
Get in Touch
-
Follow us on Facebook
-
@@ -229,7 +244,15 @@ function FeatureCard({ icon, title, description }: { icon: React.ReactNode; titl
);
}
-function ProgramCard({ icon, title, description }: { icon: React.ReactNode; title: string; description: string }) {
+function ProgramCard({
+ icon,
+ title,
+ description,
+}: {
+ icon: React.ReactNode;
+ title: string;
+ description: string;
+}) {
return (
@@ -239,4 +262,4 @@ function ProgramCard({ icon, title, description }: { icon: React.ReactNode; titl
{description}
);
-}
\ No newline at end of file
+}
diff --git a/src/app/admin-only/create-training/actions.ts b/src/app/admin-only/create-training/actions.ts
new file mode 100644
index 00000000..5938e144
--- /dev/null
+++ b/src/app/admin-only/create-training/actions.ts
@@ -0,0 +1,127 @@
+"use server";
+import { db } from "@/lib/db";
+import { Trainings } from "@/lib/db/schema/training/Trainings";
+import { createTrainingSchema } from "@/lib/validation/training/createTraining";
+import { getUserData } from "@/lib/session";
+import { z } from "zod";
+import { revalidatePath } from "next/cache";
+import { Blocks } from "@/lib/db/schema/training/Blocks";
+import { Users } from "@/lib/db/schema/user/Users";
+import { like, eq } from "drizzle-orm";
+
+export async function createTrainingAction(
+ formData: z.infer
,
+) {
+ try {
+ // Validate data
+ const validatedData = createTrainingSchema.parse(formData);
+
+ // Get current user data
+ const userData = await getUserData();
+ if (!userData) {
+ return { success: false, error: "User not authenticated" };
+ }
+
+ // Check if user has admin permissions
+ if (userData.role !== "admin") {
+ return { success: false, error: "Unauthorized: Admin access required" };
+ }
+ const { headUsername, chiefJudgeUsername, ...mainData } = validatedData;
+ // find headId
+ const headSearch = await db
+ .select({ userId: Users.userId })
+ .from(Users)
+ .where(eq(Users.username, headUsername))
+ .execute();
+ if (headSearch.length === 0) {
+ return { success: false, error: "Head judge not found" };
+ }
+ const headId = headSearch[0].userId;
+
+ // find chiefJudgeId
+ const chiefJudgeSearch = await db
+ .select({ userId: Users.userId })
+ .from(Users)
+ .where(eq(Users.username, chiefJudgeUsername))
+ .execute();
+ if (chiefJudgeSearch.length === 0) {
+ return { success: false, error: "Chief judge not found" };
+ }
+ const chiefJudgeId = chiefJudgeSearch[0].userId;
+ const insertData = {
+ ...mainData,
+ headId: headId,
+ chiefJudge: chiefJudgeId,
+ startDate: validatedData.startDate.toDateString(),
+ } satisfies typeof Trainings.$inferInsert;
+ // Insert training into database
+ await db.transaction(async (tx) => {
+ const { trainingId } = (
+ await tx
+ .insert(Trainings)
+ .values(insertData)
+ .returning({ trainingId: Trainings.trainingId })
+ .execute()
+ )[0];
+
+ for (let i = 0; i <= validatedData.duration; i++) {
+ tx.insert(Blocks)
+ .values({
+ trainingId: trainingId,
+ blockNumber: i,
+ title: `Block ${i}`,
+ description: `Description for block ${i}`,
+ hidden: true,
+ } satisfies typeof Blocks.$inferInsert)
+ .returning({ trainingId: Trainings.trainingId })
+ .execute();
+ }
+ });
+
+ // Revalidate the trainings path to update the UI
+ revalidatePath("/protected/trainings");
+
+ // Return success with training ID
+ return { success: true };
+ } catch (error) {
+ console.error("Error creating training:", error);
+
+ if (error instanceof z.ZodError) {
+ return {
+ success: false,
+ error: "Validation error",
+ fieldErrors: error.errors,
+ };
+ }
+
+ return {
+ success: false,
+ error:
+ error instanceof Error ? error.message : "Failed to create training",
+ };
+ }
+}
+
+export async function searchByUsername({
+ username,
+}: {
+ username: string;
+}): Promise<{ username: string }[] | null> {
+ try {
+ const userData = await getUserData();
+
+ if (userData == null || userData.role !== "admin") {
+ throw Error("Unautherized access");
+ }
+ const users = await db
+ .select({ username: Users.username })
+ .from(Users)
+ .where(like(Users.username, `${username}%`))
+ .execute();
+
+ return users;
+ } catch (error) {
+ console.error("Error searching by username:", error);
+ throw Error("Error occurred while searching for user");
+ }
+}
diff --git a/src/app/admin-only/create-training/page.tsx b/src/app/admin-only/create-training/page.tsx
new file mode 100644
index 00000000..041f337c
--- /dev/null
+++ b/src/app/admin-only/create-training/page.tsx
@@ -0,0 +1,274 @@
+"use client";
+
+import { useState } from "react";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { useForm } from "react-hook-form";
+import { z } from "zod";
+import {
+ Card,
+ CardHeader,
+ CardTitle,
+ CardDescription,
+ CardContent,
+} from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import { Textarea } from "@/components/ui/textarea";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { CheckCircle, XCircle } from "lucide-react";
+import { createTrainingAction } from "./actions";
+import { createTrainingSchema } from "@/lib/validation/training/createTraining";
+
+// Create a client-side version of the schema
+
+export default function CreateTrainingPage() {
+ const [loading, setLoading] = useState(false);
+ const [error, setError] = useState("");
+ const [success, setSuccess] = useState("");
+
+ // Setup form
+ const form = useForm>({
+ resolver: zodResolver(createTrainingSchema),
+ defaultValues: {
+ title: "",
+ description: "",
+ duration: 1,
+ status: "private",
+ },
+ });
+
+ const onSubmit = async (values: z.infer) => {
+ setLoading(true);
+ setError("");
+ setSuccess("");
+
+ try {
+ const result = await createTrainingAction(values);
+
+ if (result.success) {
+ setSuccess("Training created successfully!");
+
+ // Redirect to the training page if we have a training ID
+ } else {
+ setError(result.error || "Failed to create training");
+ }
+ } catch (err) {
+ console.error("Error submitting form:", err);
+ setError("An unexpected error occurred");
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/api/auth/__tests__/auth.rest b/src/app/api/auth/__tests__/auth.rest
deleted file mode 100644
index 1e1383c1..00000000
--- a/src/app/api/auth/__tests__/auth.rest
+++ /dev/null
@@ -1,18 +0,0 @@
-### Signup
-POST http://localhost:3000/api/auth
-Content-Type: application/json
-
-{
- "username": "omar",
- "password": "12345678",
-}
-
-### Login
-POST http://localhost:3000/api/auth
-Content-Type: application/json
-
-{
- "email": "test@example.com",
- "password": "password123",
- "action": "login"
-}
diff --git a/src/app/api/auth/access-control/trainings/route.ts b/src/app/api/auth/access-control/trainings/route.ts
new file mode 100644
index 00000000..95363197
--- /dev/null
+++ b/src/app/api/auth/access-control/trainings/route.ts
@@ -0,0 +1,17 @@
+import { type NextRequest, NextResponse } from "next/server";
+
+import { getUserTrainingPermissions, TrainingPermissions } from "@/lib/permissions/getUserTrainingPermissions";
+
+export async function POST(req: NextRequest): Promise> {
+ try {
+ const { userId, trainingId } = (await req.json()) as {
+ userId: string;
+ trainingId: number;
+ };
+ const res = await getUserTrainingPermissions(userId, trainingId);
+ return NextResponse.json(res, { status: 200 });
+ } catch (error) {
+ console.error(error);
+ }
+ return NextResponse.json({ error: "Internal Server Error" }, { status: 500 });
+}
diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts
index d0911905..db79f26b 100644
--- a/src/app/api/auth/login/route.ts
+++ b/src/app/api/auth/login/route.ts
@@ -3,43 +3,58 @@ import { serialize } from "cookie";
import { db } from "@/lib/db";
import { Users } from "@/lib/db/schema/user/Users";
import { encryptSession } from "@/lib/session";
-import { eq } from "drizzle-orm";
+import { eq, or, and } from "drizzle-orm";
import bcrypt from "bcryptjs";
-import { z } from "zod";
+import { userLoginValid } from "@/lib/validation/userLogin";
+import { passwordMustMatch } from "@/lib/const/error-messages";
+import { type DefaultResponse } from "@/lib/types/DefaultResponse";
-const expectBody = z.object({
- username: z.string(),
- password: z.string(),
-});
-const errorResponse = NextResponse.json(
- { error: "Invalid username or password" },
- { status: 401 },
-);
-export async function POST(request: NextRequest) {
+export async function POST(request: NextRequest) : Promise {
try {
// Extracting credentials from the request body
- const parseResult = expectBody.safeParse(await request.json());
- if (!parseResult.success) return errorResponse;
+ const parseResult = userLoginValid.safeParse(await request.json());
+ if (!parseResult.success) {
+ return NextResponse.json(
+ { err: parseResult.error?.errors.map((e) => e.message)[0] },
+ { status: 400 },
+ );
+ }
- const { username, password } = parseResult.data;
- console.log(`${username} is trying to logging`);
+ const { usernameOrGmail, password } = parseResult.data;
+ console.log(`${usernameOrGmail} is trying to logging`);
// Querying the database for the user
const users = await db
- .select()
+ .select({
+ userId: Users.userId,
+ username: Users.username,
+ role: Users.role,
+ password: Users.password,
+ })
.from(Users)
- .where(eq(Users.username, username))
+ .where(
+ and(
+ or(
+ eq(Users.username, usernameOrGmail),
+ eq(Users.gmail, usernameOrGmail),
+ ),
+ ),
+ )
.execute();
- if (users.length === 0) return errorResponse;
+ if (users.length === 0)
+ return NextResponse.json({ err: "User not found" }, { status: 404 });
const user = users[0];
// Verifying the password
const isPasswordValid = await bcrypt.compare(password, user.password);
- if (!isPasswordValid) return errorResponse;
+ if (!isPasswordValid) return NextResponse.json(
+ { err: passwordMustMatch },
+ { status: 401 },
+ );
// Preparing user data for the session
const userJson = {
@@ -59,7 +74,7 @@ export async function POST(request: NextRequest) {
// Redirecting to the home page
return NextResponse.json(
- { message: "authenticated" },
+ { msg: "authenticated" },
{
status: 307,
headers: {
@@ -69,6 +84,6 @@ export async function POST(request: NextRequest) {
);
} catch (error) {
console.error("Error logging in:", error);
- return NextResponse.json({ message: "Failed to log in" }, { status: 500 });
+ return NextResponse.json({ err: "Failed to log in" }, { status: 500 });
}
}
diff --git a/src/app/api/auth/register/expectedBody.ts b/src/app/api/auth/register/expectedBody.ts
deleted file mode 100644
index 20a5bf48..00000000
--- a/src/app/api/auth/register/expectedBody.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { z } from "zod";
-
-const expectedBody = z.object({
- username: z.string(),
- password: z.string(),
- gmail: z
- .string()
- .email()
- .regex(/@gmail.com$/),
- phoneNumber: z
- .string()
- .min(11)
- .max(11)
- .regex(/^01\d+$/),
- cfHandle: z.string(),
-});
-
-export default expectedBody;
diff --git a/src/app/api/auth/register/route.ts b/src/app/api/auth/register/route.ts
index 050c120e..56579526 100644
--- a/src/app/api/auth/register/route.ts
+++ b/src/app/api/auth/register/route.ts
@@ -3,18 +3,19 @@ import { db } from "@/lib/db";
import { Users } from "@/lib/db/schema/user/Users";
import { eq, or } from "drizzle-orm";
import bcrypt from "bcryptjs";
-import expectedBody from "./expectedBody";
+import { userRegisterValid } from "@/lib/validation/userValidations";
import { EmailAuth } from "@/lib/db/schema/user/EmailAuth";
import sendEmail from "@/lib/email/sendEmail";
import { UsersFullData } from "@/lib/db/schema/user/UsersFullData";
+import { type DefaultResponse } from "@/lib/types/DefaultResponse";
-export async function POST(request: NextRequest) {
+export async function POST(request: NextRequest) : Promise {
try {
- const { success, data: registerData } = expectedBody.safeParse(
+ const { success, data: registerData } = userRegisterValid.safeParse(
await request.json(),
);
if (!success)
- return NextResponse.json({ error: "Invalid input" }, { status: 400 });
+ return NextResponse.json({ err: "Invalid input" }, { status: 400 });
const dbResult = await db
.select()
@@ -24,12 +25,14 @@ export async function POST(request: NextRequest) {
eq(Users.username, registerData.username),
eq(Users.gmail, registerData.gmail),
eq(Users.cfHandle, registerData.cfHandle),
+ eq(Users.vjHandle, registerData.vjHandle ?? ""),
+ eq(Users.phoneNumber, registerData.phoneNumber),
),
)
.execute();
if (dbResult.length > 0)
return NextResponse.json(
- { error: "User already exists" },
+ { err: "User already exists" },
{ status: 400 },
);
@@ -40,14 +43,14 @@ export async function POST(request: NextRequest) {
if (handleRes.status !== 200)
return NextResponse.json(
- { error: "Invalid Codeforces handle or codefoces error" },
+ { err: "Invalid Codeforces handle or codefoces error" },
{ status: 400 },
);
const { result } = await handleRes.json();
if (!result)
return NextResponse.json(
- { error: "Invalid Codeforces handle or codefoces error" },
+ { err: "Invalid Codeforces handle or codefoces error" },
{ status: 400 },
);
@@ -55,7 +58,7 @@ export async function POST(request: NextRequest) {
if (handle.toLowerCase() !== registerData.cfHandle.toLowerCase())
return NextResponse.json(
- { error: "Invalid Codeforces handle or codefoces error" },
+ { err: "Invalid Codeforces handle or codefoces error" },
{ status: 400 },
);
@@ -75,15 +78,13 @@ export async function POST(request: NextRequest) {
.insert(UsersFullData)
.values({
userId: userId,
- cfHandle: registerData.cfHandle,
- username: registerData.username,
- imageURL: titlePhoto,
+ imageUrl: titlePhoto,
})
.execute();
emailActivation(registerData, randomToken);
return NextResponse.json(
- { message: "registered" },
+ { msg: "registered" },
{
status: 200,
},
@@ -91,7 +92,7 @@ export async function POST(request: NextRequest) {
} catch (error) {
console.error("Error registering:", error);
return NextResponse.json(
- { error: "Something went wrong" },
+ { err: "Something went wrong" },
{ status: 500 },
);
}
diff --git a/src/app/api/auth/reset-password/route.ts b/src/app/api/auth/reset-password/route.ts
new file mode 100644
index 00000000..e5cd8286
--- /dev/null
+++ b/src/app/api/auth/reset-password/route.ts
@@ -0,0 +1,83 @@
+import { db } from "@/lib/db";
+import { ResetPassword } from "@/lib/db/schema/user/ResetPassword";
+import { Users } from "@/lib/db/schema/user/Users";
+import send from "@/lib/email/sendEmail";
+import { DefaultResponse } from "@/lib/types/DefaultResponse";
+import { gmail } from "@/lib/validation/util";
+import { eq } from "drizzle-orm";
+import { NextRequest, NextResponse } from "next/server";
+import { z } from "zod";
+
+const validationSchema = z.object({
+ gmail,
+});
+export async function POST(request: NextRequest): Promise {
+ try {
+ const { success, data } = validationSchema.safeParse(await request.json());
+ if (!success) {
+ return NextResponse.json({ msg: "Invalid Input" }, { status: 400 });
+ }
+ const users = await db
+ .select({
+ gmail: Users.gmail,
+ userId: Users.userId,
+ })
+ .from(Users)
+ .where(eq(Users.gmail, data.gmail))
+ .execute();
+
+ if (users.length === 0) {
+ return NextResponse.json({ err: "Invalid Email" }, { status: 404 });
+ }
+ const userId = users[0].userId;
+
+ // generate token
+ const token = Math.random().toString(36).substring(2, 15);
+
+ // delete old token if exists
+ // or stop if the token is recent (5 minutes)
+ const oldTokens = await db
+ .select({ endAt: ResetPassword.endAt })
+ .from(ResetPassword)
+ .where(eq(ResetPassword.userId, userId))
+ .execute();
+
+ if (oldTokens.length > 0) {
+ const endAt = oldTokens[0].endAt ?? new Date();
+ const diff = endAt.getTime(); // Difference in milliseconds
+
+ // Subtract 23 hours and 55 minutes
+ const adjustedDiff = diff - (23 * 60 * 60 * 1000 + 55 * 60 * 1000);
+ if (adjustedDiff > new Date().getTime()) {
+ return NextResponse.json({ err: "Recent Email sent" }, { status: 400 });
+ }
+ await db
+ .delete(ResetPassword)
+ .where(eq(ResetPassword.userId, userId))
+ .execute();
+ }
+
+ // insert the token with the user id
+ await db.insert(ResetPassword).values({
+ userId,
+ token,
+ });
+
+ // send email
+ await send({
+ to: [data.gmail],
+ subject: "Reset Password",
+ html: `
+ Reset Password
+ Click the link below to reset your password
+ Reset Password
+ `,
+ });
+ // send email
+ return NextResponse.json({ msg: "Email sent" }, { status: 200 });
+ } catch (e) {
+ console.error("Error in reset-password/route.ts");
+ console.error(e);
+ return NextResponse.json({ err: "error just happend" }, { status: 500 });
+ }
+}
diff --git a/src/app/api/auth/verify/route.ts b/src/app/api/auth/verify/route.ts
index 9db8c858..7086cf25 100644
--- a/src/app/api/auth/verify/route.ts
+++ b/src/app/api/auth/verify/route.ts
@@ -19,7 +19,5 @@ export async function GET(request: NextRequest) {
.where(eq(Users.userId, user.userId))
.execute()
)[0];
- return redirect(
- `/login?username=${encodeURIComponent(username)}`,
- );
+ return redirect(`/login?username=${encodeURIComponent(username)}`);
}
diff --git a/src/app/api/dev/seed/route.ts b/src/app/api/dev/seed/route.ts
new file mode 100644
index 00000000..4b9c35df
--- /dev/null
+++ b/src/app/api/dev/seed/route.ts
@@ -0,0 +1,16 @@
+import { ensureDefaultUsers } from "@/devtools/seedUsers";
+
+export async function GET() {
+ if (process.env.DEV_TOOLS !== "true") {
+ return new Response(JSON.stringify({ error: "Not allowed" }), {
+ status: 403,
+ headers: { "Content-Type": "application/json" },
+ });
+ }
+
+ const results = await ensureDefaultUsers();
+ return new Response(JSON.stringify({ results }), {
+ status: 200,
+ headers: { "Content-Type": "application/json" },
+ });
+}
\ No newline at end of file
diff --git a/src/app/api/training/__tests__/training.rest b/src/app/api/training/__tests__/training.rest
deleted file mode 100644
index 79c91d8b..00000000
--- a/src/app/api/training/__tests__/training.rest
+++ /dev/null
@@ -1,34 +0,0 @@
-### Variables
-@baseUrl = http://localhost:3000/api
-@contentType = application/json
-
-### Create a new training
-POST {{baseUrl}}/training
-Content-Type: {{contentType}}
-
-{
- "name": "ICPC Training Session 1",
- "description": "Introduction to Competitive Programming",
- "startDate": "2024-01-15",
- "endDate": "2024-01-16"
-}
-
-### Get all trainings
-GET {{baseUrl}}/training
-
-### Get a specific training
-GET {{baseUrl}}/training/1
-
-### Update a training
-PUT {{baseUrl}}/training/1
-Content-Type: {{contentType}}
-
-{
- "name": "Updated Training Session",
- "description": "Updated description",
- "startDate": "2024-01-15",
- "endDate": "2024-01-16"
-}
-
-### Delete a training
-DELETE {{baseUrl}}/training/1
\ No newline at end of file
diff --git a/src/app/applications/actions.ts b/src/app/applications/actions.ts
new file mode 100644
index 00000000..a7b147ab
--- /dev/null
+++ b/src/app/applications/actions.ts
@@ -0,0 +1,52 @@
+"use server";
+import { db } from "@/lib/db";
+import { Applications } from "@/lib/db/schema/training/Applications";
+import { getUserData } from "@/lib/session";
+import { eq, and } from "drizzle-orm";
+import { z } from "zod";
+
+const trainingIdSchema = z.object({ trainingId: z.number().int().positive() });
+
+export async function getUserApplications() {
+ const user = await getUserData();
+ if (!user) throw new Error("Not authenticated");
+ return db.select().from(Applications).where(eq(Applications.userId, user.userId)).execute();
+}
+
+export async function applyToTraining(trainingId: number) {
+ const user = await getUserData();
+ if (!user) throw new Error("Not authenticated");
+ const parse = trainingIdSchema.safeParse({ trainingId });
+ if (!parse.success) throw new Error("Invalid trainingId");
+ return await db.transaction(async (tx) => {
+ const existing = await tx
+ .select()
+ .from(Applications)
+ .where(and(eq(Applications.userId, user.userId), eq(Applications.trainingId, trainingId)))
+ .execute();
+ if (existing.length > 0) throw new Error("Already applied");
+ await tx.insert(Applications).values({
+ userId: user.userId,
+ trainingId,
+ status: "pending",
+ description: "",
+ }).execute();
+ return { success: true };
+ });
+}
+
+export async function withdrawApplication(trainingId: number) {
+ const user = await getUserData();
+ if (!user) throw new Error("Not authenticated");
+ const parse = trainingIdSchema.safeParse({ trainingId });
+ if (!parse.success) throw new Error("Invalid trainingId");
+ return await db.transaction(async (tx) => {
+ const result = await tx
+ .update(Applications)
+ .set({ status: "withdrawn" })
+ .where(and(eq(Applications.userId, user.userId), eq(Applications.trainingId, trainingId)))
+ .execute();
+ if (result.rowCount === 0) throw new Error("Application not found");
+ return { success: true };
+ });
+}
\ No newline at end of file
diff --git a/src/app/applications/page.tsx b/src/app/applications/page.tsx
new file mode 100644
index 00000000..e52a22f2
--- /dev/null
+++ b/src/app/applications/page.tsx
@@ -0,0 +1,84 @@
+"use client";
+import { useEffect, useState } from "react";
+import { Button } from "@/components/ui/button";
+import { getUserApplications, withdrawApplication } from "./actions";
+
+interface Application {
+ applicationId: number;
+ trainingId: number;
+ status: string;
+ appliedAt: string;
+ updatedAt: string;
+}
+
+export default function ApplicationsPage() {
+ const [applications, setApplications] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+ const [withdrawing, setWithdrawing] = useState(null);
+
+ useEffect(() => {
+ getUserApplications()
+ .then((apps) => {
+ setApplications(apps || []);
+ setLoading(false);
+ })
+ .catch(() => {
+ setError("Failed to load applications");
+ setLoading(false);
+ });
+ }, []);
+
+ const handleWithdraw = async (trainingId: number) => {
+ setWithdrawing(trainingId);
+ setError(null);
+ try {
+ await withdrawApplication(trainingId);
+ setApplications((apps) =>
+ apps.map((app) =>
+ app.trainingId === trainingId ? { ...app, status: "withdrawn" } : app
+ )
+ );
+ } catch {
+ setError("Failed to withdraw application");
+ }
+ setWithdrawing(null);
+ };
+
+ return (
+
+
My Applications
+ {loading ? (
+
Loading...
+ ) : error ? (
+
{error}
+ ) : applications.length === 0 ? (
+
No applications found.
+ ) : (
+
+ {applications.map((app) => (
+
+
+
Training ID: {app.trainingId}
+
Status: {app.status}
+
Applied at: {new Date(app.appliedAt).toLocaleString()}
+
+ {app.status === "pending" || app.status === "applied" ? (
+
handleWithdraw(app.trainingId)}
+ >
+ {withdrawing === app.trainingId ? "Withdrawing..." : "Withdraw"}
+
+ ) : null}
+
+ ))}
+
+ )}
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/change-password-reset/_ResetPasswordAction.ts b/src/app/change-password-reset/_ResetPasswordAction.ts
new file mode 100644
index 00000000..0f03a2f8
--- /dev/null
+++ b/src/app/change-password-reset/_ResetPasswordAction.ts
@@ -0,0 +1,41 @@
+"use server";
+import { db } from "@/lib/db";
+import { ResetPassword } from "@/lib/db/schema/user/ResetPassword";
+import { resetPasswordValid } from "@/lib/validation/resetPassword";
+import { eq } from "drizzle-orm";
+import { Users } from "@/lib/db/schema/user/Users";
+import { redirect } from "next/navigation";
+import { z } from "zod";
+import bcrypt from "bcrypt";
+
+export async function resetPasswordAction(
+ submitData: z.infer,
+) {
+ "use server";
+ const { password, confirmPassword, token } = submitData;
+ if (password !== confirmPassword) {
+ console.log("Passwords do not match");
+ return;
+ }
+ console.log("Token:", token);
+ const users = await db
+ .select({ userId: ResetPassword.userId })
+ .from(ResetPassword)
+ .where(eq(ResetPassword.token, token))
+ .execute();
+ if (users.length === 0) {
+ console.log("Invalid token");
+ return;
+ }
+ const userId = users[0].userId;
+ await db
+ .update(Users)
+ .set({ password: await bcrypt.hash(password, 10) })
+ .where(eq(Users.userId, userId))
+ .execute();
+ await db
+ .delete(ResetPassword)
+ .where(eq(ResetPassword.userId, userId))
+ .execute();
+ redirect("/login");
+}
diff --git a/src/app/change-password-reset/_ResetPasswordForm.tsx b/src/app/change-password-reset/_ResetPasswordForm.tsx
new file mode 100644
index 00000000..28fbe1fa
--- /dev/null
+++ b/src/app/change-password-reset/_ResetPasswordForm.tsx
@@ -0,0 +1,123 @@
+"use client";
+import { resetPasswordValid } from "@/lib/validation/resetPassword";
+import { useForm } from "react-hook-form";
+import { z } from "zod";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { Card } from "@/components/ui/card";
+import {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { resetPasswordAction } from "./_ResetPasswordAction";
+import { Input } from "@/components/ui/input";
+import { Button } from "@/components/ui/button";
+
+export function FromReset({ token }: { token: string }) {
+ // note: token is ingected into the server action call
+ const form = useForm>({
+ resolver: zodResolver(resetPasswordValid),
+ defaultValues: {
+ password: "",
+ confirmPassword: "",
+ token,
+ }
+ });
+
+ return (
+
+ );
+}
diff --git a/src/app/change-password-reset/page.tsx b/src/app/change-password-reset/page.tsx
new file mode 100644
index 00000000..dd66d2d9
--- /dev/null
+++ b/src/app/change-password-reset/page.tsx
@@ -0,0 +1,24 @@
+import { db } from "@/lib/db";
+import { eq } from "drizzle-orm";
+import { ResetPassword } from "@/lib/db/schema/user/ResetPassword";
+import { redirect } from "next/navigation";
+import { FromReset } from "./_ResetPasswordForm";
+
+export default async function Page({
+ searchParams,
+}: {
+ searchParams: Promise<{ [key: string]: string | string[] | undefined }>;
+}) {
+ const token = (await searchParams).token as string;
+ const users = await db
+ .select({ userId: ResetPassword.userId })
+ .from(ResetPassword)
+ .where(eq(ResetPassword.token, token))
+ .execute();
+ if (users.length === 0) {
+ redirect("/login");
+ }
+
+ return ;
+}
+
diff --git a/src/app/globals.css b/src/app/globals.css
index e62d974b..3f153bd0 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,3 +1,18 @@
+/* Import base styles */
+@import url('../styles/base/variables.css');
+@import url('../styles/base/base.css');
+
+/* Import shared components */
+@import url('../styles/components/shared/buttons.css');
+
+/* Import auth components */
+/* @import url('../styles/components/auth/auth.css'); */
+
+/* Import profile components */
+/* @import url('../styles/components/profile/profile-view.css'); */
+/* @import url('../styles/components/profile/profile-edit.css'); */
+/* @import url('../styles/components/profile/profile-form.css'); */
+
@tailwind base;
@tailwind components;
@tailwind utilities;
@@ -5,56 +20,65 @@
@layer base {
:root {
--background: 0 0% 100%;
- --foreground: 240 10% 3.9%;
+ --foreground: 222.2 84% 4.9%;
--card: 0 0% 100%;
- --card-foreground: 240 10% 3.9%;
+ --card-foreground: 222.2 84% 4.9%;
--popover: 0 0% 100%;
- --popover-foreground: 240 10% 3.9%;
- --primary: 240 5.9% 10%;
- --primary-foreground: 0 0% 98%;
- --secondary: 240 4.8% 95.9%;
- --secondary-foreground: 240 5.9% 10%;
- --muted: 240 4.8% 95.9%;
- --muted-foreground: 240 3.8% 46.1%;
- --accent: 240 4.8% 95.9%;
- --accent-foreground: 240 5.9% 10%;
+ --popover-foreground: 222.2 84% 4.9%;
+ --primary: 221.2 83.2% 53.3%;
+ --primary-foreground: 210 40% 98%;
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
--destructive: 0 84.2% 60.2%;
- --destructive-foreground: 0 0% 98%;
- --border: 240 5.9% 90%;
- --input: 240 5.9% 90%;
- --ring: 240 5.9% 10%;
+ --destructive-foreground: 210 40% 98%;
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+ --ring: 221.2 83.2% 53.3%;
--radius: 0.5rem;
}
.dark {
- --background: 240 10% 4%;
- --foreground: 0 0% 98%;
- --card: 240 10% 4%;
- --card-foreground: 0 0% 98%;
- --popover: 240 10% 4%;
- --popover-foreground: 0 0% 98%;
- --primary: 0 0% 98%;
- --primary-foreground: 240 5.9% 10%;
- --secondary: 240 4% 8%;
- --secondary-foreground: 0 0% 98%;
- --muted: 240 4% 8%;
- --muted-foreground: 240 5% 65%;
- --accent: 240 4% 8%;
- --accent-foreground: 0 0% 98%;
+ --background: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+ --card: 222.2 84% 4.9%;
+ --card-foreground: 210 40% 98%;
+ --popover: 222.2 84% 4.9%;
+ --popover-foreground: 210 40% 98%;
+ --primary: 217.2 91.2% 59.8%;
+ --primary-foreground: 222.2 47.4% 11.2%;
+ --secondary: 217.2 32.6% 17.5%;
+ --secondary-foreground: 210 40% 98%;
+ --muted: 217.2 32.6% 17.5%;
+ --muted-foreground: 215 20.2% 65.1%;
+ --accent: 217.2 32.6% 17.5%;
+ --accent-foreground: 210 40% 98%;
--destructive: 0 62.8% 30.6%;
- --destructive-foreground: 0 0% 98%;
- --border: 240 4% 16%;
- --input: 240 4% 16%;
- --ring: 240 5% 65%;
+ --destructive-foreground: 210 40% 98%;
+ --border: 217.2 32.6% 17.5%;
+ --input: 217.2 32.6% 17.5%;
+ --ring: 224.3 76.3% 48%;
}
-}
-@layer base {
* {
- @apply border-[hsl(var(--border))];
+ @apply border-border;
}
+
body {
- @apply bg-[hsl(var(--background))] text-[hsl(var(--foreground))];
+ @apply bg-background text-foreground;
+ }
+}
+
+@layer utilities {
+ .truncate {
+ @apply overflow-hidden text-ellipsis whitespace-nowrap;
+ }
+
+ .font-arabic {
+ font-family: "Noto Kufi Arabic", "Noto Sans Arabic", Arial, sans-serif;
}
}
@@ -67,26 +91,6 @@
@apply rounded-lg border bg-[hsl(var(--card))] text-[hsl(var(--card-foreground))] shadow-sm;
}
- .btn {
- @apply inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--ring))] focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none;
- }
-
- .btn-primary {
- @apply bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] hover:bg-[hsl(var(--primary))]/90;
- }
-
- .btn-secondary {
- @apply bg-[hsl(var(--secondary))] text-[hsl(var(--secondary-foreground))] hover:bg-[hsl(var(--secondary))]/80;
- }
-
- .btn-destructive {
- @apply bg-[hsl(var(--destructive))] text-[hsl(var(--destructive-foreground))] hover:bg-[hsl(var(--destructive))]/90;
- }
-
- .btn-outline {
- @apply border border-[hsl(var(--input))] bg-[hsl(var(--background))] hover:bg-[hsl(var(--accent))] hover:text-[hsl(var(--accent-foreground))];
- }
-
.input {
@apply flex h-10 w-full rounded-md border border-[hsl(var(--input))] bg-[hsl(var(--background))] px-3 py-2 text-sm ring-offset-[hsl(var(--background))] file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-[hsl(var(--muted-foreground))] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--ring))] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50;
}
@@ -107,10 +111,6 @@
@apply text-[hsl(var(--foreground))];
}
- .truncate {
- @apply overflow-hidden text-ellipsis whitespace-nowrap;
- }
-
.user-handle {
@apply font-medium truncate;
}
@@ -168,72 +168,6 @@
dark:bg-[hsl(var(--background))]/95 dark:supports-[backdrop-filter]:bg-[hsl(var(--background))]/80;
}
- .profile-container {
- @apply bg-[hsl(var(--background))] p-8 border border-[hsl(var(--border))] rounded-lg shadow-sm;
- }
-
- .user-info {
- @apply grid grid-cols-[1fr,auto] gap-8 mb-8 pb-8 border-b border-[hsl(var(--border))];
- }
-
- .info-section {
- @apply flex flex-col gap-4;
- }
-
- .info-section div {
- @apply text-[0.95rem];
- }
-
- .info-section span {
- @apply text-[hsl(var(--muted-foreground))] mr-2;
- }
-
- .info-section .info-value {
- @apply text-[hsl(var(--foreground))];
- }
-
- .photo-section {
- @apply text-center;
- }
-
- .photo-placeholder {
- @apply w-[140px] h-[140px] bg-[hsl(var(--muted))] rounded-lg mb-4 border border-[hsl(var(--border))]
- overflow-hidden flex items-center justify-center;
- }
-
- .photo-placeholder img {
- @apply w-full h-full object-cover;
- }
-
- .username {
- @apply text-base font-medium text-[hsl(var(--foreground))];
- }
-
- .platform {
- @apply py-3 border-b border-[hsl(var(--border))] flex items-center gap-4 text-sm last:border-b-0 last:pb-0;
- }
-
- .platform-icon {
- @apply text-[hsl(var(--muted-foreground))] w-5 h-5 flex-shrink-0;
- }
-
- .platform-name {
- @apply text-[hsl(var(--muted-foreground))] w-[120px] flex-shrink-0;
- }
-
- .platform-handle {
- @apply font-medium text-[hsl(var(--foreground))] flex-1;
- }
-
- .profile-section {
- @apply bg-[hsl(var(--background))] p-6 border border-[hsl(var(--border))] rounded-lg mb-4;
- }
-
- .chatbot-section {
- @apply bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] p-3 rounded-md text-center
- my-4 text-sm font-medium;
- }
-
/* Friends and Mentors List */
.list-group-item {
@apply flex items-center gap-3 p-3 rounded-md border border-[hsl(var(--border))] mb-2
@@ -269,3 +203,4 @@
@apply bg-[hsl(var(--muted))];
}
}
+
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 6f006af2..12190e78 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -3,8 +3,7 @@ import { Inter } from "next/font/google";
import "./globals.css";
import { Navbar } from "@/components/NavBar";
import { ThemeProvider } from "next-themes";
-import { decryptSession } from "@/lib/session";
-import { cookies } from "next/headers";
+import { getUserData } from "@/lib/session";
import UserProvider from "@/providers/user";
const inter = Inter({ subsets: ["latin"] });
@@ -19,11 +18,9 @@ export default async function RootLayout({
}: {
children: React.ReactNode;
}) {
- const cookieStore = await cookies();
- const session = cookieStore.get("session")?.value;
- const user = await decryptSession(session);
+ const user = await getUserData();
return (
-
+
diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx
index d6db8a83..cae50f1f 100644
--- a/src/app/login/page.tsx
+++ b/src/app/login/page.tsx
@@ -1,85 +1,176 @@
"use client";
-import { useRouter } from "next/navigation";
+import { redirect, useRouter } from "next/navigation";
import Link from "next/link";
import { useSearchParams } from "next/navigation";
-import { Suspense, } from "react";
+import { Suspense, useState } from "react";
import { Card } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
+import { userLoginValid } from "@/lib/validation/userLogin";
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { useForm } from "react-hook-form";
+import { z } from "zod";
+import { CheckCircle, XCircle, Eye, EyeOff } from 'lucide-react';
+import { useUserContext } from "@/providers/user";
+import "@/styles/components/auth/auth.css";
+import { DevToolsSidebar, DevToolsSidebarToggle } from '@/components/devtools/DevToolsSidebar';
-export default function LoginPage() {
- return
-
+export default function Page() {
+ const user = useUserContext();
+ if (user) return redirect("/protected/profile");
+ return (
+
+
-
-
+ );
}
function Login() {
- const router = useRouter();
- const searchParams = useSearchParams();
- const username = searchParams.get("username") ?? "";
+ const router = useRouter();
+ const searchParams = useSearchParams();
+ const [error, setError] = useState("");
+ const [success, setSuccess] = useState("");
+ const username = searchParams.get("username") ?? "";
+ const [loading, setLoading] = useState(false);
+ const [isPasswordVisible, setIsPasswordVisible] = useState(false);
+ const [showDevSidebar, setShowDevSidebar] = useState(false);
+ const form = useForm>({
+ resolver: zodResolver(userLoginValid),
+ defaultValues: {
+ usernameOrGmail: username ?? "",
+ password: ""
+ },
+ });
- return (
-
-
- Welcome Back
-
- Please enter your credentials to continue
-
-
-
-
Username
-
+ return (
+
- )
-
- function onSubmit(event: React.FormEvent
) {
- event.preventDefault();
- const form = event.currentTarget;
- const formData = new FormData(form);
- const data = Object.fromEntries(formData.entries());
+
+
+
+ )}
+ />
+
+ {loading ? "Loading..." : "Sign In"}
+
+ {error && (
+
+
+ {error}
+
+ )}
+ {success && (
+
+
+ {success}
+
+ )}
+
+
+
+ Don't have an account?{" "}
+
+ Sign up
+
+
+
+ Forgot your password?{" "}
+
+ Reset it here
+
+
+
+
+ );
- fetch("/api/auth/login", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- redirect: "follow",
- credentials: "include",
- body: JSON.stringify(data),
- }).then((response) => {
- if (response.status === 200 || response.status === 307) {
- router.push("/profile");
- }
- });
- }
+ async function onSubmit(data: z.infer) {
+ setLoading(true);
+ fetch("/api/auth/login", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ redirect: "follow",
+ credentials: "include",
+ body: JSON.stringify(data),
+ })
+ .then(async (response) => {
+ const res = await response.json();
+ console.log(res);
+ setLoading(false);
+ if ("err" in res) return setError(res.err);
+ else if ("msg" in res) {
+ router.push("/protected/profile");
+ }
+ })
+ .catch(async (err) => {
+ const res = await err.json();
+ console.log(res);
+ setLoading(false);
+ if ("err" in res) return setError(res.err);
+ else if ("msg" in res) return setSuccess(res.msg);
+ });
+ }
}
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
index c13d64d0..2a0bc54b 100644
--- a/src/app/not-found.tsx
+++ b/src/app/not-found.tsx
@@ -22,8 +22,9 @@ export default function NotFound() {
- While our code monkeys are busy debugging, why not head back to safety?
- They've had too much coffee and might have misplaced this page.
+ While our code monkeys are busy debugging, why not head back to
+ safety? They've had too much coffee and might have misplaced this
+ page.
@@ -34,9 +35,10 @@ export default function NotFound() {
- P.S. If you were looking for a 404 page, congratulations! You found it! 🎉
+ P.S. If you were looking for a 404 page, congratulations! You found
+ it! 🎉
- )
-}
\ No newline at end of file
+ );
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 89120916..2b7c02e7 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -3,7 +3,7 @@ import { cookies } from "next/headers";
import { redirect } from "next/navigation";
import { Button } from "@/components/ui/button";
import { TypographyH1, TypographyH2 } from "@/components/ui/typography";
-import { FaUserPlus, FaSignInAlt, FaSignOutAlt } from 'react-icons/fa';
+import { FaUserPlus, FaSignInAlt, FaSignOutAlt } from "react-icons/fa";
const iconSize = "text-xl";
@@ -12,12 +12,12 @@ export default async function Home() {
const isLoggedIn = !!cookie.get("session");
return (
-
Welcome
- Elevate your skills with our structured training and community support.
+ Elevate your skills with our structured training and community
+ support.
@@ -27,18 +27,25 @@ export default async function Home() {
{isLoggedIn ? (
-
{
- "use server";
- const cookie = await cookies();
- cookie.delete("session");
- redirect("/");
- }}>
+ {
+ "use server";
+ const cookie = await cookies();
+ cookie.delete("session");
+ redirect("/");
+ }}
+ >
Sign Out
) : (
-
+
Sign In
@@ -56,7 +63,10 @@ export default async function Home() {
- © {new Date().getFullYear()} ICPC Training Platform. All rights reserved.
+
+ © {new Date().getFullYear()} ICPC Training Platform. All rights
+ reserved.
+
);
diff --git a/src/app/privacy-policy/page.tsx b/src/app/privacy-policy/page.tsx
new file mode 100644
index 00000000..0f3e5ec6
--- /dev/null
+++ b/src/app/privacy-policy/page.tsx
@@ -0,0 +1,56 @@
+import { Card } from "@/components/ui/card";
+
+export default function Page() {
+ return (
+
+
+ Privacy Policy
+
+ Welcome to the Privacy Policy of our website. This document outlines how we collect, use, and protect your personal information when you visit our site.
+
+ Information We Collect
+
+ We may collect the following types of information:
+
+
+
+ Personal Information: This includes your name, email address, and any other information you provide when you register or use our services.
+
+
+ Usage Information: This includes your IP address, browser type, operating system, and the pages you view on our site.
+
+
+ How We Use Your Information
+
+ The information we collect is used to:
+
+
+ Provide and maintain our services.
+ Improve, personalize, and expand our services.
+ Communicate with you, either directly or through one of our partners, including for customer service, to provide you with updates and other information relating to the website.
+ Process your transactions and send you transaction-related notifications.
+
+ Data Protection
+
+ We take the security of your personal information seriously and implement various measures to protect it. However, please remember that no method of transmission over the internet or method of electronic storage is 100% secure.
+
+ Your Rights
+
+ You have the right to:
+
+
+ Access the personal information we hold about you.
+ Request correction of any inaccurate information.
+ Request deletion of your personal information.
+
+ Changes to This Policy
+
+ We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page.
+
+
+ Please review this policy periodically for any changes. Your continued use of the site after any modifications to the Privacy Policy will constitute your acknowledgment of the modifications and your consent to abide by and be bound by the modified policy.
+
+
+
+ );
+}
diff --git a/src/app/profile/[username]/page.tsx b/src/app/profile/[username]/page.tsx
index 4c846780..9cbdbf19 100644
--- a/src/app/profile/[username]/page.tsx
+++ b/src/app/profile/[username]/page.tsx
@@ -1,10 +1,7 @@
-import Profile from "@/app/(authorized-only)/profile/_Profile";
-import Sidebar from "@/app/(authorized-only)/profile/_Sidebar";
-import { type User } from "@/app/(authorized-only)/profile/page";
-import { db } from "@/lib/db";
-import { UsersFullData } from "@/lib/db/schema/user/UsersFullData";
-import { eq } from "drizzle-orm";
+import Profile from "@/components/profile/_Profile";
+import Sidebar from "@/components/profile/_Sidebar";
import { redirect } from "next/navigation";
+import { getUserFullData } from "@/dao/getUserFullData";
export default async function Page({
params,
@@ -12,19 +9,14 @@ export default async function Page({
params: Promise<{ username: string }>;
}) {
const username = decodeURIComponent((await params).username);
- const user: User = (
- await db
- .select()
- .from(UsersFullData)
- .where(eq(UsersFullData.username, username))
- .execute()
- )[0] ;
- if (!user) return redirect("/404");
+ const userData = await getUserFullData({ username });
+
+ if (!userData) return redirect("/404");
return (
diff --git a/src/app/protected/api/edit-profile/route.ts b/src/app/protected/api/edit-profile/route.ts
new file mode 100644
index 00000000..0ef3dab4
--- /dev/null
+++ b/src/app/protected/api/edit-profile/route.ts
@@ -0,0 +1,103 @@
+import { db } from "@/lib/db";
+import { UsersFullData } from "@/lib/db/schema/user/UsersFullData";
+import { type UserDataJWT } from "@/lib/session";
+import { eq } from "drizzle-orm";
+import { NextResponse, type NextRequest } from "next/server";
+import { userFullDataValid as userFulldataValidations } from "@/lib/validation/userFulldataValidations";
+import { AnyPgTable } from "drizzle-orm/pg-core";
+import { Departments } from "@/lib/db/schema/user/Departments";
+import { Cities } from "@/lib/db/schema/user/Cities";
+import { Countries } from "@/lib/db/schema/user/Countries";
+import { Institutes } from "@/lib/db/schema/user/Institutes";
+import { Faculties } from "@/lib/db/schema/user/Faculties";
+import { Communities } from "@/lib/db/schema/user/Communities";
+
+export async function POST(request: NextRequest) {
+ try {
+ if (request.headers.get("x-user") === null) {
+ return new NextResponse(null, { status: 401 });
+ }
+ const user = JSON.parse(request.headers.get("x-user") ?? "") as UserDataJWT;
+ const { success, data } = userFulldataValidations.safeParse(
+ await request.json(),
+ );
+ if (!success) {
+ return new NextResponse(null, { status: 400 });
+ }
+ const userFullData = await db
+ .select()
+ .from(UsersFullData)
+ .where(eq(UsersFullData.userId, user.userId))
+ .execute();
+ if (userFullData.length === 0) {
+ await db
+ .insert(UsersFullData)
+ .values({
+ userId: user.userId,
+ })
+ .execute();
+ }
+ const cityId = await insertOrGetLookupTable(data.city, Cities);
+ const countryId = await insertOrGetLookupTable(data.country, Countries);
+ const instituteId = await insertOrGetLookupTable(
+ data.institute,
+ Institutes,
+ );
+ const facultyId = await insertOrGetLookupTable(data.faculty, Faculties);
+ const departmentId = await insertOrGetLookupTable(
+ data.department,
+ Departments,
+ );
+
+ const communityId = await insertOrGetLookupTable(
+ data.community,
+ Communities,
+ );
+ const updateData = {
+ ...data,
+ cityId,
+ countryId,
+ instituteId,
+ facultyId,
+ departmentId,
+ communityId,
+ };
+ await db
+ .update(UsersFullData)
+ .set(updateData)
+ .where(eq(UsersFullData.userId, user.userId))
+ .execute();
+ return new NextResponse(null, { status: 201 });
+ } catch (e) {
+ console.error(e);
+ return new NextResponse(null, { status: 500 });
+ }
+}
+
+async function insertOrGetLookupTable(
+ name: string | undefined,
+ table: T,
+): Promise {
+ if (name === undefined) return null;
+ const res = await db
+ .select()
+ // @ts-expect-error - unknown key
+ .from(table)
+ // @ts-expect-error - unknown key
+ .where(eq(table.name, name))
+ .execute();
+
+ if (res.length === 0) {
+ const inserted = await db
+ .insert(table)
+ // @ts-expect-error - unknown key
+ .values({ name: name })
+ // @ts-expect-error - unknown key
+ .returning({ id: table.id }) // Ensure ID column is returned properly
+ .execute();
+
+ return inserted[0].id;
+ }
+
+ return res[0].id as number;
+}
diff --git a/src/app/protected/api/logout/route.ts b/src/app/protected/api/logout/route.ts
new file mode 100644
index 00000000..a394a9f1
--- /dev/null
+++ b/src/app/protected/api/logout/route.ts
@@ -0,0 +1 @@
+export function GET() {}
diff --git a/src/app/protected/edit-profile/_academicForm.tsx b/src/app/protected/edit-profile/_academicForm.tsx
new file mode 100644
index 00000000..bf3ba9a3
--- /dev/null
+++ b/src/app/protected/edit-profile/_academicForm.tsx
@@ -0,0 +1,270 @@
+"use client";
+
+import {
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import { useFormContext } from "react-hook-form";
+import { userFullDataValid } from "@/lib/validation/userFulldataValidations";
+import { z } from "zod";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { Eye, EyeOff, GraduationCap, Building, Calendar, Layers, Users } from "lucide-react";
+import { useState } from "react";
+import "@/styles/components/profile/profile-form.css";
+
+export default function AcademicForm() {
+ const form = useFormContext>();
+ const universityOptions =
+ userFullDataValid.shape.institute._def.innerType.options;
+ const facultyOptions = userFullDataValid.shape.faculty._def.innerType.options;
+ const communitiesOptions = userFullDataValid.shape.community._def.innerType.options;
+ const departmentOptions =
+ userFullDataValid.shape.department._def.innerType.options;
+
+ const [isInstitutePublic, setIsInstitutePublic] = useState(false);
+ const [isFacultyPublic, setIsFacultyPublic] = useState(false);
+ const [isCommunityPublic, setIsCommunityPublic] = useState(false);
+ const [isDepartmentPublic, setIsDepartmentPublic] = useState(false);
+ const [isGraduationDatePublic, setIsGraduationDatePublic] = useState(false);
+ const [isAcademicYearPublic, setIsAcademicYearPublic] = useState(false);
+
+ return (
+
+
(
+
+
+
+ University
+
+
+
+
+
+
+
+
+
+ {universityOptions.map((option) => (
+
+ {option}
+
+ ))}
+
+
+ setIsInstitutePublic(!isInstitutePublic)}
+ className="profile-form-visibility-btn"
+ >
+ {isInstitutePublic ? : }
+
+
+
+ Select the university you are currently enrolled in or graduated
+ from.
+
+
+
+ )}
+ />
+ (
+
+
+
+ Faculty
+
+
+
+
+
+
+
+
+
+ {facultyOptions.map((option) => (
+
+ {option}
+
+ ))}
+
+
+ setIsFacultyPublic(!isFacultyPublic)}
+ className="profile-form-visibility-btn"
+ >
+ {isFacultyPublic ? : }
+
+
+
+ Choose your faculty or college within the university.
+
+
+
+ )}
+ />
+ (
+
+
+
+ Department
+
+
+
+
+
+
+
+
+
+ {departmentOptions.map((option) => (
+
+ {option}
+
+ ))}
+
+
+ setIsDepartmentPublic(!isDepartmentPublic)}
+ className="profile-form-visibility-btn"
+ >
+ {isDepartmentPublic ? : }
+
+
+
+ Select your specific department or major.
+
+
+
+ )}
+ />
+ (
+
+
+
+ Expected Graduation Date
+
+
+
+
+
+ setIsGraduationDatePublic(!isGraduationDatePublic)}
+ className="profile-form-visibility-btn"
+ >
+ {isGraduationDatePublic ? : }
+
+
+
+ Your expected or actual graduation date.
+
+
+
+ )}
+ />
+ (
+
+
+
+ Current Academic Year
+
+
+
+
+
+ setIsAcademicYearPublic(!isAcademicYearPublic)}
+ className="profile-form-visibility-btn"
+ >
+ {isAcademicYearPublic ? : }
+
+
+
+ Your current year of study (1st year, 2nd year, etc.).
+
+
+
+ )}
+ />
+ (
+
+
+
+ Community
+
+
+
+
+
+
+
+
+
+ {communitiesOptions.map((option) => (
+
+ {option}
+
+ ))}
+
+
+ setIsCommunityPublic(!isCommunityPublic)}
+ className="profile-form-visibility-btn"
+ >
+ {isCommunityPublic ? : }
+
+
+
+ Select your specific community or group.
+
+
+
+ )}
+ />
+
+ );
+}
diff --git a/src/app/protected/edit-profile/_handlesForm.tsx b/src/app/protected/edit-profile/_handlesForm.tsx
new file mode 100644
index 00000000..3988a069
--- /dev/null
+++ b/src/app/protected/edit-profile/_handlesForm.tsx
@@ -0,0 +1,104 @@
+"use client";
+import {
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import { userFullDataValid } from "@/lib/validation/userFulldataValidations";
+import { useFormContext } from "react-hook-form";
+import { z } from "zod";
+import { Eye, EyeOff, Terminal, Code } from "lucide-react";
+import { useState } from "react";
+import "@/styles/components/profile/profile-form.css";
+
+export default function HandlesForm() {
+ const form = useFormContext>();
+ const handles = [
+ {
+ id: "atcoder",
+ label: "AtCoder Handle",
+ placeholder: "Enter your AtCoder username",
+ },
+ {
+ id: "codechef",
+ label: "CodeChef Handle",
+ placeholder: "Enter your CodeChef username",
+ },
+ {
+ id: "leetcode",
+ label: "LeetCode Handle",
+ placeholder: "Enter your LeetCode username",
+ },
+ {
+ id: "cses",
+ label: "CSES Handle",
+ placeholder: "Enter your CSES username",
+ },
+ ] as const;
+
+ const [isAtcoderPublic, setIsAtcoderPublic] = useState(false);
+ const [isCodechefPublic, setIsCodechefPublic] = useState(false);
+ const [isLeetcodePublic, setIsLeetcodePublic] = useState(false);
+ const [isCsesPublic, setIsCsesPublic] = useState(false);
+
+ const handleIcons = {
+ atcoder: ,
+ codechef: ,
+ leetcode: ,
+ cses: ,
+ };
+
+ return (
+
+ );
+}
diff --git a/src/app/(authorized-only)/edit-profile/_page.tsx b/src/app/protected/edit-profile/_page.tsx
similarity index 52%
rename from src/app/(authorized-only)/edit-profile/_page.tsx
rename to src/app/protected/edit-profile/_page.tsx
index f09338fa..2829e7e2 100644
--- a/src/app/(authorized-only)/edit-profile/_page.tsx
+++ b/src/app/protected/edit-profile/_page.tsx
@@ -1,5 +1,5 @@
"use client";
-import { userFullData } from "@/lib/validation/userFulldataValidations";
+import { userFullDataValid } from "@/lib/validation/userFulldataValidations";
import { useState } from "react";
import { useForm, FormProvider } from "react-hook-form";
import HandlesForm from "./_handlesForm";
@@ -14,6 +14,7 @@ import {
FaLink,
FaSave,
} from "react-icons/fa";
+import { toast } from "react-toastify";
type PageType = "personal" | "academic" | "competitive" | "social";
@@ -27,19 +28,23 @@ const sections: NavSection[] = [
{
id: "personal",
label: "Personal Info",
- icon: ,
+ icon: ,
},
{
id: "academic",
label: "Academic Info",
- icon: ,
+ icon: ,
},
{
id: "competitive",
label: "CP Handles",
- icon: ,
+ icon: ,
+ },
+ {
+ id: "social",
+ label: "Social Links",
+ icon:
},
- { id: "social", label: "Social Links", icon: },
];
const components: Record = {
@@ -52,28 +57,28 @@ const components: Record = {
export default function Profile({
userData,
}: {
- userData: z.infer;
+ userData: z.infer;
}) {
const [currentPage, setCurrentPage] = useState("personal");
- const form = useForm>({
+ const form = useForm>({
defaultValues: userData,
});
+ const [isSubmitting, setIsSubmitting] = useState(false);
return (
-
-
+
+
-
+
{sections.map((section) => (
setCurrentPage(section.id)}
- className={`w-full flex items-center gap-3 px-4 py-2 text-sm font-medium rounded-md transition-colors whitespace-nowrap
- ${
+ className={`profile-edit-nav-button ${
currentPage === section.id
- ? "bg-primary text-primary-foreground"
- : "hover:bg-accent hover:text-accent-foreground"
+ ? "profile-edit-nav-button-active"
+ : "profile-edit-nav-button-inactive"
}`}
>
{section.icon}
@@ -83,21 +88,22 @@ export default function Profile({
-
- Save Changes
+
+ {isSubmitting ? "Saving..." : "Save Changes"}
-
+
{components[currentPage]}
@@ -107,15 +113,27 @@ export default function Profile({
);
- function onSubmit(data: z.infer) {
- console.log(data);
- fetch("/api/edit-profile", {
- headers: {
- "Content-Type": "application/json",
- },
- method: "POST",
- credentials: "include",
- body: JSON.stringify(data),
- });
+ async function onSubmit(data: z.infer) {
+ setIsSubmitting(true);
+ try {
+ const response = await fetch("/protected/api/edit-profile", {
+ headers: {
+ "Content-Type": "application/json",
+ },
+ method: "POST",
+ credentials: "include",
+ body: JSON.stringify(data),
+ });
+
+ if (response.ok) {
+ toast.success("Changes saved successfully!");
+ } else {
+ toast.error("Failed to save changes. Please try again.");
+ }
+ } catch {
+ toast.error("An error occurred. Please try again later.");
+ } finally {
+ setIsSubmitting(false);
+ }
}
}
diff --git a/src/app/protected/edit-profile/_personalForm.tsx b/src/app/protected/edit-profile/_personalForm.tsx
new file mode 100644
index 00000000..a1ec75fd
--- /dev/null
+++ b/src/app/protected/edit-profile/_personalForm.tsx
@@ -0,0 +1,230 @@
+"use client";
+import {
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import { userFullDataValid } from "@/lib/validation/userFulldataValidations";
+import { useFormContext } from "react-hook-form";
+import { z } from "zod";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { Eye, EyeOff, User, IdCard, Globe, MapPin } from "lucide-react";
+import { useState } from "react";
+import { toast } from "react-toastify";
+import React from "react";
+import "@/styles/components/profile/profile-form.css";
+
+export default function PersonList() {
+ const form = useFormContext>();
+
+ const personalFields = [
+ { name: "firstNameEn", label: "First Name (English)" },
+ { name: "lastNameEn", label: "Last Name (English)" },
+ { name: "nameAR1", label: "First Name (Arabic)" },
+ { name: "nameAR2", label: "Second Name (Arabic)" },
+ { name: "nameAR3", label: "Third Name (Arabic)" },
+ { name: "nameAR4", label: "Last Name (Arabic)" },
+ ] as const;
+
+ const countryOptions = userFullDataValid.shape.country._def.innerType.options;
+
+ const [isEnglishNamePublic, setIsEnglishNamePublic] = useState(false);
+ const [isArabicNamePublic, setIsArabicNamePublic] = useState(false);
+ const [isNationalIdPublic, setIsNationalIdPublic] = useState(false);
+ const [isCountryPublic, setIsCountryPublic] = useState(false);
+ const [isCityPublic, setIsCityPublic] = useState(false);
+
+ const handleSubmit = (event: React.FormEvent) => {
+ event.preventDefault();
+ form.handleSubmit(
+ () => {
+ toast.success("Changes saved successfully!");
+ },
+ () => {
+ toast.error("Please fix the errors before saving.");
+ }
+ )();
+ };
+
+ return (
+
+
+
+ );
+}
diff --git a/src/app/protected/edit-profile/_socialForm.tsx b/src/app/protected/edit-profile/_socialForm.tsx
new file mode 100644
index 00000000..e277ca59
--- /dev/null
+++ b/src/app/protected/edit-profile/_socialForm.tsx
@@ -0,0 +1,105 @@
+"use client";
+import {
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import { userFullDataValid } from "@/lib/validation/userFulldataValidations";
+import { useFormContext } from "react-hook-form";
+import { z } from "zod";
+import { Eye, EyeOff, Facebook, Linkedin, Twitter, Github } from "lucide-react";
+import { useState } from "react";
+import "@/styles/components/profile/profile-form.css";
+
+const socialIcons = {
+ facebook: ,
+ linkedIn: ,
+ twitter: ,
+ github: ,
+};
+
+export default function SocialForm() {
+ const form = useFormContext>();
+ const socialProfiles = [
+ {
+ id: "facebook",
+ label: "Facebook Profile",
+ placeholder: "Enter your Facebook profile URL",
+ },
+ {
+ id: "linkedIn",
+ label: "LinkedIn Profile",
+ placeholder: "Enter your LinkedIn profile URL",
+ },
+ {
+ id: "twitter",
+ label: "Twitter/X Profile",
+ placeholder: "Enter your Twitter/X profile URL",
+ },
+ {
+ id: "github",
+ label: "GitHub Profile",
+ placeholder: "Enter your GitHub profile URL",
+ },
+ ] as const;
+
+ const [isFacebookPublic, setIsFacebookPublic] = useState(false);
+ const [isLinkedInPublic, setIsLinkedInPublic] = useState(false);
+ const [isTwitterPublic, setIsTwitterPublic] = useState(false);
+ const [isGithubPublic, setIsGithubPublic] = useState(false);
+
+ return (
+
+ );
+}
diff --git a/src/app/(authorized-only)/edit-profile/page.module.css b/src/app/protected/edit-profile/page.module.css
similarity index 100%
rename from src/app/(authorized-only)/edit-profile/page.module.css
rename to src/app/protected/edit-profile/page.module.css
diff --git a/src/app/(authorized-only)/edit-profile/page.tsx b/src/app/protected/edit-profile/page.tsx
similarity index 67%
rename from src/app/(authorized-only)/edit-profile/page.tsx
rename to src/app/protected/edit-profile/page.tsx
index 96cdfef0..7f5185eb 100644
--- a/src/app/(authorized-only)/edit-profile/page.tsx
+++ b/src/app/protected/edit-profile/page.tsx
@@ -1,20 +1,20 @@
import { db } from "@/lib/db";
import { UsersFullData } from "@/lib/db/schema/user/UsersFullData";
-import { decryptSession } from "@/lib/session";
-import { userFullData } from "@/lib/validation/userFulldataValidations";
+import { getUserData } from "@/lib/session";
+import { userFullDataValid } from "@/lib/validation/userFulldataValidations";
import { eq } from "drizzle-orm";
-import { cookies } from "next/headers";
import { redirect } from "next/navigation";
import Profile from "./_page";
import { z } from "zod";
+import "@/styles/components/profile/profile-edit.css";
export default async function Page() {
- const cookieStore = await cookies();
- const session = cookieStore.get("session")?.value;
- const user = await decryptSession(session);
+ const user = await getUserData();
if (!user) {
redirect("/login");
}
+
+ // TODO make type safe (replace nulls with undefined)
const userData = Object.fromEntries(
Object.entries(
(
@@ -25,7 +25,7 @@ export default async function Page() {
.execute()
)[0] ?? { userId: user.userId },
).map(([key, value]) => [key, value ?? undefined]),
- ) as z.infer;
+ ) as z.infer;
return (
<>
diff --git a/src/app/protected/layout.tsx b/src/app/protected/layout.tsx
new file mode 100644
index 00000000..a0ed959a
--- /dev/null
+++ b/src/app/protected/layout.tsx
@@ -0,0 +1,33 @@
+import type { Metadata } from "next";
+import "@/app/globals.css";
+import "@/app/page.module.css";
+import { ToastContainer } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+
+export const metadata: Metadata = {
+ title: "ICPC Platform",
+ description: "A platform for managing ICPC-style programming competitions",
+};
+
+export default async function RootLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+ <>
+ {children}
+
+ >
+ );
+}
diff --git a/src/app/protected/profile/page.tsx b/src/app/protected/profile/page.tsx
new file mode 100644
index 00000000..6db465ff
--- /dev/null
+++ b/src/app/protected/profile/page.tsx
@@ -0,0 +1,27 @@
+import "@/app/globals.css";
+
+import Sidebar from "@/components/profile/_Sidebar";
+import Profile from "@/components/profile/_Profile";
+
+import { getUserData } from "@/lib/session";
+import { redirect } from "next/navigation";
+import { getUserFullData } from "@/dao/getUserFullData";
+import { UserProfile } from "@/lib/types/userProfileType";
+
+export default async function Page() {
+ const validation = await getUserData();
+ if (!validation) return null;
+ const { userId } = validation;
+ const user: UserProfile | null = await getUserFullData({ userId });
+
+ if (!user) redirect("/404");
+
+ return (
+
+ );
+}
diff --git a/src/app/protected/trainings/TrainingsTabs.tsx b/src/app/protected/trainings/TrainingsTabs.tsx
new file mode 100644
index 00000000..263e997b
--- /dev/null
+++ b/src/app/protected/trainings/TrainingsTabs.tsx
@@ -0,0 +1,329 @@
+"use client";
+import { useState, useEffect } from "react";
+import Link from "next/link";
+import { Button } from "@/components/ui/button";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+import { Badge } from "@/components/ui/badge";
+import { getUserApplications, applyToTraining } from "@/app/applications/actions";
+
+function formatDate(date: Date | string) {
+ return new Date(date).toLocaleDateString("en-US", {
+ year: "numeric",
+ month: "long",
+ day: "numeric",
+ });
+}
+function getStatusColor(status: string) {
+ switch (status) {
+ case "active":
+ return "bg-green-500 hover:bg-green-600";
+ case "roadmap":
+ return "bg-blue-500 hover:bg-blue-600";
+ case "private":
+ return "bg-purple-500 hover:bg-purple-600";
+ case "over":
+ return "bg-gray-500 hover:bg-gray-600";
+ default:
+ return "bg-gray-500 hover:bg-gray-600";
+ }
+}
+
+interface Training {
+ id?: number;
+ trainingId?: number;
+ title: string;
+ description: string;
+ startDate: string;
+ duration: number | null;
+ status?: string;
+ headId?: number;
+ chiefJudge?: number;
+ standingView?: string[];
+}
+
+interface Application {
+ applicationId: number;
+ trainingId: number;
+ status: string;
+}
+
+interface TrainingsTabsProps {
+ myTrainings: Training[];
+ allTrainings: Training[];
+ isAdminOrStaff: boolean;
+ enrolledIds: number[];
+}
+
+export default function TrainingsTabs({ myTrainings, allTrainings, isAdminOrStaff, enrolledIds }: TrainingsTabsProps) {
+ const [tab, setTab] = useState<'all' | 'my'>('all');
+ const [modalTraining, setModalTraining] = useState(null);
+ const [applications, setApplications] = useState([]);
+ const [applying, setApplying] = useState(null);
+
+ useEffect(() => {
+ getUserApplications().then((apps) => setApplications((apps || []).map(app => ({
+ ...app,
+ status: app.status || ""
+ }))));
+ }, []);
+
+ const getAppStatus = (trainingId: number) => {
+ const app = applications.find((a) => a.trainingId === trainingId);
+ return app ? app.status : null;
+ };
+
+ const handleApply = async (trainingId: number) => {
+ setApplying(trainingId);
+ try {
+ await applyToTraining(trainingId);
+ setApplications((apps) => [
+ ...apps,
+ { applicationId: Date.now(), trainingId, status: "pending" },
+ ]);
+ } catch {}
+ setApplying(null);
+ };
+
+ const renderDetailsModal = () => {
+ if (!modalTraining) return null;
+ const statusText = modalTraining.status ? modalTraining.status.charAt(0).toUpperCase() + modalTraining.status.slice(1) : 'Unknown';
+ // For now, show headId and chiefJudge as IDs (username fetch can be added later)
+ return (
+
+
+
setModalTraining(null)}
+ aria-label="Close"
+ >
+ ×
+
+
{modalTraining.title}
+
+ {statusText}
+
+
+ Start: {formatDate(modalTraining.startDate)}
+ {modalTraining.duration && • Duration: {modalTraining.duration} days }
+
+
+
{modalTraining.description}
+
+ {modalTraining.headId && (
+
+ Head: {modalTraining.headId}
+
+ )}
+ {modalTraining.chiefJudge && (
+
+ Chief Judge: {modalTraining.chiefJudge}
+
+ )}
+ {modalTraining.standingView && Array.isArray(modalTraining.standingView) && (
+
+ Standing View: {modalTraining.standingView.join(", ")}
+
+ )}
+
+
+ );
+ };
+
+ return (
+
+ {renderDetailsModal()}
+
+
+
Trainings
+
+ Manage and join ICPC programming training sessions
+
+
+
+ {isAdminOrStaff && (
+
+ Create Training
+
+ )}
+
+
+ {/* Tabs */}
+
+ setTab('all')}
+ >
+ All Trainings
+
+ setTab('my')}
+ >
+ My Trainings
+
+
+ {/* Tab Content */}
+ {tab === 'all' && (
+
+ {allTrainings.length === 0 ? (
+
+
No Trainings Available
+
+ There are no training sessions available at the moment. Please check back later.
+
+
+ ) : (
+
+ {allTrainings.map((training) => {
+ const statusText = training.status ? training.status.charAt(0).toUpperCase() + training.status.slice(1) : 'Unknown';
+ const id = training.id ?? training.trainingId;
+ const isEnrolled = enrolledIds.includes(id!);
+ if (typeof id !== "number") return null;
+ return (
+
+
+
+ {training.title}
+
+ {statusText}
+
+
+
+ {formatDate(training.startDate)}
+ {training.duration && ` • ${training.duration} days`}
+
+
+
+ {training.description}
+
+
+ setModalTraining(training)}
+ className="min-w-[90px]"
+ >
+ Details
+
+ {isEnrolled ? (
+
+
+ Go to Dashboard
+
+
+ ) : (() => {
+ const status = getAppStatus(id) || "";
+ switch (status) {
+ case "pending":
+ case "applied":
+ return (
+
+ Pending
+
+ );
+ case "withdrawn":
+ return (
+
+ Withdrawn
+
+ );
+ case "accepted":
+ return (
+
+ Accepted
+
+ );
+ case "rejected":
+ return (
+
+ Rejected
+
+ );
+ default:
+ return (
+ handleApply(id)}
+ className="min-w-[90px] font-semibold"
+ disabled={applying === id}
+ >
+ {applying === id ? "Applying..." : "Apply"}
+
+ );
+ }
+ })()}
+
+
+ );
+ })}
+
+ )}
+
+ )}
+ {tab === 'my' && (
+
+ {myTrainings.length === 0 ? (
+
+
No Enrolled Trainings
+
+ You haven't joined any training sessions yet.
+
+
+ ) : (
+
+ {myTrainings.map((training) => {
+ const statusText = training.status ? training.status.charAt(0).toUpperCase() + training.status.slice(1) : 'Unknown';
+ const id = training.id ?? training.trainingId;
+ if (typeof id !== "number") return null;
+ return (
+
+
+
+ {training.title}
+
+ {statusText}
+
+
+
+ {formatDate(training.startDate)}
+ {training.duration && ` • ${training.duration} days`}
+
+
+
+ {training.description}
+
+
+ setModalTraining(training)}
+ className="min-w-[90px]"
+ >
+ Details
+
+
+
+ Go to Dashboard
+
+
+
+
+ );
+ })}
+
+ )}
+
+ )}
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/(trainee)/__trainingNavigation.tsx b/src/app/protected/trainings/[trainingId]/(trainee)/__trainingNavigation.tsx
new file mode 100644
index 00000000..acdd7472
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/(trainee)/__trainingNavigation.tsx
@@ -0,0 +1,91 @@
+"use client";
+
+import { useTrainingContext } from "@/providers/training";
+import Link from "next/link";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+import { BookOpen, Trophy } from "lucide-react";
+import { usePathname } from "next/navigation";
+
+// Type for contest standing data
+interface ContestStanding {
+ ContestInfo: {
+ id: number;
+ title: string;
+ };
+}
+
+// Extended training context type that might include standing
+interface ExtendedTrainingContext {
+ leaderboard: unknown[];
+ blocks: unknown[];
+ standing?: ContestStanding[];
+}
+
+export default function TrainingNavigation({
+ trainingId,
+}: {
+ trainingId: number;
+}) {
+ const training = useTrainingContext() as ExtendedTrainingContext | null;
+ const pathname = usePathname();
+
+ // If on leaderboard page, do not render the sidebar at all
+ if (pathname.includes("/leaderboard")) {
+ return <>>;
+ }
+
+ return (
+
+
+
+
+ Training Navigation
+
+
+
+ {/* Contest standings section - only show if standing data exists */}
+ {training?.standing && Array.isArray(training.standing) && training.standing.length > 0 && (
+ <>
+
+ Contest Standings
+
+ {training.standing.map((context: ContestStanding, i: number) => (
+
+
+
+ {context.ContestInfo.title}
+
+
+ ))}
+ >
+ )}
+
+
+
+
+
+ Materials
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/(trainee)/contests/[contestId]/standing/page.tsx b/src/app/protected/trainings/[trainingId]/(trainee)/contests/[contestId]/standing/page.tsx
new file mode 100644
index 00000000..02f5b212
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/(trainee)/contests/[contestId]/standing/page.tsx
@@ -0,0 +1,242 @@
+"use client";
+
+import { useTrainingContext } from "@/providers/training";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { Badge } from "@/components/ui/badge";
+import { Trophy, Medal, Clock, Users, FileText } from "lucide-react";
+import { cn } from "@/lib/utils";
+import { useEffect, useRef } from "react";
+
+export default function Page() {
+ const data = useTrainingContext();
+ const tableRef = useRef(null);
+ const pathname = window.location.pathname;
+
+ // Log the data structure to see what we're working with
+ console.log("Training Context Data:", data);
+
+ useEffect(() => {
+ const setStickyColumnOffsets = () => {
+ if (!tableRef.current) return;
+
+ const stickyColumns = tableRef.current.querySelectorAll(".sticky-col");
+ let offset = 0;
+ const styleSheet = document.styleSheets[0];
+
+ stickyColumns.forEach((col, idx) => {
+ styleSheet.insertRule(
+ `#standingTable td:nth-child(${idx + 1}) , #standingTable th:nth-child(${idx + 1}) {
+ left: ${offset}px;
+ position: sticky;
+ }`,
+ );
+ offset += col.getBoundingClientRect().width; // Add current column width for the next one
+ });
+ };
+
+ setStickyColumnOffsets();
+ }, []);
+ // Check if data and standing exist
+ if (!data || !data.standing || data.standing.length === 0) {
+ return (
+
+
+
+
+ No standings data available
+
+
+
+
+ );
+ }
+ const contestStanding = data.standing.find(
+ (standing) =>
+ standing.ContestInfo.id === Number(pathname.split("/").at(-2)),
+ );
+ if (!contestStanding) {
+ return (
+
+
+
+
+ Contest standings not found
+
+
+
+
+ );
+ }
+
+ // Get the first contest standing (assuming we're displaying one contest at a time)
+ console.log("Contest Standing:", contestStanding);
+
+ // Try to access the contest info with either property name
+ const contestInfo = contestStanding.ContestInfo;
+ const { problems, rankings } = contestStanding;
+
+ if (!contestInfo || !problems || !rankings) {
+ return (
+
+
+
+
+ Invalid standings data format
+
+
+
+
+ );
+ }
+
+ return (
+
+ {/* Contest Info Card */}
+
+
+
+ {contestInfo.title}
+
+
+
+
+
+
+
+ Start: {new Date(contestInfo.start_time).toLocaleString()}
+
+
+
+
+ Duration: {contestInfo.duration}
+
+
+
+
+ Participants: {contestInfo.participant_count}
+
+
+
+
+
+ Problems: {contestInfo.problem_count}
+
+
+
+
+
+
+ {/* Standings Table */}
+
+
+ Standings
+
+
+
+
+
+
+
+ Rank
+
+
+ Handle
+
+
+ Solved
+
+
+ Penalty
+
+ {problems.map((problem, index) => {
+ const problemLetter = problem.split(".")[0];
+ return (
+
+ {problemLetter}
+
+ );
+ })}
+
+
+
+ {rankings.map((ranking, index) => {
+ const rank = index + 1;
+ const solvedCount = ranking.solved.length;
+ const isTopRank = rank <= 3;
+
+ return (
+
+
+
+ {rank === 1 && (
+
+ )}
+ {rank === 2 && (
+
+ )}
+ {rank === 3 && (
+
+ )}
+ {rank}
+
+
+
+ {ranking.cfHandle || "Anonymous"}
+
+
+
+ {solvedCount}
+
+
+
+ {ranking.penalty}
+
+ {problems.map((problem, problemIndex) => {
+ const problemLetter = problem.split(".")[0];
+ const isSolved = ranking.solved.includes(problemLetter);
+ const isAttempted =
+ ranking.attempted.includes(problemLetter);
+
+ return (
+
+ {isSolved ? problemLetter : isAttempted ? "✗" : ""}
+
+ );
+ })}
+
+ );
+ })}
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/(trainee)/edit-contests/page.tsx b/src/app/protected/trainings/[trainingId]/(trainee)/edit-contests/page.tsx
new file mode 100644
index 00000000..65e367d4
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/(trainee)/edit-contests/page.tsx
@@ -0,0 +1,13 @@
+"use client";
+
+export default function Page() {
+ // todo: implement the page
+ return (
+
+
Edit Contests
+
This is the edit contests page.
+
Implement the edit contests functionality here.
+
{JSON.stringify({}, null, 2)}
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/(trainee)/layout.tsx b/src/app/protected/trainings/[trainingId]/(trainee)/layout.tsx
new file mode 100644
index 00000000..e89d58f7
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/(trainee)/layout.tsx
@@ -0,0 +1,30 @@
+import { getTrainingFullData } from "@/dao/getTrainingFullData";
+import TrainingProvider from "@/providers/training";
+import NoSSR from "@/components/util/NoSSR";
+import TrainingNavigation from "./__trainingNavigation";
+
+export default async function Layout({
+ children,
+ params,
+}: {
+ params: Promise<{ trainingId: string }>;
+ children: React.ReactNode;
+}) {
+ const trainingId = Number(decodeURIComponent((await params).trainingId));
+
+ const trainingData = await getTrainingFullData({ trainingId });
+ console.log(trainingData);
+
+ return (
+
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/(trainee)/leaderboard/page.tsx b/src/app/protected/trainings/[trainingId]/(trainee)/leaderboard/page.tsx
new file mode 100644
index 00000000..b81b37a9
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/(trainee)/leaderboard/page.tsx
@@ -0,0 +1,72 @@
+import { getTrainingFullData } from "@/dao/getTrainingFullData";
+import { db } from "@/lib/db";
+import { Trainings, type StandingView } from "@/lib/db/schema/training/Trainings";
+import { eq } from "drizzle-orm";
+import { getUserData } from "@/lib/session";
+import { notFound } from "next/navigation";
+
+async function getStandingViewConfig(trainingId: number): Promise {
+ const result = await db
+ .select({ standingView: Trainings.standingView })
+ .from(Trainings)
+ .where(eq(Trainings.trainingId, trainingId))
+ .execute();
+
+ return result[0]?.standingView || ["name", "cfHandle", "level"];
+}
+
+export default async function Page({ params }: { params: Promise<{ trainingId: string }> }) {
+ const user = await getUserData();
+ if (!user) {
+ notFound();
+ }
+
+ const { trainingId: trainingIdStr } = await params;
+ const trainingId = parseInt(trainingIdStr);
+ const training = await getTrainingFullData({ trainingId, userId: user.userId });
+ const standingView = await getStandingViewConfig(trainingId);
+
+ const leaderboard = training?.leaderBoard || [];
+
+ if (!leaderboard.length || !standingView.length) {
+ return (
+
+
Leaderboard
+
No leaderboard data available.
+
+ );
+ }
+
+ return (
+
+
Leaderboard
+
+
+
+
+ {standingView.map((field: StandingView) => (
+
+ {field}
+
+ ))}
+ Score
+
+
+
+ {leaderboard.map((user, idx) => (
+
+ {standingView.map((field: StandingView) => (
+
+ {user[field] !== undefined && user[field] !== null && user[field] !== "" ? user[field] : "-"}
+
+ ))}
+ {user.points}
+
+ ))}
+
+
+
+
+ );
+}
+
diff --git a/src/app/protected/trainings/[trainingId]/(trainee)/materials/page.tsx b/src/app/protected/trainings/[trainingId]/(trainee)/materials/page.tsx
new file mode 100644
index 00000000..5ab25205
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/(trainee)/materials/page.tsx
@@ -0,0 +1,117 @@
+"use client";
+import { useTrainingContext } from "@/providers/training";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+import { ExternalLink } from "lucide-react";
+import { useState } from "react";
+
+export default function Page() {
+ const training = useTrainingContext();
+ const [accordionMode, setAccordionMode] = useState(false);
+ const [openBlock, setOpenBlock] = useState(null);
+
+ if (!training) {
+ return (
+
+
Loading training materials...
+
+ );
+ }
+
+ const handleBlockClick = (blockId: number) => {
+ if (!accordionMode) return;
+ setOpenBlock((prev) => (prev === blockId ? null : blockId));
+ };
+
+ return (
+
+
+
Training Materials
+ setAccordionMode((prev) => !prev)}
+ >
+ {accordionMode ? "Show All Expanded" : "Accordion Mode"}
+
+
+ {training.blocks.length === 0 ? (
+
+
+ No materials are available for this training yet.
+
+
+ ) : (
+
+ {training.blocks.map((block) => {
+ const isOpen = !accordionMode || openBlock === block.id;
+ // Defensive: ensure materials is an array
+ const materials = Array.isArray(block.materials) ? block.materials : [];
+ return (
+
+ handleBlockClick(block.id)}
+ >
+
+
+ {block.title}
+ {materials.length > 0 && (
+ {materials.length} resource{materials.length > 1 ? 's' : ''}
+ )}
+
+ {accordionMode && (
+
{isOpen ? "▼" : "►"}
+ )}
+
+
+ {isOpen && (
+
+ {materials.length === 0 ? (
+ No materials available for this block.
+ ) : (
+
+ {materials.map((material, index) => {
+ if (!material || typeof material !== "object") return null;
+ const { title, link, des } = material;
+ if (!title && !link && !des) return null;
+ return (
+
+
+
+
{title || "Untitled Material"}
+ {des &&
{des}
}
+
+ {link && (
+
+
+ Open Resource
+
+
+ )}
+
+
+ );
+ })}
+
+ )}
+
+ )}
+
+ );
+ })}
+
+ )}
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/contests/page.tsx b/src/app/protected/trainings/[trainingId]/contests/page.tsx
new file mode 100644
index 00000000..7e570715
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/contests/page.tsx
@@ -0,0 +1,41 @@
+import { db } from "@/lib/db";
+import { Contests } from "@/lib/db/schema/training/Contests";
+import { and, eq, isNull } from "drizzle-orm";
+import { Blocks } from "@/lib/db/schema/training/Blocks";
+import { ContestsList } from "../staff/contests/_contestsList";
+
+export default async function ContestsPage({
+ params,
+}: {
+ params: Promise<{ trainingId: string }>;
+}) {
+ const { trainingId } = await params;
+ const trainingIdNumber = Number(trainingId);
+ if (isNaN(trainingIdNumber)) {
+ return Invalid training ID
;
+ }
+
+ const contests = await db
+ .select({
+ trainingId: Contests.trainingId,
+ blockNumber: Contests.blockNumber,
+ contestId: Contests.contestId,
+ judge: Contests.judge,
+ type: Contests.type,
+ title: Contests.title,
+ description: Contests.description,
+ date: Contests.date,
+ blockTitle: Blocks.title,
+ })
+ .from(Contests)
+ .where(and(eq(Contests.trainingId, trainingIdNumber), isNull(Contests.deleted)))
+ .innerJoin(Blocks, eq(Blocks.trainingId, Contests.trainingId))
+ .execute();
+
+ return (
+
+
Contests
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/layout.tsx b/src/app/protected/trainings/[trainingId]/layout.tsx
new file mode 100644
index 00000000..fbd9d5b1
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/layout.tsx
@@ -0,0 +1,65 @@
+import { getTrainingFullData } from "@/dao/getTrainingFullData";
+import { getUserData } from "@/lib/session";
+import Link from "next/link";
+import React from "react";
+import { TrainingNavigation } from "@/components/training/TrainingNavigation";
+import { getStaffRoles } from "@/dao/getStaffRoles";
+
+function Breadcrumb({
+ trainingName,
+ section,
+}: {
+ trainingName: string;
+ section?: string;
+}) {
+ return (
+
+ Dashboard >{" "}
+ My Trainings >{" "}
+ {trainingName}
+ {section && > {section} }
+
+ );
+}
+
+export default async function TrainingLayout({
+ children,
+ params,
+}: {
+ children: React.ReactNode;
+ params: Promise<{ trainingId: string }>;
+}) {
+ const { trainingId } = await params;
+ const trainingIdNumber = Number(trainingId);
+ const user = await getUserData();
+ const userId = user?.userId;
+ // Fetch training data with userId to get userRoles
+ const trainingData = await getTrainingFullData({
+ trainingId: trainingIdNumber,
+ userId,
+ });
+
+ const trainingName = trainingData.title;
+
+ // Use userRoles from trainingData
+ const userRoles = await getStaffRoles({
+ userId,
+ trainingId: trainingIdNumber,
+ });
+
+ return (
+
+
+
+
+ Training: {trainingName}
+
+ — Roles: {userRoles.length > 0 ? userRoles.join(", ") : "trainee"}
+
+
+
+
+ {children}
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/page.tsx b/src/app/protected/trainings/[trainingId]/page.tsx
new file mode 100644
index 00000000..307f9177
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/page.tsx
@@ -0,0 +1,127 @@
+import { getTrainingFullData } from "@/dao/getTrainingFullData";
+import React from "react";
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { Badge } from "@/components/ui/badge";
+import { BookOpen, Users, Trophy, Bell } from "lucide-react";
+import { TypographyH1 } from "@/components/ui/typography";
+
+export default async function TrainingOverviewPage({ params }: { params: Promise<{ trainingId: string }> }) {
+ const { trainingId } = await params;
+ const trainingIdNumber = Number(trainingId);
+ const trainingData = await getTrainingFullData({ trainingId: trainingIdNumber });
+
+ return (
+
+
+
+
Training Overview
+
Welcome to your training hub! Here you can find announcements, a summary, and quick links to all sections.
+
+
+ Training #{trainingIdNumber}
+
+
+
+
+
+
+ Training Blocks
+
+
+
+ {trainingData.blocks.length}
+
+ Total blocks in this training
+
+
+
+
+
+
+ Participants
+
+
+
+ {trainingData.leaderboard.length}
+
+ Active participants
+
+
+
+
+
+
+ Contests
+
+
+
+
+ {/* TODO: Add contest count when contests data is available */}
+ 0
+
+
+ Total contests available
+
+
+
+
+
+
+
+
+
+
+ Announcements
+
+
+ Important updates and news about this training
+
+
+
+
+
+
No announcements yet.
+
+ Check back later for updates
+
+
+
+
+
+
+
+ Quick Actions
+
+ Common tasks and shortcuts
+
+
+
+
+
+
+
View Materials
+
Access training resources
+
+
+
+
+
+
Join Contests
+
Participate in competitions
+
+
+
+
+
+
Check Leaderboard
+
See your ranking
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/[contestId]/_updateContest.tsx b/src/app/protected/trainings/[trainingId]/staff/contests/[contestId]/_updateContest.tsx
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/[contestId]/edit-contest/page.tsx b/src/app/protected/trainings/[trainingId]/staff/contests/[contestId]/edit-contest/page.tsx
new file mode 100644
index 00000000..63457126
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/contests/[contestId]/edit-contest/page.tsx
@@ -0,0 +1,3 @@
+export default function EditContestPage() {
+ return Edit Contest (placeholder)
;
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/_addContest.tsx b/src/app/protected/trainings/[trainingId]/staff/contests/_addContest.tsx
new file mode 100644
index 00000000..14cc3bb4
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/contests/_addContest.tsx
@@ -0,0 +1,212 @@
+"use client";
+
+import { useForm } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { addContestSchema } from "@/lib/validation/training/addContest";
+import { z } from "zod";
+import { Button } from "@/components/ui/button";
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { Textarea } from "@/components/ui/textarea";
+import { addContestAction } from "./actions/addContest";
+import { useToast } from "@/hooks/use-toast";
+import { useTransition } from "react";
+
+type AddContestFormProps = {
+ trainingId: number;
+ blocks: Array<{ blockNumber: number; title: string }>;
+ onClose?: () => void;
+};
+
+export function AddContestForm({ trainingId, blocks, onClose }: AddContestFormProps) {
+ const { toast } = useToast();
+ const [isPending, startTransition] = useTransition();
+
+ const form = useForm>({
+ resolver: zodResolver(addContestSchema),
+ defaultValues: {
+ trainingId,
+ blockNumber: 1,
+ type: "contest",
+ title: "",
+ description: "",
+ date: new Date(),
+ },
+ });
+
+ async function onSubmit(data: z.infer) {
+ startTransition(async () => {
+ try {
+ await addContestAction(data);
+ toast({
+ title: "Success",
+ description: "Contest added successfully",
+ });
+ onClose?.();
+ } catch (error) {
+ toast({
+ title: "Error",
+ description:
+ error instanceof Error ? error.message : "Failed to add contest",
+ variant: "destructive",
+ });
+ }
+ });
+ }
+
+ const handleCancel = () => {
+ onClose?.();
+ };
+
+ return (
+
+
+ (
+
+ Block
+
+
+
+
+
+
+
+
+ {blocks.map((block) => (
+
+ {block.title}
+
+ ))}
+
+
+
+
+
+ )}
+ />
+
+ (
+
+ Contest URL
+
+
+
+
+
+ )}
+ />
+
+ (
+
+ Type
+
+
+
+
+
+
+
+ Contest
+ Practice
+
+
+
+
+ )}
+ />
+
+ (
+
+ Title
+
+
+
+
+
+ )}
+ />
+
+ (
+
+ Description
+
+
+
+
+
+ )}
+ />
+
+ (
+
+ Date
+
+ field.onChange(new Date(e.target.value))}
+ />
+
+
+
+ )}
+ />
+
+
+
+ Cancel
+
+
+ {isPending ? "Adding..." : "Add Contest"}
+
+
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/_addContestButton.tsx b/src/app/protected/trainings/[trainingId]/staff/contests/_addContestButton.tsx
new file mode 100644
index 00000000..a12cb6b6
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/contests/_addContestButton.tsx
@@ -0,0 +1,43 @@
+"use client";
+
+import { Button } from "@/components/ui/button";
+import { Plus } from "lucide-react";
+import {
+ Dialog,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/components/ui/dialog";
+import { AddContestForm } from "./_addContest";
+import { useState } from "react";
+
+type AddContestButtonProps = {
+ trainingId: number;
+ blocks: Array<{ blockNumber: number; title: string }>;
+};
+
+export function AddContestButton({ trainingId, blocks }: AddContestButtonProps) {
+ const [open, setOpen] = useState(false);
+
+ const handleClose = () => {
+ setOpen(false);
+ };
+
+ return (
+
+
+
+
+ Add Contest
+
+
+
+
+ Add New Contest
+
+
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/_contestCard.tsx b/src/app/protected/trainings/[trainingId]/staff/contests/_contestCard.tsx
new file mode 100644
index 00000000..af522512
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/contests/_contestCard.tsx
@@ -0,0 +1,131 @@
+"use client";
+
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+import { Pencil, Trash2 } from "lucide-react";
+import { useToast } from "@/hooks/use-toast";
+import { deleteContestAction } from "./actions/deleteContest";
+import { useState } from "react";
+import {
+ Dialog,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+} from "@/components/ui/dialog";
+import { UpdateContestForm } from "./_updateContest";
+
+type Contest = {
+ trainingId: number;
+ blockNumber: number;
+ contestId: string;
+ blockTitle: string;
+ judge: string;
+ type: string;
+ title: string;
+ description: string;
+ date: Date;
+};
+
+type ContestCardProps = {
+ contest: Contest;
+ trainingId: number;
+};
+
+export function ContestCard({ contest}: ContestCardProps) {
+ const { toast } = useToast();
+ const [showEditDialog, setShowEditDialog] = useState(false);
+
+ async function handleDelete() {
+ try {
+ await deleteContestAction({
+ trainingId: contest.trainingId,
+ blockNumber: contest.blockNumber,
+ contestId: contest.contestId,
+ });
+
+ toast({
+ title: "Success",
+ description: "Contest deleted successfully",
+ });
+
+ // Refresh the page to show updated list
+ window.location.reload();
+ } catch (error) {
+ toast({
+ title: "Error",
+ description: error instanceof Error ? error.message : "Failed to delete contest",
+ variant: "destructive",
+ });
+ }
+ }
+
+ return (
+ <>
+
+
+ {contest.title}
+
+
setShowEditDialog(true)}
+ >
+
+
+
+
+
+
+
+
+
+
+ Type:
+ {contest.type}
+
+
+ Judge:
+ {contest.judge}
+
+
+ Block:
+ {contest.blockTitle}
+
+
+ Date:
+
+ {new Date(contest.date).toLocaleString()}
+
+
+ {contest.description && (
+
+
Description:
+
{contest.description}
+
+ )}
+
+
+
+
+
+
+
+ Edit Contest
+
+ {
+ setShowEditDialog(false);
+ window.location.reload();
+ }}
+ onCancel={() => setShowEditDialog(false)}
+ />
+
+
+ >
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/_contestForm.tsx b/src/app/protected/trainings/[trainingId]/staff/contests/_contestForm.tsx
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/_contestsList.tsx b/src/app/protected/trainings/[trainingId]/staff/contests/_contestsList.tsx
new file mode 100644
index 00000000..47d1044f
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/contests/_contestsList.tsx
@@ -0,0 +1,43 @@
+import { Card, CardContent } from "@/components/ui/card";
+import { ContestCard } from "./_contestCard";
+
+type Contest = {
+ trainingId: number;
+ blockNumber: number;
+ blockTitle: string;
+ contestId: string;
+ judge: string;
+ type: string;
+ title: string;
+ description: string;
+ date: Date;
+};
+
+type ContestsListProps = {
+ contests: Contest[];
+ trainingId: number;
+};
+
+export function ContestsList({ contests, trainingId }: ContestsListProps) {
+ if (contests.length === 0) {
+ return (
+
+
+ No contests found
+
+
+ );
+ }
+
+ return (
+
+ {contests.map((contest) => (
+
+ ))}
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/_updateContest.tsx b/src/app/protected/trainings/[trainingId]/staff/contests/_updateContest.tsx
new file mode 100644
index 00000000..ff1d1604
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/contests/_updateContest.tsx
@@ -0,0 +1,174 @@
+"use client";
+
+import { useForm } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { updateContestSchema } from "@/lib/validation/training/updateContest";
+import { z } from "zod";
+import { Button } from "@/components/ui/button";
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { Textarea } from "@/components/ui/textarea";
+import { addContestAction as updateContestAction } from "./actions/updateContest";
+import { useToast } from "@/hooks/use-toast";
+import { useState } from "react";
+
+type Contest = {
+ trainingId: number;
+ blockNumber: number;
+ contestId: string;
+ judge: string;
+ type: string;
+ title: string;
+ description: string;
+ date: Date;
+};
+
+type UpdateContestFormProps = {
+ contest: Contest;
+ onSuccess: () => void;
+ onCancel: () => void;
+};
+
+export function UpdateContestForm({ contest }: UpdateContestFormProps) {
+ const { toast } = useToast();
+ const [isLoading, setIsLoading] = useState(false);
+
+ const form = useForm>({
+ resolver: zodResolver(updateContestSchema),
+ defaultValues: {
+ trainingId: contest.trainingId,
+ blockNumber: contest.blockNumber,
+ contestId: contest.contestId,
+ type: contest.type as "contest" | "practice",
+ title: contest.title,
+ description: contest.description,
+ date: new Date(contest.date),
+ },
+ });
+
+ async function onSubmit(data: z.infer) {
+ try {
+ setIsLoading(true);
+ await updateContestAction(data);
+ toast({
+ title: "Success",
+ description: "Contest updated successfully",
+ });
+ } catch (error) {
+ toast({
+ title: "Error",
+ description:
+ error instanceof Error ? error.message : "Failed to update contest",
+ variant: "destructive",
+ });
+ } finally {
+ setIsLoading(false);
+ }
+ }
+
+ return (
+
+
+ (
+
+ Type
+
+
+
+
+
+
+
+ Contest
+ Practice
+
+
+
+
+ )}
+ />
+
+ (
+
+ Title
+
+
+
+
+
+ )}
+ />
+
+ (
+
+ Description
+
+
+
+
+
+ )}
+ />
+
+ (
+
+ Date
+
+ field.onChange(new Date(e.target.value))}
+ />
+
+
+
+ )}
+ />
+
+
+
+ Cancel
+
+
+ {isLoading ? "Updating..." : "Update Contest"}
+
+
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/actions/__tests__/addContest.test.ts b/src/app/protected/trainings/[trainingId]/staff/contests/actions/__tests__/addContest.test.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/actions/__tests__/deleteContest.test.ts b/src/app/protected/trainings/[trainingId]/staff/contests/actions/__tests__/deleteContest.test.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/actions/__tests__/updateContest.test.ts b/src/app/protected/trainings/[trainingId]/staff/contests/actions/__tests__/updateContest.test.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/actions/addContest.ts b/src/app/protected/trainings/[trainingId]/staff/contests/actions/addContest.ts
new file mode 100644
index 00000000..6bf8000a
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/contests/actions/addContest.ts
@@ -0,0 +1,73 @@
+"use server";
+import "server-only";
+
+import { db } from "@/lib/db";
+import { z } from "zod";
+import { addContestSchema } from "@/lib/validation/training/addContest";
+import { Contests } from "@/lib/db/schema/training/Contests";
+import UrlPattern from "url-pattern";
+import { getUserData } from "@/lib/session";
+import { getUserTrainingPermissions } from "@/lib/permissions/getUserTrainingPermissions";
+import { revalidatePath } from "next/cache";
+export async function addContestAction(
+ input: z.infer,
+) {
+ try {
+ const parsedData = addContestSchema.parse(input);
+ const {
+ trainingId,
+ blockNumber,
+ contestUrl,
+ type,
+ title,
+ description,
+ date,
+ } = parsedData;
+
+ const user = await getUserData();
+ if (!user) {
+ throw new Error("User not authenticated");
+ }
+ const { userId } = user;
+ const permissions = await getUserTrainingPermissions(userId, trainingId);
+ if (!permissions.includes("Edit:contest")) {
+ throw new Error("User does not have permissions for this training");
+ }
+
+ const pattern = new UrlPattern(
+ "(http(s)\\://)(:subdomain.):domain.:tld(\\::port)(/group/:groupId)/contest/:contestId",
+ );
+ const match = pattern.match(contestUrl);
+ if (!match) throw new Error("Invalid contest URL");
+ const { groupId, contestId, domain } = match;
+ if (!contestId) throw new Error("Invalid contest URL");
+ const judge = (function () {
+ if (domain === "codeforces") {
+ return "cf";
+ } else if (domain === "vjudge") {
+ return "vj";
+ } else {
+ throw new Error("Invalid contest URL");
+ }
+ })();
+
+ await db
+ .insert(Contests)
+ .values({
+ trainingId,
+ blockNumber,
+ contestId,
+ judge,
+ groupId: groupId ?? null,
+ type,
+ title,
+ description: description ?? "",
+ date,
+ })
+ .execute();
+ revalidatePath(`/protected/trainings/${trainingId}`);
+ } catch (error) {
+ console.error("Error adding contest:", error);
+ throw new Error("Failed to add contest");
+ }
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/actions/deleteContest.ts b/src/app/protected/trainings/[trainingId]/staff/contests/actions/deleteContest.ts
new file mode 100644
index 00000000..bff2377d
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/contests/actions/deleteContest.ts
@@ -0,0 +1,52 @@
+"use server";
+import "server-only";
+
+import { db } from "@/lib/db";
+import { z } from "zod";
+import { Contests } from "@/lib/db/schema/training/Contests";
+import { deleteContestSchema } from "@/lib/validation/training/deleteContest";
+import { and, eq, isNull } from "drizzle-orm";
+import { getUserData } from "@/lib/session";
+import { getUserTrainingPermissions } from "@/lib/permissions/getUserTrainingPermissions";
+import { revalidatePath } from "next/cache";
+
+export async function deleteContestAction(
+ input: z.infer,
+) {
+ try {
+ const parsedData = deleteContestSchema.parse(input);
+ const { trainingId, blockNumber, contestId } = parsedData;
+
+ const user = await getUserData();
+ if (!user) {
+ throw new Error("User not authenticated");
+ }
+ const { userId } = user;
+ const permissions = await getUserTrainingPermissions(userId, trainingId);
+ if (!permissions.includes("Edit:contest")) {
+ throw new Error("User does not have permissions for this training");
+ }
+ const res = await db
+ .update(Contests)
+ .set({
+ deleted: new Date(),
+ })
+ .where(
+ and(
+ eq(Contests.trainingId, trainingId),
+ eq(Contests.blockNumber, blockNumber),
+ eq(Contests.contestId, contestId),
+ isNull(Contests.deleted), // Ensure the contest is not already deleted
+ ),
+ )
+ .returning()
+ .execute();
+ revalidatePath(`/protected/trainings/${trainingId}`);
+ if (res.length === 0) {
+ throw new Error("Contest not found or already deleted");
+ }
+ } catch (error) {
+ console.error("Error deleting contest:", error);
+ throw new Error("Failed to delete contest");
+ }
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/actions/updateContest.ts b/src/app/protected/trainings/[trainingId]/staff/contests/actions/updateContest.ts
new file mode 100644
index 00000000..1e042649
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/contests/actions/updateContest.ts
@@ -0,0 +1,64 @@
+"use server";
+import "server-only";
+
+import { db } from "@/lib/db";
+import { z } from "zod";
+import { updateContestSchema } from "@/lib/validation/training/updateContest";
+import { Contests } from "@/lib/db/schema/training/Contests";
+import { and, eq, isNull } from "drizzle-orm";
+import { getUserData } from "@/lib/session";
+import { getUserTrainingPermissions } from "@/lib/permissions/getUserTrainingPermissions";
+import { revalidatePath } from "next/cache";
+export async function addContestAction(
+ input: z.infer,
+) {
+ try {
+ const parsedData = updateContestSchema.parse(input);
+ const { trainingId, blockNumber, type, title, description, date, contestId} =
+ parsedData;
+
+
+
+ const user = await getUserData();
+ if (!user) {
+ throw new Error("User not authenticated");
+ }
+ const { userId } = user;
+ const permissions = await getUserTrainingPermissions(userId, trainingId);
+ if (!permissions.includes("Edit:contest")) {
+ throw new Error("User does not have permissions for this training");
+ }
+ const toSet = {
+ type,
+ title,
+ description,
+ date,
+ };
+ // remove undefined values
+
+ Object.keys(toSet).forEach((key) => {
+ // @ts-expect-error - ts doesn't know that toSet is a partial of Contests
+ if (toSet[key] === undefined) {
+ // @ts-expect-error - ts doesn't know that toSet is a partial of Contests
+ delete toSet[key];
+ }
+ });
+
+ await db
+ .update(Contests)
+ .set(toSet)
+ .where(
+ and(
+ eq(Contests.trainingId, trainingId),
+ eq(Contests.blockNumber, blockNumber),
+ eq(Contests.contestId, contestId),
+ isNull(Contests.deleted), // Ensure the contest is not already deleted
+ ),
+ )
+ .execute();
+ revalidatePath(`/protected/trainings/${trainingId}`);
+ } catch (error) {
+ console.error("Error adding contest:", error);
+ throw new Error("Failed to add contest");
+ }
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/contests/page.tsx b/src/app/protected/trainings/[trainingId]/staff/contests/page.tsx
new file mode 100644
index 00000000..c3c546a3
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/contests/page.tsx
@@ -0,0 +1,56 @@
+import { db } from "@/lib/db";
+import { Contests } from "@/lib/db/schema/training/Contests";
+import { and, eq, isNull } from "drizzle-orm";
+import { ContestsList } from "./_contestsList";
+import { AddContestButton } from "./_addContestButton";
+import { redirect } from "next/navigation";
+import { Blocks } from "@/lib/db/schema/training/Blocks";
+
+export default async function ContestsPage({
+ params,
+}: {
+ params: Promise<{ trainingId: string }>;
+}) {
+ const trainingId = Number((await params).trainingId);
+ if (isNaN(trainingId)) {
+ redirect("not-found");
+ }
+
+ const blocks = await db
+ .select({
+ blockNumber: Blocks.blockNumber,
+ title: Blocks.title,
+ })
+ .from(Blocks)
+ .where(and(eq(Blocks.trainingId, trainingId), isNull(Blocks.deleted)))
+ .execute();
+
+ const contests = await db
+ .select({
+ trainingId: Contests.trainingId,
+ blockNumber: Contests.blockNumber,
+ contestId: Contests.contestId,
+ judge: Contests.judge,
+ type: Contests.type,
+ title: Contests.title,
+ description: Contests.description,
+ date: Contests.date,
+ blockTitle: Blocks.title,
+ })
+ .from(Contests)
+ .where(and(eq(Contests.trainingId, trainingId), isNull(Contests.deleted)))
+ .innerJoin(Blocks, eq(Blocks.trainingId, Contests.trainingId))
+ .execute();
+ console.log(contests);
+
+ return (
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-blocks/[blockNumber]/_blockForm.tsx b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/[blockNumber]/_blockForm.tsx
new file mode 100644
index 00000000..7d14b1ff
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/[blockNumber]/_blockForm.tsx
@@ -0,0 +1,193 @@
+"use client"
+import { useRouter } from "next/navigation";
+import { FormProvider, SubmitHandler, useForm } from "react-hook-form";
+import { BlockFormData, blockValidations } from "@/lib/validation/training/blockValidations";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form";
+import { useState, useTransition } from "react";
+import { updateBlock } from "@/app/protected/trainings/[trainingId]/staff/edit-blocks/actions/_editBlock";
+
+
+//
+type staffViewBlock = {
+ blockNumber: number; trainingId: number; title: string; description: string; hidden: boolean; date: Date;
+
+};
+
+type BlockFormProps = {
+ initialData: staffViewBlock | null; isEdit?: boolean;
+}
+
+
+/**
+ * BlockForm component for creating or editing a block.
+ * @param initialData - The initial data for the block, used when editing.
+ * @param isEdit - Flag to indicate if the form is for editing an existing block or creating a new one.
+ * @constructor
+ */
+export default function BlockForm({ initialData, isEdit = true }: Readonly) {
+ const router = useRouter();
+ const [error, setError] = useState(null);
+ const [isPending, startTransition] = useTransition();
+
+ // Check if initialData is null
+ const form = useForm({
+ resolver: zodResolver(blockValidations), defaultValues: {
+ title: initialData?.title ?? "",
+ description: initialData?.description ?? "",
+ date: initialData?.date ? new Date(initialData.date) : undefined,
+ hidden: initialData?.hidden || false,
+ },
+ });
+
+ // Handle form submission
+ const onSubmit: SubmitHandler = (data) => {
+ startTransition(async () => {
+ setError(null);
+
+ try {
+ // Validate the block number and training ID
+ if (isEdit && (!initialData?.blockNumber || !initialData?.trainingId)) {
+ throw new Error("Missing required block identification data");
+ }
+
+ // Update the block in the database
+ await updateBlock({
+ blockNumber: initialData!.blockNumber, // Non-null assertion after validation
+ trainingId: initialData!.trainingId, // Non-null assertion after validation
+ newBlockData: { ...data, date: data.date.toDateString() }
+ });
+ // Redirect to the blocks page
+ router.push(`/protected/trainings/${initialData?.trainingId}/staff/edit-blocks`);
+
+ } catch (err) {
+ console.error("Submission failed:", err);
+ setError("error");
+ }
+
+ });
+ };
+
+ return (
+
+
+
+
+
+ {isPending ? 'Saving...' : 'Save Changes'}
+
+ router.back()}
+ className="delete-button"
+ disabled={isPending}
+ >
+ Cancel
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-blocks/[blockNumber]/page.tsx b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/[blockNumber]/page.tsx
new file mode 100644
index 00000000..251f93b7
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/[blockNumber]/page.tsx
@@ -0,0 +1,58 @@
+import BlockForm from "@/app/protected/trainings/[trainingId]/staff/edit-blocks/[blockNumber]/_blockForm";
+import "@/styles/components/block.css"
+import { Blocks } from "@/lib/db/schema/training/Blocks";
+import { Trainings } from "@/lib/db/schema/training/Trainings";
+import { eq , and} from "drizzle-orm";
+import { db } from "@/lib/db";
+
+
+/**
+ * Page component for editing a block.
+ * @param params - The parameters containing the block number and training ID.
+ */
+export default async function page({params}: { params: Promise<{ blockNumber: string, trainingId: string }> }) {
+
+ // Parse block data from params
+ const {blockNumber: blockNumberStr, trainingId: trainingIdStr} = await params;
+
+ // Validate numeric parameters first
+ const blockNumber = Number(blockNumberStr);
+ const trainingId = Number(trainingIdStr);
+
+ // Check if the parameters are valid numbers
+ if (isNaN(blockNumber)) throw new Error("Invalid block number");
+ if (isNaN(trainingId)) throw new Error("Invalid training ID");
+
+ // Fetch the block data
+ const block = await db.select(
+ {
+ trainingId:Trainings.trainingId,
+ title: Blocks.title,
+ description: Trainings.description,
+ hidden: Blocks.hidden,
+ date: Blocks.date,
+ blockNumber: Blocks.blockNumber
+
+ })
+ .from(Trainings)
+ .where(and(eq(Trainings.trainingId, trainingId),eq(Blocks.blockNumber, blockNumber)))
+ .innerJoin(Blocks, eq(Blocks.trainingId, Trainings.trainingId))
+ .execute()
+
+ // Check if the block data is null
+ if (block.length === 0) {
+ console.error("Block not found");
+ return null;
+ }
+
+ return (
+
+
+
+ );
+
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-blocks/_blockForm.tsx b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/_blockForm.tsx
new file mode 100644
index 00000000..d370cf18
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/_blockForm.tsx
@@ -0,0 +1,141 @@
+"use client";
+
+import { zodResolver } from "@hookform/resolvers/zod";
+import { useForm } from "react-hook-form";
+import { z } from "zod";
+import { Button } from "@/components/ui/button";
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import { Textarea } from "@/components/ui/textarea";
+import { Switch } from "@/components/ui/switch";
+import { updateBlockSchema } from "@/lib/validation/training/updateBlocks";
+import { updateBlock } from "./actions/_editBlock";
+import { useToast } from "@/hooks/use-toast"
+
+interface BlockFormProps {
+ trainingId: number;
+ blockNumber: number;
+ initialData: z.infer;
+}
+
+export function BlockForm({ trainingId, blockNumber, initialData }: BlockFormProps) {
+ const { toast } = useToast();
+ const form = useForm>({
+ resolver: zodResolver(updateBlockSchema),
+ defaultValues: initialData,
+ });
+
+ async function onSubmit(values: z.infer) {
+ const result = await updateBlock({
+ trainingId,
+ blockNumber,
+ newBlockData: values,
+ });
+
+ console.log("Update result:", result);
+ try{
+ toast({
+ title: "Success",
+ description: "Block updated successfully",
+ });
+ } catch (error) {
+ if (error instanceof Error) {
+ toast({
+ title: "Error",
+ description: error.message || 'unknown error',
+ variant: "destructive",
+ });
+ } else {
+ toast({
+ title: "Error",
+ description: 'unknown error',
+ variant: "destructive",
+ });
+ }
+ }
+ }
+
+ return (
+
+
+ (
+
+ Title
+
+
+
+
+
+ )}
+ />
+
+ (
+
+ Description
+
+
+
+
+
+ )}
+ />
+
+ (
+
+ Date
+
+
+
+
+
+ )}
+ />
+
+ (
+
+
+
Hidden
+
+ Hide this block from participants
+
+
+
+
+
+
+ )}
+ />
+
+
+ Update Block
+
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-blocks/_editBlockButton.tsx b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/_editBlockButton.tsx
new file mode 100644
index 00000000..413d9c6b
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/_editBlockButton.tsx
@@ -0,0 +1,37 @@
+"use client"
+import {Button} from "@/components/ui/button";
+import "@/styles/components/block.css";
+import {PencilIcon} from "lucide-react";
+import {useRouter} from "next/navigation";
+import {useState} from "react";
+
+/**
+ * EditBlockButton component for navigating to the edit block page.
+ * @param params - The parameters containing the training ID and block number.
+ * @constructor
+ */
+export default function EditBlockButton(params: Readonly<{
+ trainingId: number;
+ blockNumber: number;
+}>) {
+ const router = useRouter();
+ const [isSubmitting, setIsSubmitting] = useState(false);
+
+ const handleEditBlock = () => {
+ setIsSubmitting(true);
+ // return to the update block page
+ router.push(`/protected/trainings/${params.trainingId}/staff/edit-blocks/${params.blockNumber}`);
+
+ };
+
+ return (
+
+
+ Edit Block
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-blocks/_updateBlock.tsx b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/_updateBlock.tsx
new file mode 100644
index 00000000..510780dc
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/_updateBlock.tsx
@@ -0,0 +1,72 @@
+"use client";
+
+import { useState } from "react";
+import { BlockForm } from "./_blockForm";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { updateBlockSchema } from "@/lib/validation/training/updateBlocks";
+import { z } from "zod";
+
+type BlockData = z.infer & {
+ blockNumber: number;
+};
+
+interface UpdateBlockProps {
+ trainingId: number;
+ initialBlocks: BlockData[];
+}
+
+export function UpdateBlock({ trainingId, initialBlocks }: UpdateBlockProps) {
+ const [selectedBlock, setSelectedBlock] = useState(null);
+
+ return (
+
+
+
Select Block to Edit
+ {
+ const block = initialBlocks.find((b) => b.blockNumber.toString() === value);
+ setSelectedBlock(block || null);
+ }}
+ >
+
+
+
+
+ {initialBlocks.map((block) => (
+
+ Block {block.blockNumber}: {block.title}
+
+ ))}
+
+
+
+
+ {selectedBlock && (
+
+
+ Edit Block {selectedBlock.blockNumber}
+
+
+
+ )}
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-blocks/actions/__tests__/_editBlock.test.ts b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/actions/__tests__/_editBlock.test.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-blocks/actions/_editBlock.ts b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/actions/_editBlock.ts
new file mode 100644
index 00000000..d071a62e
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/actions/_editBlock.ts
@@ -0,0 +1,58 @@
+"use server";
+import "server-only";
+import { db } from "@/lib/db";
+import { updateBlockSchema } from "@/lib/validation/training/updateBlocks";
+import { z } from "zod";
+import { Blocks } from "@/lib/db/schema/training/Blocks";
+import { and, eq } from "drizzle-orm";
+import { getUserData } from "@/lib/session";
+import { getUserTrainingPermissions } from "@/lib/permissions/getUserTrainingPermissions";
+
+const inputSchema = z.object({
+ trainingId: z.number().int(),
+ blockNumber: z.number().int(),
+ newBlockData: updateBlockSchema,
+});
+
+export async function updateBlock(input: z.infer) {
+ try {
+ const { trainingId, blockNumber, newBlockData } = inputSchema.parse(input);
+ const user = await getUserData();
+
+ if (!user) {
+ throw new Error('unautherized');
+ }
+ const userPermissions = await getUserTrainingPermissions(user.userId, trainingId)
+
+ if (!userPermissions.includes("Edit:block")) {
+ throw new Error("unautherized")
+ }
+ db
+ .update(Blocks)
+ .set({
+ title: newBlockData.title,
+ description: newBlockData.description,
+ date: new Date(newBlockData.date),
+ hidden: newBlockData.hidden,
+ })
+ .where(
+ and(
+ eq(Blocks.blockNumber, blockNumber),
+ eq(Blocks.trainingId, trainingId),
+ ),
+ )
+ .execute();
+ return { success: true };
+ } catch (error) {
+ if (error instanceof z.ZodError) {
+ // return zod error
+ throw new Error(error.issues
+ .map((issue) =>
+ `${issue.path.join('.')}: ${issue.message}`)
+ .join('\n'));
+ }
+ console.error("Error updating block:", error);
+
+ throw error;
+ }
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-blocks/page.tsx b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/page.tsx
new file mode 100644
index 00000000..afa492cd
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-blocks/page.tsx
@@ -0,0 +1,38 @@
+import { UpdateBlock } from "./_updateBlock";
+import { db } from "@/lib/db";
+import { Blocks } from "@/lib/db/schema/training/Blocks";
+import { and, eq, isNull, sql } from "drizzle-orm";
+import { redirect } from "next/navigation";
+
+export default async function EditBlocksPage({
+ params,
+}: {
+ params: Promise<{ trainingId: string }>;
+}) {
+ const { trainingId } = await params;
+ const trainingIdNumber = parseInt(trainingId);
+ if (isNaN(trainingIdNumber)) {
+ redirect("404");
+ }
+
+ const blocks = await db
+ .select({
+ blockNumber: Blocks.blockNumber,
+ title: Blocks.title,
+ description: Blocks.description,
+ date: sql`to_char(${Blocks.date}, 'YYYY-MM-DD')`,
+ hidden: Blocks.hidden,
+ })
+ .from(Blocks)
+ .where(and(eq(Blocks.trainingId, trainingIdNumber), isNull(Blocks.deleted)))
+ .orderBy(Blocks.blockNumber);
+
+ return (
+
+
Edit Training Blocks
+
+
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/EditStandingViewForm.tsx b/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/EditStandingViewForm.tsx
new file mode 100644
index 00000000..77a49fdc
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/EditStandingViewForm.tsx
@@ -0,0 +1,141 @@
+"use client";
+import { useState } from "react";
+import { Card, CardHeader, CardTitle, CardContent, CardFooter } from "@/components/ui/card";
+import { Checkbox } from "@/components/ui/checkbox";
+import { Button } from "@/components/ui/button";
+import { updateStandingView } from "./actions";
+import type { StandingView } from "@/lib/db/schema/training/Trainings";
+import { redirect, useRouter } from "next/navigation";
+import { z } from "zod";
+import { useForm, FormProvider } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { Form } from "@/components/ui/form";
+
+// Zod schema (same as in actions.ts)
+const standingViewSchema = z.object({
+ trainingId: z.number().positive(),
+ standingView: z.array(z.enum(["name", "cfHandle", "vjudge", "gmail", "level", "university", "faculty"])),
+});
+
+type StandingViewFormValues = z.infer;
+
+// Type-safe ALL_COLUMNS array that matches StandingView type
+const ALL_COLUMNS: Array<{ key: StandingView; label: string }> = [
+ { key: "name", label: "Name" },
+ { key: "cfHandle", label: "Codeforces Handle" },
+ { key: "vjudge", label: "Vjudge Handle" },
+ { key: "gmail", label: "Gmail" },
+ { key: "level", label: "Level" },
+ { key: "university", label: "University" },
+ { key: "faculty", label: "Faculty" },
+];
+
+function reorder(arr: T[], from: number, to: number): T[] {
+ const copy = [...arr];
+ const [moved] = copy.splice(from, 1);
+ copy.splice(to, 0, moved);
+ return copy;
+}
+
+export default function EditStandingViewForm({ initial, trainingId }: { initial: string[]; trainingId: number }) {
+ const [message, setMessage] = useState(null);
+ const router = useRouter();
+
+ const methods = useForm({
+ resolver: zodResolver(standingViewSchema),
+ defaultValues: {
+ trainingId,
+ standingView: initial as StandingView[],
+ },
+ });
+
+ const { handleSubmit, setValue, watch, formState: { errors, isSubmitting } } = methods;
+ const selected = watch("standingView");
+
+ const onSubmit = async (data: StandingViewFormValues) => {
+ setMessage(null);
+ const res = await updateStandingView(data);
+ if (res.success) {
+ setMessage("Standing view updated.");
+ router.push(`/protected/trainings/${trainingId}/leaderboard`);
+ } else {
+ setMessage(res.error || "Failed to update.");
+ }
+ };
+
+ const handleToggle = (key: StandingView) => {
+ const current = methods.getValues("standingView");
+ if (current.includes(key)) {
+ setValue("standingView", current.filter(k => k !== key));
+ } else {
+ setValue("standingView", [...current, key]);
+ }
+ };
+
+ const move = (from: number, to: number) => {
+ setValue("standingView", reorder(selected, from, to));
+ };
+
+ const handleCancel = () => {
+ redirect(`/protected/trainings/${trainingId}/leaderboard`);
+ };
+
+ return (
+
+
+
+ Edit Standing View
+
+
+ {message && {message}
}
+
+
+ Selected Columns (drag to reorder):
+
+ {selected.map((key, idx) => {
+ const col = ALL_COLUMNS.find(c => c.key === key);
+ return (
+
+ {col?.label || key}
+ move(idx, idx - 1)}>
+ ↑
+
+ move(idx, idx + 1)}>
+ ↓
+
+ handleToggle(key as StandingView)}>
+ Remove
+
+
+ );
+ })}
+
+ Available Columns:
+
+ {ALL_COLUMNS.filter(col => !selected.includes(col.key)).map((col) => (
+
+ handleToggle(col.key)}
+ disabled={isSubmitting}
+ />
+ {col.label}
+
+ ))}
+
+ {errors.standingView && {errors.standingView.message as string}
}
+
+
+ Cancel
+
+
+ Save
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/actions.ts b/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/actions.ts
new file mode 100644
index 00000000..3f94bbef
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/actions.ts
@@ -0,0 +1,45 @@
+"use server";
+import "server-only";
+import { db } from "@/lib/db";
+import { Trainings } from "@/lib/db/schema/training/Trainings";
+import { eq } from "drizzle-orm";
+import { getUserTrainingPermissions } from "@/lib/permissions/getUserTrainingPermissions";
+import { getUserData } from "@/lib/session";
+import { z } from "zod";
+import { revalidatePath } from "next/cache";
+
+// Zod validation schema for the updateStandingView action
+const updateStandingViewSchema = z.object({
+ trainingId: z.number().positive(),
+ standingView: z.array(z.enum(["name", "cfHandle", "vjudge", "gmail", "level", "university", "faculty"])),
+});
+
+export async function updateStandingView({
+ trainingId,
+ standingView,
+}: z.infer) {
+ try {
+ const parsedData = updateStandingViewSchema.parse({
+ trainingId,
+ standingView,
+ });
+ const user = await getUserData();
+ if (!user) {
+ throw new Error("User not authenticated");
+ }
+ const permissions = await getUserTrainingPermissions(user.userId, trainingId);
+ if (!permissions.includes("Edit:training")) {
+ throw new Error("User does not have permissions for this training");
+ }
+
+ await db
+ .update(Trainings)
+ .set({ standingView: parsedData.standingView })
+ .where(eq(Trainings.trainingId, parsedData.trainingId))
+ .execute();
+ revalidatePath(`/protected/trainings/${trainingId}/staff/edit-standing-view`);
+ } catch (error) {
+ console.error("Error updating standing view:", error);
+ throw new Error("Failed to update standing view");
+ }
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/actions/__tests__/_update-standing-view.test.ts b/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/actions/__tests__/_update-standing-view.test.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/actions/_update-standing-view.ts b/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/actions/_update-standing-view.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/page.tsx b/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/page.tsx
new file mode 100644
index 00000000..590f9fa4
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-standing-view/page.tsx
@@ -0,0 +1,10 @@
+import { getTrainingFullData } from "@/dao/getTrainingFullData";
+import EditStandingViewForm from "./EditStandingViewForm";
+
+export default async function EditStandingViewPage({ params }: { params: Promise<{ trainingId: string }> }) {
+ const { trainingId } = await params;
+ const trainingIdNumber = Number(trainingId);
+ const trainingData = await getTrainingFullData({ trainingId: trainingIdNumber });
+ const initial = trainingData.standingView || [];
+ return ;
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-training/_trainingForm.tsx b/src/app/protected/trainings/[trainingId]/staff/edit-training/_trainingForm.tsx
new file mode 100644
index 00000000..778e134a
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-training/_trainingForm.tsx
@@ -0,0 +1,220 @@
+"use client"
+import {useRouter} from "next/navigation";
+import {FormProvider, SubmitHandler, useForm} from "react-hook-form";
+import {TrainingFormData, trainingValidations} from "@/lib/validation/training/trainingValidations";
+import {zodResolver} from "@hookform/resolvers/zod";
+import {FormControl, FormField, FormItem, FormLabel, FormMessage} from "@/components/ui/form";
+import {useState} from "react";
+import {updateTraining} from "@/app/protected/trainings/[trainingId]/staff/edit-training/actions/_editTraining";
+import {Status} from "@/lib/db/schema/training/Trainings";
+
+
+export type TrainingEdit = {
+ trainingId: number;
+ title: string;
+ description: string;
+ startDate: Date;// should not be after expiration of the date
+ duration: number;// also number of blocks
+ status: Status;
+ headId: string;
+ chiefJudge: string;
+};
+
+type TrainingFormProps = {
+ initialData: TrainingEdit;
+ isEdit?: boolean;
+}
+
+
+/**
+ * TrainingForm component for creating or editing a training.
+ * @param initialData - The initial data for the training, used when editing.
+ * @param isEdit - Flag to indicate if the form is for editing an existing training or creating a new one.
+ * @constructor
+ */
+export default function TrainingForm({initialData, isEdit}: Readonly) {
+ const router = useRouter();
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [error, setError] = useState(null);
+
+ // Check if initialData is null
+ const form = useForm({
+ resolver: zodResolver(trainingValidations), defaultValues: {
+ title: initialData?.title ?? "",
+ description: initialData?.description ?? "",
+ startDate: initialData?.startDate ? new Date(initialData.startDate) : undefined,
+ duration: initialData?.duration ?? 1,
+ status: initialData?.status || 'private',
+ },
+ });
+
+ // Handle form submission
+ const onSubmit: SubmitHandler = async (data) => {
+ console.log("Form data:", data);
+ setIsSubmitting(true);
+ setError(null);
+
+ console.log("Form submitted with data:", data);
+
+ try {
+ // Validate the training ID
+ if (isEdit && !initialData?.trainingId) {
+ throw new Error("Missing required training identification data");
+ }
+ // Update the training in the database
+ await updateTraining({
+ trainingId: initialData!.trainingId, // Non-null assertion after validation
+ ...data
+ });
+ // Redirect to the trainings page
+ console.log("Training updated successfully");
+ router.push(`/protected/profile`);
+
+ } catch (err) {
+ console.error("Submission failed:", err);
+ setError("Failed to save training. Please try again.");
+ } finally {
+ setIsSubmitting(false);
+ }
+ };
+
+ return (
+
+
+
+
+
+ {isSubmitting ? 'Saving...' : 'Save Changes'}
+
+ router.back()}
+ className="delete-button"
+ disabled={isSubmitting}
+ >
+ Cancel
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-training/actions/__tests__/_editTraining.test.ts b/src/app/protected/trainings/[trainingId]/staff/edit-training/actions/__tests__/_editTraining.test.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-training/actions/_editTraining.ts b/src/app/protected/trainings/[trainingId]/staff/edit-training/actions/_editTraining.ts
new file mode 100644
index 00000000..46541d7d
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-training/actions/_editTraining.ts
@@ -0,0 +1,152 @@
+"use server"
+import {getUserData} from "@/lib/session";
+import {getUserTrainingPermissions} from "@/lib/permissions/getUserTrainingPermissions";
+import {cache} from "react";
+import {db} from "@/lib/db";
+import {and, eq, isNull} from "drizzle-orm";
+import {Trainings} from "@/lib/db/schema/training/Trainings";
+import {TrainingFormData} from "@/lib/validation/training/trainingValidations";
+import {TrainingEdit} from "@/app/protected/trainings/[trainingId]/staff/edit-training/_trainingForm";
+
+
+// This function fetches training data by ID, ensuring the user has the necessary permissions to view the training.
+
+
+/**
+ * Fetches a training by ID.
+ * @param trainingId - The ID of the training.
+ * @Returns {Promise} - Returns the training or null if an error occurs.
+ */
+export const getTraining = cache(async (trainingId: number) => {
+ try {
+ // Fetch user data
+ const user = await getUserData();
+ if (!user) {
+ console.error("User not authenticated");
+ return null;
+ }
+
+ const {userId} = user;
+
+ // Fetch user permissions
+ const permissions = await getUserTrainingPermissions(userId, trainingId);
+ if (!permissions) {
+ console.error("Failed to fetch user permissions");
+ return null;
+ }
+
+ const canViewTraining = "View:training";
+ if (!permissions.includes(canViewTraining)) {
+ console.error("User does not have permission to view training");
+ return null;
+ }
+
+ // Fetch training from the database
+
+ const data = await db
+ .select({
+ trainingId: Trainings.trainingId,
+ title: Trainings.title,
+ description: Trainings.description,
+ startDate: Trainings.startDate,
+ duration: Trainings.duration,
+ status: Trainings.status,
+ headId: Trainings.headId,
+ chiefJudge: Trainings.chiefJudge,
+ deleted: Trainings.deleted,
+ })
+ .from(Trainings)
+ .where(eq(Trainings.trainingId, trainingId))
+ .execute();
+
+ return {
+ ...data[0],
+ startDate: new Date(data[0].startDate), // Convert string to Date
+ } as TrainingEdit;
+
+ } catch (error) {
+ console.error("Error fetching training:", error);
+ return null;
+ }
+});
+
+/**
+ * Fetches user permissions for editing training.
+ * @param trainingId - The ID of the training.
+ * @returns {Promise} - Returns true if the user has permission to edit training, false otherwise.
+ */
+export const getUserEditTrainingPermissions = cache(async (trainingId: number) => {
+ try {
+ console.log("Fetching user permissions for editing training...");
+ const user = await getUserData();
+ if (!user) {
+ console.error("User not authenticated");
+ return null;
+ }
+ const {userId} = user;
+
+ const permissions = await getUserTrainingPermissions(userId, trainingId);
+ if (!permissions) {
+ console.error("Failed to fetch user permissions");
+ return null;
+ }
+
+ // Check if the user has permission to edit training
+ if (!permissions.includes("Edit:training")) {
+ console.error("User does not have permission to edit training");
+ return false;
+ }
+
+ return true;
+ } catch (error) {
+ console.error("Error fetching permissions:", error);
+ return null;
+ }
+});
+
+/**
+ * Updates a training in the database.
+ * @param trainingId - The ID of the training.
+ * @param data - The training data to update.
+ *
+ * @Returns {Promise} - Returns null if an error occurs.
+ */
+export async function updateTraining({trainingId, ...data}: TrainingFormData & {
+ trainingId: number
+}) {
+ console.log("Updating training with ID:", trainingId);
+ const { title, description, startDate: startDateStr, duration, status } = data;
+
+ try {
+ const user = await getUserData();
+ if (!user) {
+ throw new Error("User not authenticated");
+ }
+ const permissions = await getUserTrainingPermissions(user.userId, trainingId);
+ if (!permissions.includes("Edit:training")) {
+ throw new Error("User does not have permission to edit training");
+ }
+
+ const startDate = startDateStr.toISOString().split('T')[0];
+
+ await db
+ .update(Trainings)
+ .set({
+ title,
+ description,
+ startDate,
+ duration,
+ status
+ })
+ .where(
+ and(
+ eq(Trainings.trainingId, trainingId),
+ isNull(Trainings.deleted)
+ )
+ )
+ .execute();
+ } catch (error) {
+ console.error("Error updating training:", error);
+ throw error
+ }
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/staff/edit-training/page.tsx b/src/app/protected/trainings/[trainingId]/staff/edit-training/page.tsx
new file mode 100644
index 00000000..0a3929f5
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/edit-training/page.tsx
@@ -0,0 +1,44 @@
+import TrainingForm from "@/app/protected/trainings/[trainingId]/staff/edit-training/_trainingForm";
+import {
+ getTraining,
+ getUserEditTrainingPermissions
+} from "@/app/protected/trainings/[trainingId]/staff/edit-training/actions/_editTraining";
+import "@/styles/components/block.css"
+
+/**
+ * Page component for editing a training.
+ * @param params - The parameters containing the training ID.
+ */
+export default async function EditTrainingPage({params}: { params: Promise<{ trainingId: string }> }) {
+ // Parse training data from params
+ const { trainingId } = await params;
+ const trainingIdNumber = Number(trainingId);
+
+ // Check if the parameter is a valid number
+ if (isNaN(trainingIdNumber)) throw new Error("Invalid training ID");
+
+ // Fetch the training data
+ const training = await getTraining(trainingIdNumber);
+
+ // Check if the training data is null
+ if (training === null) {
+ console.error("Training not found or user doesn't have permission");
+ return null;
+ }
+
+ // check if the user has permission to edit the training
+ const hasEditPermission = await getUserEditTrainingPermissions(trainingIdNumber);
+ if (!hasEditPermission) {
+ console.error("User does not have permission to edit training");
+ return null;
+ }
+
+ return (
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/staff/materials/actions/__tests__/_editBlock.test.ts b/src/app/protected/trainings/[trainingId]/staff/materials/actions/__tests__/_editBlock.test.ts
new file mode 100644
index 00000000..b8b26d33
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/materials/actions/__tests__/_editBlock.test.ts
@@ -0,0 +1,23 @@
+// create a function for updateMaterialBlock action
+import { encryptSession } from '@/lib/session';
+import { updateMaterialBlock } from '../_editBlock';
+import { updateMaterial } from '../_updateMaterial';
+
+describe('vaildation testing', () => {
+ it('should return true for valid data', () => {
+ const data = {
+ title: 'Test Title',
+ description: 'Test Description',
+ url : 'https://example.com',
+ };
+
+ const valid_user = encryptSession({
+ userId: '123',
+ username: 'testuser',
+ role: 'admin',
+ });
+ updateMaterial(data);
+
+
+
+})
diff --git a/src/app/protected/trainings/[trainingId]/staff/materials/actions/_updateMaterial.ts b/src/app/protected/trainings/[trainingId]/staff/materials/actions/_updateMaterial.ts
new file mode 100644
index 00000000..2637a30b
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/materials/actions/_updateMaterial.ts
@@ -0,0 +1,79 @@
+"use server";
+import "server-only";
+import { db } from "@/lib/db";
+import { Blocks } from "@/lib/db/schema/training/Blocks";
+import { getUserTrainingPermissions } from "@/lib/permissions/getUserTrainingPermissions";
+import { getUserData } from "@/lib/session";
+import { type Material } from "@/lib/types/Training";
+import { and, eq, isNull } from "drizzle-orm";
+import { updateMaterialSchema } from "@/lib/validation/training/updateMaterial";
+import { z } from "zod";
+
+const inputSchema = z.object({
+ trainingId: z.number().int(),
+ blockNumber: z.number().int(),
+ newMaterials: updateMaterialSchema,
+});
+export async function updateMaterial(input: {
+ trainingId: number;
+ blockNumber: number;
+ newMaterials: Material[];
+}) {
+ try {
+ const userData = await getUserData();
+ const { trainingId, blockNumber, newMaterials } = inputSchema.parse(input);
+ if (!userData) {
+ return { success: false, error: "User not logged in" };
+ }
+
+ const userId = userData.userId;
+ if (isNaN(trainingId)) {
+ return { success: false, error: "Invalid trainingId" };
+ }
+
+ const userPermissions = await getUserTrainingPermissions(
+ userId,
+ trainingId,
+ );
+
+ if (!userPermissions.includes("Edit:material")) {
+ return { success: false, error: "Permission denied" };
+ }
+ const blocks = await db
+ .select({})
+ .from(Blocks)
+ .where(
+ and(
+ eq(Blocks.blockNumber, blockNumber),
+ isNull(Blocks.deleted),
+ eq(Blocks.trainingId, trainingId),
+ ),
+ )
+ .execute();
+
+ if (blocks.length === 0) {
+ return { success: false, error: "Block not found" };
+ }
+ await db
+ .update(Blocks)
+ .set({
+ material: newMaterials,
+ })
+ .where(
+ and(
+ eq(Blocks.blockNumber, blockNumber),
+ eq(Blocks.trainingId, trainingId),
+ isNull(Blocks.deleted),
+ ),
+ )
+ .execute();
+ return { success: true };
+ } catch (error) {
+ if (error instanceof z.ZodError) {
+ return { success: false, error: "Validation error" };
+ }
+
+ console.error("Error editing material:", error); // don't remove
+ return { success: false, error: "server error unkown" };
+ }
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/materials/edit-materials/[blockId]/page.tsx b/src/app/protected/trainings/[trainingId]/staff/materials/edit-materials/[blockId]/page.tsx
new file mode 100644
index 00000000..d166921e
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/materials/edit-materials/[blockId]/page.tsx
@@ -0,0 +1,188 @@
+"use client";
+import { redirect, useParams } from "next/navigation";
+import { Material } from "@/lib/types/training";
+import { startTransition, useState } from "react";
+import { Button } from "@/components/ui/button";
+import { updateMaterial } from "../../actions/_updateMaterial";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+import { Input } from "@/components/ui/input";
+import { Textarea } from "@/components/ui/textarea";
+import { PlusCircle, Trash2 } from "lucide-react";
+import { useToast } from "@/hooks/use-toast";
+import { updateMaterialSchema } from "@/lib/validation/training/updateMaterial";
+
+export default function Page() {
+ const urlparams = useParams();
+ const trainingId = Number(urlparams.trainingId);
+ const blockId = Number(urlparams.blockId);
+
+ if (isNaN(trainingId) || isNaN(blockId)) {
+ redirect("not-found");
+ }
+
+ if (window === undefined) {
+ return;
+ }
+ const materialData = JSON.parse(
+ localStorage.getItem(blockId.toString()) ?? "[]",
+ ) as Material[];
+
+
+ return (
+
+
+
+ );
+}
+
+function DynamicForm({
+ materialData,
+ trainingId,
+ blockNumber,
+}: {
+ materialData: Material[];
+ trainingId: number;
+ blockNumber: number;
+}) {
+ const { toast } = useToast();
+ const [entries, setEntries] = useState(materialData ?? []);
+ const addEntry = () => {
+ setEntries([...entries, { title: "", link: "", des: "" }]);
+ };
+
+ const updateEntry = (
+ index: number,
+ field: "link" | "title" | "des",
+ value: string,
+ ) => {
+ const newEntries = [...entries];
+ newEntries[index][field] = value;
+ setEntries(newEntries);
+ };
+
+ const deleteEntry = (index: number) => {
+ const newEntries = [...entries];
+ newEntries.splice(index, 1);
+ setEntries(newEntries);
+ };
+
+ return (
+
+
+ Edit Training Materials
+ Add or modify materials for this training block
+
+
+ {entries.map((entry, index) => (
+
+
+
+
Material {index + 1}
+ deleteEntry(index)}
+ className="text-destructive hover:text-destructive/90"
+ >
+
+
+
+
+
+ Title
+ updateEntry(index, "title", e.target.value)}
+ />
+
+
+ Link
+ updateEntry(index, "link", e.target.value)}
+ />
+
+
+ Description
+ updateEntry(index, "des", e.target.value)}
+ />
+
+
+
+
+ ))}
+
+
+
+ {
+ const {
+ data: newMaterials,
+ success,
+ error: err,
+ } = updateMaterialSchema.safeParse(entries);
+ if (!success) {
+ toast({
+ variant: "destructive",
+ title: "Validation Error",
+ description: err.errors[0].message,
+ });
+ return;
+ }
+ startTransition(async () => {
+ const res = await updateMaterial({
+ blockNumber,
+ trainingId,
+ newMaterials,
+ });
+ console.log(res);
+ if (res.success) {
+ localStorage.setItem(
+ blockNumber.toString(),
+ JSON.stringify(newMaterials),
+ );
+ toast({
+ title: "Success",
+ description: "Materials updated successfully",
+ });
+ } else {
+ toast({
+ variant: "destructive",
+ title: "Error",
+ description: res.error,
+ });
+ }
+ });
+ }}
+ className="w-full"
+ >
+ Save Changes
+
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/materials/page.tsx b/src/app/protected/trainings/[trainingId]/staff/materials/page.tsx
new file mode 100644
index 00000000..64d67557
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/materials/page.tsx
@@ -0,0 +1,114 @@
+import { Button } from "@/components/ui/button";
+import AddToLocalStorage from "@/components/util/AddToLocalStorage";
+import { db } from "@/lib/db";
+import { Blocks } from "@/lib/db/schema/training/Blocks";
+import { eq } from "drizzle-orm";
+import Link from "next/link";
+import { redirect } from "next/navigation";
+import "server-only";
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/components/ui/table";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+import { Badge } from "@/components/ui/badge";
+
+export default async function Page({
+ params,
+}: {
+ params: Promise<{ trainingId: string }>;
+}) {
+ const { trainingId: trainingIdStr } = await params;
+ const trainingId = Number(trainingIdStr);
+
+ if (isNaN(trainingId)) {
+ redirect("not-found");
+ }
+
+ const materials = await db
+ .select({
+ material: Blocks.material,
+ blockNumber: Blocks.blockNumber,
+ deleted: Blocks.deleted,
+ title: Blocks.title,
+ })
+ .from(Blocks)
+ .where(eq(Blocks.trainingId, trainingId))
+ .orderBy(Blocks.blockNumber);
+
+ return (
+
+
+
+ Training Materials
+ Manage and view all training materials
+
+
+
+
+
+ Material Title
+ Block Number
+ Status
+ Material Details
+ Actions
+
+
+
+ {materials.map(({ blockNumber, deleted, title, material }) => (
+
+
+ {title}
+ Block {blockNumber}
+
+
+ {deleted ? "Deleted" : "Active"}
+
+
+
+
+ {material.map(({ title, link, des }, index) => (
+
+
+
+
Material {index + 1}
+
{title}
+
+ {link}
+
+
{des}
+
+
+
+ ))}
+
+
+
+
+
+ Update Block
+
+
+
+
+ ))}
+
+
+
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/staff-management/_AddStaffForm.tsx b/src/app/protected/trainings/[trainingId]/staff/staff-management/_AddStaffForm.tsx
new file mode 100644
index 00000000..9bec2776
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/staff-management/_AddStaffForm.tsx
@@ -0,0 +1,121 @@
+'use client';
+
+import React, { useState, useTransition } from 'react';
+import { addStaffAction } from '@/app/protected/trainings/[trainingId]/staff/staff-management/actions';
+import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
+import { Input } from '@/components/ui/input';
+import { Checkbox } from '@/components/ui/checkbox';
+import { Button } from '@/components/ui/button';
+import { Label } from '@/components/ui/label';
+
+export default function AddStaffForm({ trainingId }: { trainingId: number }) {
+ const [username, setUsername] = useState('');
+ const [roles, setRoles] = useState({
+ instructor: false,
+ problem_setter: false,
+ mentor: false
+ });
+ const [message, setMessage] = useState('');
+
+ const [isPending, startTransition] = useTransition();
+
+ async function handleSubmit(e: React.FormEvent) {
+ e.preventDefault();
+ startTransition(async () => {
+ setMessage('');
+
+ try {
+ await addStaffAction({
+ trainingId,
+ username,
+ roles
+ });
+
+ setMessage('Staff added successfully');
+ setUsername('');
+ setRoles({ instructor: false, problem_setter: false, mentor: false });
+ } catch (error) {
+ if (error instanceof Error) {
+ setMessage('Error occurred: ' + error.message);
+ } else {
+ setMessage('An unknown error occurred');
+ }
+ }
+ });
+ }
+
+ function handleRoleChangeByName(role: keyof typeof roles, checked: boolean) {
+ setRoles(prev => ({ ...prev, [role]: checked }));
+ }
+
+ return (
+
+
+ Add Staff to Training
+
+
+
+
+ Username
+ setUsername(e.target.value)}
+ required
+ placeholder="Enter username"
+ />
+
+
+
Roles
+
+
+ handleRoleChangeByName('instructor', Boolean(checked))}
+ />
+ Instructor
+
+
+ handleRoleChangeByName('problem_setter', Boolean(checked))}
+ />
+ Problem Setter
+
+
+ handleRoleChangeByName('mentor', Boolean(checked))}
+ />
+ Mentor
+
+
+
+
+ {isPending ? 'Adding...' : 'Add Staff'}
+
+
+
+ {message && (
+
+ {message}
+
+ )}
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/staff-management/_SearchUser.tsx b/src/app/protected/trainings/[trainingId]/staff/staff-management/_SearchUser.tsx
new file mode 100644
index 00000000..519b256c
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/staff-management/_SearchUser.tsx
@@ -0,0 +1,100 @@
+'use client';
+
+import React, { useState, useTransition } from 'react';
+import { searchByUsername } from "@/app/protected/trainings/[trainingId]/staff/staff-management/actions";
+import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
+import { Input } from '@/components/ui/input';
+import { Button } from '@/components/ui/button';
+import { Label } from '@/components/ui/label';
+// import { Staff } from "@/lib/db/schema/training/Staff"; // Unused, remove
+
+export default function SearchUser({ trainingId }: { trainingId: number }) {
+ const [username, setUsername] = useState('');
+ const [searchResults, setSearchResults] = useState>>([]);
+ const [error, setError] = useState('');
+ const [isPending, startTransition] = useTransition();
+
+
+ function handleSearch(e: React.FormEvent) {
+ e.preventDefault();
+ setError('');
+ setSearchResults([]);
+ startTransition(async () => {
+ try {
+ const res = await searchByUsername(username, trainingId);
+ setSearchResults(res);
+ } catch (err: unknown) {
+ if (err instanceof Error) {
+ setError('Error occurred: ' + err.message);
+ } else {
+ setError('An unknown error occurred.');
+ }
+ }
+ });
+ }
+
+ return (
+
+
+ Search User
+
+
+
+
+
+ Username
+ setUsername(e.target.value)}
+ required
+ placeholder="Enter username"
+ />
+
+
+ {isPending ? 'Searching...' : 'Search'}
+
+
+
+ {error && (
+
+ {error}
+
+ )}
+ {searchResults && (
+
+
Search Results:
+ {searchResults.length === 0 ? (
+
No users found
+ ) : (
+
+ {searchResults.map((result, index) => (
+
+
+
Username: {result.username}
+
+
+
Staff Roles:
+
+ {(result.instructor || result.problemSetter || result.mentor) ? (
+ <>
+ {result.instructor && Instructor }
+ {result.problemSetter && Problem Setter }
+ {result.mentor && Mentor }
+ >
+ ) : (
+ Not a staff member for this training
+ )}
+
+
+
+ ))}
+
+ )}
+
+ )}
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/staff-management/_StaffTabs.tsx b/src/app/protected/trainings/[trainingId]/staff/staff-management/_StaffTabs.tsx
new file mode 100644
index 00000000..0ed26fec
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/staff-management/_StaffTabs.tsx
@@ -0,0 +1,159 @@
+"use client";
+
+import { useState, useTransition } from "react";
+import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs";
+import { Button } from "@/components/ui/button";
+import AddStaffForm from "./_AddStaffForm";
+import SearchUser from "./_SearchUser";
+import TrainingStaffList from "./_TrainingStaffList";
+import { updateStaff, deleteStaff, searchByUsername } from "./actions";
+import { useRouter } from "next/navigation";
+
+// Use the correct type for staffList
+export default function StaffTabs({ trainingId, staffList }: { trainingId: number; staffList: Awaited> }) {
+ const [activeTab, setActiveTab] = useState("add");
+ const [updateUsername, setUpdateUsername] = useState("");
+ const [updateResult, setUpdateResult] = useState>[0] | null>(null);
+ const [updateRoles, setUpdateRoles] = useState({ instructor: false, problem_setter: false, mentor: false });
+ const [updateError, setUpdateError] = useState("");
+ const [updateSuccess, setUpdateSuccess] = useState("");
+
+ const [isPending, startTransition] = useTransition();
+ const router = useRouter();
+
+ async function handleUpdateSearch(e: React.FormEvent) {
+ e.preventDefault();
+ setUpdateError("");
+ setUpdateSuccess("");
+ setUpdateResult(null);
+ try {
+ const res = await searchByUsername(updateUsername, trainingId);
+ if (res.length === 0) {
+ setUpdateError("User not found");
+ return;
+ }
+ setUpdateResult(res[0]);
+ setUpdateRoles({
+ instructor: !!res[0].instructor,
+ problem_setter: !!res[0].problemSetter,
+ mentor: !!res[0].mentor,
+ });
+ } catch (err: unknown) {
+ setUpdateError(err instanceof Error ? err.message : "Unknown error");
+ }
+ }
+
+ async function handleUpdateSubmit(e: React.FormEvent) {
+ e.preventDefault();
+ startTransition(async () => {
+ setUpdateError("");
+ setUpdateSuccess("");
+ try {
+ await updateStaff({
+ trainingId,
+ username: updateUsername,
+ roles: updateRoles,
+ });
+ setUpdateSuccess("Staff roles updated successfully");
+ router.refresh();
+ } catch (err: unknown) {
+ setUpdateError(err instanceof Error ? err.message : "Unknown error");
+ }
+ });
+
+ }
+
+ async function handleDelete(username: string) {
+ if (!window.confirm(`Are you sure you want to delete staff: ${username}?`)) return;
+ startTransition(async () => {
+ try {
+ await deleteStaff({ trainingId, username });
+ router.refresh();
+ } catch (err: unknown) {
+ alert(err instanceof Error ? err.message : "Failed to delete staff");
+ }
+ });
+ }
+
+ return (
+
+
+
+ Add Staff
+ Search User
+ Staff List
+ Update Staff
+
+
+
+
+
+
+
+
+
+ ({
+ username: s.username,
+ instructor: s.instructor ?? false,
+ problemSetter: s.problemSetter ?? false,
+ mentor: s.mentor ?? false,
+ }))}
+ onDelete={handleDelete}
+ />
+
+
+
+
+ Username
+ setUpdateUsername(e.target.value)}
+ required
+ placeholder="Enter username"
+ className="w-full border rounded px-2 py-1"
+ />
+
+ Search
+
+ {updateError && {updateError}
}
+ {updateSuccess && {updateSuccess}
}
+ {updateResult && (
+
+
+
+ setUpdateRoles(r => ({ ...r, instructor: e.target.checked }))}
+ />
+ Instructor
+
+
+ setUpdateRoles(r => ({ ...r, problem_setter: e.target.checked }))}
+ />
+ Problem Setter
+
+
+ setUpdateRoles(r => ({ ...r, mentor: e.target.checked }))}
+ />
+ Mentor
+
+
+
+ {isPending ? "Updating..." : "Update Staff Roles"}
+
+
+ )}
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/protected/trainings/[trainingId]/staff/staff-management/_TrainingStaffList.tsx b/src/app/protected/trainings/[trainingId]/staff/staff-management/_TrainingStaffList.tsx
new file mode 100644
index 00000000..ce89a1ff
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/staff-management/_TrainingStaffList.tsx
@@ -0,0 +1,121 @@
+"use client";
+
+import React from "react";
+import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
+import {
+ Table,
+ TableHeader,
+ TableBody,
+ TableRow,
+ TableHead,
+ TableCell,
+} from "@/components/ui/table";
+import { Button } from "@/components/ui/button";
+
+export default function TrainingStaffList({
+ staffList,
+ onDelete,
+}: {
+ staffList: {
+ username: string;
+ instructor: boolean;
+ problemSetter: boolean;
+ mentor: boolean;
+ }[];
+ onDelete?: (username: string) => void;
+}) {
+ // TODO: Replace 'any' with the correct type for the API response if available
+
+ return (
+
+
+ Training Staff
+
+
+ {staffList.length === 0 ? (
+
+
No staff found for this training.
+
+ ) : (
+
+
+
+
+ Username
+ Instructor
+ Problem Setter
+ Mentor
+ Actions
+
+
+
+ {staffList.map((staff) => (
+
+ {staff.username}
+
+
+ {staff.instructor ? "Yes" : "No"}
+
+
+
+
+ {staff.problemSetter ? "Yes" : "No"}
+
+
+
+
+ {staff.mentor ? "Yes" : "No"}
+
+
+
+ {onDelete && (
+ onDelete(staff.username)}
+ >
+ Delete
+
+ )}
+
+
+ ))}
+
+
+
+ )}
+
+
+ );
+}
diff --git a/src/app/protected/trainings/[trainingId]/staff/staff-management/actions.ts b/src/app/protected/trainings/[trainingId]/staff/staff-management/actions.ts
new file mode 100644
index 00000000..6c58a84c
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/staff-management/actions.ts
@@ -0,0 +1,178 @@
+"use server";
+
+import { db } from "@/lib/db";
+import { Staff } from "@/lib/db/schema/training/Staff";
+import {getUserData} from "@/lib/session";
+import {Users} from "@/lib/db/schema/user/Users";
+import {eq, and } from "drizzle-orm";
+
+import { z } from 'zod';
+import { revalidatePath } from "next/cache";
+
+const addStaffSchema = z.object({
+ trainingId: z.coerce.number().int().positive(),
+ username: z.string().min(1, 'User ID is required'),
+ roles: z.object({
+ instructor: z.boolean(),
+ problem_setter: z.boolean(),
+ mentor: z.boolean(),
+ })
+});
+
+const deleteStaffSchema = z.object({
+ trainingId: z.coerce.number().int().positive(),
+ username: z.string().min(1, 'User ID is required'),
+})
+const searchByUsernameSchema = z.object({
+ username: z.string().min(3, 'Username is required'),
+ trainingId: z.coerce.number().int().positive(),
+
+});
+
+const updateStaffSchema = z.object({
+ trainingId: z.coerce.number().int().positive(),
+ username: z.string().min(1, 'User ID is required'),
+ roles: z.object({
+ instructor: z.boolean(),
+ problem_setter: z.boolean(),
+ mentor: z.boolean(),
+ })
+});
+
+export async function addStaffAction({
+ trainingId,
+ username,
+ roles,
+}: {
+ trainingId: string | number;
+ username: string;
+ roles: { instructor: boolean; problem_setter: boolean; mentor: boolean };
+}) {
+ const parseResult = addStaffSchema.safeParse({ trainingId, username, roles });
+ if (!parseResult.success) {
+ const errorMessages = parseResult.error.errors.map(error => error.message).join(', ');
+ throw new Error(errorMessages);
+ }
+ try {
+ const res = await db.select({userId: Users.userId}).from(Users).where(eq(Users.username, username)).execute()
+ if (res.length === 0) throw new Error('User not found');
+ const insertData = {
+ trainingId: Number(trainingId),
+ userId : res[0].userId,
+ instructor: roles.instructor,
+ problemSetter: roles.problem_setter,
+ mentor: roles.mentor,
+ } satisfies typeof Staff.$inferInsert;
+ await db.insert(Staff).values(insertData).execute();
+ revalidatePath(`/protected/trainings/${trainingId}/staff/staff-management`);
+ } catch (error) {
+ console.error("Error adding staff:", error);
+ throw new Error("Failed to add staff");
+ }
+}
+
+export async function searchByUsername(username: string, trainingId: number) {
+ const parseResult = searchByUsernameSchema.safeParse({ username, trainingId });
+ if (!parseResult.success) {
+ throw Error(parseResult.error.errors[0].message);
+ }
+ try {
+ const userData = await getUserData();
+
+ if (userData == null || userData.role !== "admin") {
+ throw Error("Unauthorized access");
+ }
+ const staff = await db
+ .select({
+ username: Users.username,
+ instructor: Staff.instructor,
+ problemSetter: Staff.problemSetter,
+ mentor: Staff.mentor,
+ })
+ .from(Users)
+ .where(eq(Users.username, username))
+ .leftJoin(Staff, and(
+ eq(Staff.userId, Users.userId),
+ eq(Staff.trainingId, trainingId)
+ ))
+ .execute();
+ //
+ revalidatePath(`protected/trainings/${trainingId}/staff/edit-training/add-staff`)
+ return staff;
+ } catch (error) {
+ console.error("Error searching by username:", error);
+ throw Error("Error occurred while searching for user");
+ }
+}
+
+export async function deleteStaff({
+ trainingId,
+ username,
+}: {
+ trainingId: string | number;
+ username: string;
+}) {
+ const parseResult = deleteStaffSchema.safeParse({ trainingId, username });
+ if (!parseResult.success) {
+ throw new Error(parseResult.error.errors[0].message);
+ }
+ try {
+ const res = await db.select({userId: Users.userId}).from(Users).where(eq(Users.username, username)).execute()
+ if (res.length === 0) throw new Error('User not found');
+
+ await db
+ .update(Staff)
+ .set({ deleted: new Date() })
+ .where(
+ and(
+ eq(Staff.userId, res[0].userId),
+ eq(Staff.trainingId, Number(trainingId))
+ )
+ )
+ .execute();
+
+ revalidatePath(`/protected/trainings/${trainingId}/staff/staff-management`);
+ } catch (error) {
+ console.error("Error deleting staff:", error);
+ throw new Error("Failed to delete staff");
+ }
+}
+
+export async function updateStaff({
+ trainingId,
+ username,
+ roles,
+}: {
+ trainingId: string | number;
+ username: string;
+ roles: { instructor: boolean; problem_setter: boolean; mentor: boolean };
+}) {
+ const parseResult = updateStaffSchema.safeParse({ trainingId, username, roles });
+ if (!parseResult.success) {
+ throw new Error(parseResult.error.errors[0].message);
+ }
+ try {
+ const res = await db.select({userId: Users.userId}).from(Users).where(eq(Users.username, username)).execute();
+ if (res.length === 0) throw new Error('User not found');
+ await db
+ .update(Staff)
+ .set({
+ instructor: roles.instructor,
+ problemSetter: roles.problem_setter,
+ mentor: roles.mentor,
+ deleted: null // In case you want to "undelete" a staff member
+ })
+ .where(
+ and(
+ eq(Staff.userId, res[0].userId),
+ eq(Staff.trainingId, Number(trainingId))
+ )
+ )
+ .execute();
+ revalidatePath(`/protected/trainings/${trainingId}/staff/staff-management`);
+ } catch (error) {
+ console.error("Error updating staff:", error);
+ throw new Error("Failed to update staff");
+ }
+}
+
diff --git a/src/app/protected/trainings/[trainingId]/staff/staff-management/page.tsx b/src/app/protected/trainings/[trainingId]/staff/staff-management/page.tsx
new file mode 100644
index 00000000..ecfb2dcb
--- /dev/null
+++ b/src/app/protected/trainings/[trainingId]/staff/staff-management/page.tsx
@@ -0,0 +1,64 @@
+import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
+import StaffTabs from "./_StaffTabs";
+import { db } from "@/lib/db";
+import { Staff } from "@/lib/db/schema/training/Staff";
+import { Users } from "@/lib/db/schema/user/Users";
+import { eq } from "drizzle-orm";
+import { z } from "zod";
+
+export default async function StaffManagementPage({
+ params,
+}: {
+ params: Promise<{ trainingId: string }>;
+}) {
+ const { trainingId } = await params;
+ if (typeof trainingId === "undefined") return;
+
+
+ const staffList = await getAllTrainingStaff(trainingId);
+
+ return (
+
+
+
+
+
+ Staff Management
+
+
+
+
+
+
+
+
+ );
+}
+
+const getAllTrainingStaffSchema = z.object({
+ trainingId: z.string().regex(/^\d+$/, "Invalid training ID"),
+});
+
+async function getAllTrainingStaff(trainingId: string) {
+ const parseResult = getAllTrainingStaffSchema.safeParse({ trainingId });
+ if (!parseResult.success) {
+ throw Error(parseResult.error.errors[0].message);
+ }
+ try {
+ const staff = await db
+ .select({
+ username: Users.username,
+ instructor: Staff.instructor,
+ problemSetter: Staff.problemSetter,
+ mentor: Staff.mentor,
+ })
+ .from(Staff)
+ .where(eq(Staff.trainingId, Number(trainingId)))
+ .innerJoin(Users, eq(Users.userId, Staff.userId))
+ .execute();
+ return staff;
+ } catch (error) {
+ console.error("Error fetching training staff:", error);
+ throw Error("Failed to fetch training staff");
+ }
+}
diff --git a/src/app/protected/trainings/page.tsx b/src/app/protected/trainings/page.tsx
new file mode 100644
index 00000000..65c15bf3
--- /dev/null
+++ b/src/app/protected/trainings/page.tsx
@@ -0,0 +1,88 @@
+import { db } from "@/lib/db";
+import { Trainings } from "@/lib/db/schema/training/Trainings";
+import { Trainees } from "@/lib/db/schema/training/Trainees";
+import { getUserData } from "@/lib/session";
+import { eq, isNull, and } from "drizzle-orm";
+import TrainingsTabs from "./TrainingsTabs";
+
+export default async function TrainingsPage() {
+ const userData = await getUserData();
+ const isAdminOrStaff = userData && (userData.role === 'admin' || userData.role === 'staff');
+
+ // My trainings
+ let myTrainings: {
+ trainingId: number,
+ title: string,
+ description: string,
+ startDate: string
+ duration: number,
+ status: string,
+ }[] = [];
+
+ if (userData) {
+ myTrainings = await db
+ .select({
+ trainingId: Trainings.trainingId,
+ title: Trainings.title,
+ description: Trainings.description,
+ startDate: Trainings.startDate,
+ duration: Trainings.duration,
+ status: Trainings.status,
+ })
+ .from(Trainings)
+ .innerJoin(Trainees, eq(Trainings.trainingId, Trainees.trainingId))
+ .where(eq(Trainees.userId, userData.userId))
+ .execute();
+ }
+
+ // All trainings
+ let allTrainings: {
+ trainingId: number,
+ title: string,
+ description: string,
+ startDate: string
+ duration: number,
+ status: string,
+
+ }[] = [];
+
+ if (isAdminOrStaff) {
+ allTrainings = await db
+ .select({
+ trainingId: Trainings.trainingId,
+ title: Trainings.title,
+ description: Trainings.description,
+ startDate: Trainings.startDate,
+ duration: Trainings.duration,
+ status: Trainings.status,
+ })
+ .from(Trainings)
+ .where(isNull(Trainings.deleted))
+ .execute();
+ } else {
+ allTrainings = await db
+ .select({
+ trainingId: Trainings.trainingId,
+ title: Trainings.title,
+ description: Trainings.description,
+ startDate: Trainings.startDate,
+ duration: Trainings.duration,
+ status: Trainings.status,
+ })
+ .from(Trainings)
+ .where(and(isNull(Trainings.deleted), eq(Trainings.status, 'active')))
+ .execute();
+ }
+
+ // Get enrolled training IDs for the user
+ const enrolledIds = myTrainings.map((t) => t.trainingId);
+
+ return (
+
+ );
+}
diff --git a/src/app/register/page.tsx b/src/app/register/page.tsx
index c5db8742..d593d39d 100644
--- a/src/app/register/page.tsx
+++ b/src/app/register/page.tsx
@@ -1,8 +1,7 @@
"use client";
-import expectedBody from "@/app/api/auth/register/expectedBody";
+import { userRegisterValid } from "@/lib/validation/userValidations";
import { useState } from "react";
import Link from "next/link";
-import { useRouter } from "next/navigation";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
@@ -18,30 +17,38 @@ import {
FormMessage,
} from "@/components/ui/form";
import { Card } from "@/components/ui/card";
+import { useRouter } from "next/navigation";
+import { XCircle, CheckCircle } from "lucide-react";
+import "@/styles/components/auth/auth.css";
-export default function RegisterPage() {
+export default function Page() {
+ const router = useRouter();
const [error, setError] = useState("");
const [success, setSuccess] = useState("");
- const router = useRouter();
- const form = useForm>({
- resolver: zodResolver(expectedBody),
+ const [termsAccepted, setTermsAccepted] = useState(false);
+ const [loading, setLoading] = useState(false);
+ const form = useForm>({
+ resolver: zodResolver(userRegisterValid),
defaultValues: {
username: "",
+ gmail: "",
+ cfHandle: "",
+ phoneNumber: "",
+ password: "",
+ confirmPassword: "",
},
});
-
-
return (
-
-
- Create Account
-
+
);
- async function onSubmit(data: z.infer) {
- setError("");
- setSuccess("");
-
+ async function onSubmit(data: z.infer) {
+ setLoading(true);
fetch("/api/auth/register", {
method: "POST",
headers: {
@@ -145,21 +234,24 @@ export default function RegisterPage() {
},
body: JSON.stringify(data),
})
- .catch((err) => {
- setError(err instanceof Error ? err.message : "Something went wrong");
- })
.then(async (response) => {
- if (!response) return;
-
- const result = await response.json();
- if (!response.ok) {
- setError(result.error || "Failed to register");
- return;
+ const res = await response.json();
+ console.log(res);
+ setLoading(false);
+ if ("err" in res) return setError(res.err);
+ else if ("msg" in res) {
+ setSuccess(res.msg);
+ setTimeout(() => {
+ router.push("/login");
+ }, 2000);
}
- setSuccess("Account created successfully! Redirecting to profile...");
- setTimeout(() => {
- router.push("/profile");
- }, 2000);
+ })
+ .catch(async (err) => {
+ const res = await err.json();
+ console.log(res);
+ setLoading(false);
+ if ("err" in res) return setError(res.err);
+ else if ("msg" in res) return setSuccess(res.msg);
});
}
}
diff --git a/src/app/reset-password/page.tsx b/src/app/reset-password/page.tsx
new file mode 100644
index 00000000..08ba4080
--- /dev/null
+++ b/src/app/reset-password/page.tsx
@@ -0,0 +1,106 @@
+"use client";
+import { Button } from "@/components/ui/button";
+import { Card } from "@/components/ui/card";
+import {
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+ Form,
+} from "@/components/ui/form";
+import { Input } from "@/components/ui/input";
+import { gmail } from "@/lib/validation/util";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { useState } from "react";
+import { useForm } from "react-hook-form";
+import { z } from "zod";
+
+const validationSchema = z.object({
+ gmail,
+});
+
+export default function Page() {
+ const form = useForm>({
+ resolver: zodResolver(validationSchema),
+ defaultValues: {
+ gmail: "",
+ },
+ });
+ const [error, setError] = useState("");
+ const [success, setSuccess] = useState("");
+ const [loading, setLoading] = useState(false);
+ return (
+
+
+ Welcome Back
+
+ Please enter your credentials to continue
+
+
+
+ (
+
+ Gmail
+
+
+
+
+ enter your gmail to reset your password
+
+
+
+ )}
+ />
+
+ {loading ? "Loading..." : "Send Reset Link"}
+
+
+ {error && (
+
+ {error}
+
+ )}
+ {success && (
+ {success}
+ )}
+
+
+
+
+ );
+
+ async function onSubmit(data: z.infer) {
+ setLoading(true);
+ fetch("/api/auth/reset-password", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(data),
+ })
+ .then(async (response) => {
+ const res = await response.json();
+ setLoading(false);
+ if ("err" in res) return setError(res.err);
+ else if ("msg" in res) setSuccess(res.msg);
+ })
+ .catch(async (err) => {
+ setLoading(false);
+ const res = await err.json();
+ setError(res.err);
+ });
+ }
+}
diff --git a/src/app/virtual-mentor/actions.ts b/src/app/virtual-mentor/actions.ts
new file mode 100644
index 00000000..8c4d752d
--- /dev/null
+++ b/src/app/virtual-mentor/actions.ts
@@ -0,0 +1,131 @@
+"use server";
+
+export async function getVirtualMentorReply(_prevState: { reply: string | null; error: string | null }, form: FormData) {
+ try {
+ const messagesRaw = form.get('messages');
+ const message = form.get('message'); // This is the user message sent as a hidden input
+ const apiKey = process.env.GEMINI_API_KEY;
+ if (!apiKey) throw new Error("Gemini API key not set");
+
+ // Parse previous messages
+ let messages: { role: string; content: string }[] = [];
+ if (typeof messagesRaw === 'string') {
+ try {
+ messages = JSON.parse(messagesRaw);
+ } catch (__unused) {
+ // ignore, fallback to empty
+ console.log(__unused)
+ }
+ }
+
+ // Add the new user message
+ if (typeof message === 'string' && message.trim()) {
+ messages.push({ role: 'user', content: message });
+ }
+
+ // System prompt (same as before)
+ const systemPrompt = `### 🧠 Virtual Mentor Behavior Rules
+
+These are the core behavior rules you must follow when helping users:
+
+1. **No Full Solutions**
+ - Never provide full code or exact answers.
+ - Only offer hints, helpful suggestions, or small snippets when needed.
+
+2. **Ask for the Problem Statement When Needed**
+ - If the user's question is unclear or lacks enough context to provide a helpful hint, ask:
+ > "Can you share the full problem statement so I can understand what you're working on?"
+ - If the question is clear, give a relevant hint or guidance directly, without asking for the problem statement.
+
+3. **Encourage Independent Thinking**
+ - Prompt the user to think before asking for help:
+ > "What ideas have you tried so far?"
+ > "How do you think the problem could be broken down?"
+
+4. **Ask for Their Progress**
+ - Before guiding, request their attempt:
+ > "Can you share the code or approach you've started with?"
+ > "What part of the problem is confusing you the most?"
+
+5. **Respond in the Same Language**
+ - Match the user's language automatically.
+ - If they write in Arabic, respond in Arabic.
+ - If they write in English, respond in English.
+
+6. **Share Competitive Programming Tips**
+ - Regularly suggest general strategies, such as:
+ - "Think about edge cases and small inputs."
+ - "Try brute force first, then optimize."
+ - "Use binary search when the answer lies in a range."
+ - "Check time complexity to avoid TLE."
+
+7. **Support Debugging**
+ - Encourage good debugging habits:
+ - "Try printing key variables."
+ - "Use custom test cases to trace logic."
+ - "Use assertions to check assumptions."
+
+8. **Stay Friendly and Motivational**
+ - Keep responses kind and supportive:
+ > "You're on the right track!"
+ > "That's a smart idea — let's build on it."
+ > "Don't worry, this one is tricky. Let's think through it together."
+
+9. **Guide, Don't Judge**
+ - Ask constructive questions instead of criticizing:
+ > "Why did you choose this approach?"
+ > "Do you think this loop runs enough times?"
+
+10. **Remind of the Learning Goal**
+ - If the user insists on a full answer, gently remind:
+ > "I'm here to guide you step-by-step so you can learn and grow — not just give you the answer."
+
+---
+
+**Platform Context:**
+- Most users on this platform use the C++ programming language for their code and solutions.
+- It is common for users to include \`using namespace std;\` in their C++ code.
+- When providing hints, code snippets, or discussing code, tailor your advice to C++ when relevant, and be aware of common C++ practices on this platform.
+
+**Response Style:**
+- Keep your responses concise and focused, especially when giving hints. Avoid long or verbose answers.
+- Highlight only the most important parts or ideas. If the user wants more detail, let them ask for it.
+- For hints, it's okay to just say something brief like "Maybe think about logarithms" or "Try a brute force approach first."
+- Do not overwhelm the user with too much information at once.
+`;
+
+ // Prepare the message list for Gemini (as parts only, no role)
+ const allMessages = [
+ { role: "system", content: systemPrompt },
+ ...messages.filter(m => m.role !== "system"),
+ ];
+
+ const payload = {
+ contents: [
+ {
+ parts: allMessages.map(m => ({ text: m.content })),
+ },
+ ],
+ };
+
+ // Call Gemini API (using Google Generative Language API v1beta, gemini-2.0-flash)
+ const res = await fetch(
+ `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${apiKey}`,
+ {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(payload),
+ }
+ );
+ if (!res.ok) {
+ const error = await res.text();
+ return { reply: null, error: `Gemini API error: ${error}` };
+ }
+ const data = await res.json();
+ // Extract the response text
+ const text = data.candidates?.[0]?.content?.parts?.[0]?.text || "Sorry, I couldn't generate a response.";
+ return { reply: text, error: null };
+ } catch (err: unknown) {
+ return { reply: null, error: err instanceof Error ? err.message : "Unknown error" };
+ }
+}
diff --git a/src/app/virtual-mentor/page.tsx b/src/app/virtual-mentor/page.tsx
new file mode 100644
index 00000000..5fafb197
--- /dev/null
+++ b/src/app/virtual-mentor/page.tsx
@@ -0,0 +1,247 @@
+"use client";
+import { useState, useRef, useEffect, useActionState } from "react";
+import { Card } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+import { Badge } from "@/components/ui/badge";
+import { Sparkles, Bot, User } from "lucide-react";
+import ReactMarkdown from "react-markdown";
+import remarkGfm from "remark-gfm";
+import { Textarea } from "@/components/ui/textarea";
+import { useForm } from "react-hook-form";
+import { z } from "zod";
+import { zodResolver } from "@hookform/resolvers/zod";
+import rehypeSanitize from "rehype-sanitize";
+import { getVirtualMentorReply } from "./actions";
+import {
+ Form,
+ FormField,
+ FormItem,
+ FormControl,
+ FormMessage,
+} from "@/components/ui/form";
+
+// Zod schema for message validation
+const messageSchema = z.object({
+ message: z.string().trim().min(1, "Message cannot be empty"),
+});
+
+// Inline useAction hook for async server action with pending and error state
+const initialState = { reply: null, error: null };
+export default function VirtualMentorPage() {
+ const [allMessages, setAllMessages] = useState<
+ Array<{ message: string } | { response: string }>
+ >([
+ {
+ response:
+ "Welcome to the Virtual Mentor! Ask your programming questions or share your code. The mentor will give you hints and feedback, but never direct answers or code corrections. Try to solve problems yourself!",
+ },
+ ]);
+ const [_messages, setMessages] = useState<
+ Array<{ role: string; content: string }>
+ >([
+ {
+ role: "system",
+ content:
+ "Welcome to the Virtual Mentor! Ask your programming questions or share your code. The mentor will give you hints and feedback, but never direct answers or code corrections. Try to solve problems yourself!",
+ },
+ ]);
+ const messagesEndRef = useRef(null);
+ const [actionState, sendMessage, isPending] = useActionState(
+ getVirtualMentorReply,
+ initialState,
+ );
+ const [userResponse, setUserResponse] = useState("");
+
+ const form = useForm({
+ resolver: zodResolver(messageSchema),
+ defaultValues: { message: "" },
+ });
+
+ useEffect(() => {
+ messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
+ }, [allMessages]);
+
+ // When actionState.reply changes, add the assistant message
+ useEffect(() => {
+ if (actionState.reply) {
+ setAllMessages((prev) => [...prev, { response: actionState.reply }]);
+ setMessages((prev) => [
+ ...prev,
+ { role: "assistant", content: actionState.reply },
+ ]);
+ }
+ }, [actionState.reply]);
+
+ return (
+
+
+
+
+
+ Virtual Mentor
+ AI
+
+
+
+
+ Disclaimer: The Virtual Mentor will only give hints and
+ feedback, not direct answers or code corrections. If you send code,
+ it will point out issues but not fix them for you.
+
+
+
+
+ {/* New Chat button in top-right */}
+
+ {
+ setAllMessages([
+ {
+ response:
+ "Welcome to the Virtual Mentor! Ask your programming questions or share your code. The mentor will give you hints and feedback, but never direct answers or code corrections. Try to solve problems yourself!",
+ },
+ ]);
+ setMessages([
+ {
+ role: "system",
+ content:
+ "Welcome to the Virtual Mentor! Ask your programming questions or share your code. The mentor will give you hints and feedback, but never direct answers or code corrections. Try to solve problems yourself!",
+ },
+ ]);
+ }}
+ >
+ New Chat
+
+
+
+ {allMessages.map((msg, idx) => {
+ if ("message" in msg) {
+ // User message
+ return (
+
+ );
+ } else {
+ // Assistant/system message
+ return (
+
+
+
+
+
+ {msg.response}
+
+
+
+
+ );
+ }
+ })}
+
+
+
+
+ {}}
+ />
+ (
+
+
+ setUserResponse(e.target.value)}
+ className="flex-1 resize-none min-h-[44px] max-h-40"
+ placeholder="Type your question or paste your code..."
+ autoFocus
+ autoComplete="off"
+ disabled={isPending}
+ onKeyDown={(e) => {
+ if (e.key === "Enter" && !e.shiftKey) {
+ e.preventDefault();
+ if (!isPending && userResponse.trim()) {
+ setAllMessages((prev) => [
+ ...prev,
+ { message: userResponse },
+ ]);
+ setMessages((prev) => [
+ ...prev,
+ { role: "user", content: userResponse },
+ ]);
+ setUserResponse("");
+ (
+ e.target as HTMLTextAreaElement
+ ).form?.requestSubmit();
+ }
+ }
+ }}
+ />
+
+
+
+ )}
+ />
+ {
+ if (!isPending && userResponse.trim()) {
+ setAllMessages((prev) => [
+ ...prev,
+ { message: userResponse },
+ ]);
+ setMessages((prev) => [
+ ...prev,
+ { role: "user", content: userResponse },
+ ]);
+ setUserResponse("");
+ // @ts-expect-error: e.target.form is not typed on Button event target, but is valid in the DOM
+ e.target.form?.requestSubmit();
+ }
+ }}
+ >
+ {isPending ? "..." : "Send"}
+
+
+
+ {actionState.error && (
+
+ {actionState.error}
+
+ )}
+
+
+
+ );
+}
diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx
index 30d2ea7d..b5c76011 100644
--- a/src/components/NavBar.tsx
+++ b/src/components/NavBar.tsx
@@ -58,11 +58,11 @@ export function Navbar() {
- All Trainings
+ Trainings
Browse all available training programs.
@@ -70,21 +70,6 @@ export function Navbar() {
-
-
-
-
- My Trainings
-
-
- View your enrolled and completed trainings.
-
-
-
-
-
-
+
+
About Us
-
-
+
+
+
+
+
+
+ Virtual Mentor
+
+
-
-
+
Report a bug
-
@@ -123,7 +113,7 @@ export function Navbar() {
{user && (
-
+
profile
)}
diff --git a/src/components/devtools/DevToolsSidebar.tsx b/src/components/devtools/DevToolsSidebar.tsx
new file mode 100644
index 00000000..324f7766
--- /dev/null
+++ b/src/components/devtools/DevToolsSidebar.tsx
@@ -0,0 +1,117 @@
+import { useState, useEffect } from "react";
+import { Card } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
+
+export function DevToolsSidebarToggle({ onClick, className = "" }: { onClick: () => void, className?: string }) {
+ const enabled = typeof window !== "undefined" && process.env.NEXT_PUBLIC_DEV_TOOLS === "true";
+ if (!enabled) return <>>;
+ return (
+
+ 🛠️
+
+ );
+}
+
+export function DevToolsSidebar({ open, onDevLogin }: { open: boolean, onDevLogin?: (creds: { usernameOrGmail: string, password: string }) => void }) {
+ const enabled = typeof window !== "undefined" && process.env.NEXT_PUBLIC_DEV_TOOLS === "true";
+ const [status, setStatus] = useState
(null);
+ const [error, setError] = useState("");
+ const [loading, setLoading] = useState(false);
+ useEffect(() => {
+ if (!enabled || !open) return;
+ setLoading(true);
+ setError("");
+ fetch("/api/dev/seed")
+ .then(res => res.json())
+ .then(data => {
+ setStatus(data.results);
+ setLoading(false);
+ })
+ .catch(() => {
+ setError("Could not fetch dev user status.");
+ setLoading(false);
+ });
+ }, [enabled, open]);
+ if (!enabled) return <>>;
+ if (!open) return <>>;
+ return (
+
+
+
+ 🛠️ Dev Login Users
+
+ {error &&
+ {error} window.location.reload()} className="ml-2 text-primary p-0 h-auto">Retry
+
}
+ {loading && !error && Loading...
}
+ {status && !loading && (
+ <>
+
+
+
+
+ Email
+ Username
+ Password
+ Status
+
+
+
+ {status.map((u) => (
+
+ {u.dbUser?.gmail || u.user}
+ {u.dbUser?.username || '-'}
+ {u.password}
+
+ {u.status === 'created' ? (
+ ✓
+ ) : (
+ •
+ )}
+ {u.status}
+
+
+ ))}
+
+
+
+ {onDevLogin && (
+
+ {
+ const admin = status.find(u => u.dbUser?.role === "admin");
+ if (admin) onDevLogin({ usernameOrGmail: admin.dbUser.gmail, password: admin.password });
+ }}
+ >
+ Login as Admin
+
+ {
+ const user = status.find(u => u.dbUser?.role === "user");
+ if (user) onDevLogin({ usernameOrGmail: user.dbUser.gmail, password: user.password });
+ }}
+ >
+ Login as User
+
+
+ )}
+ >
+ )}
+
+ Note: This panel only appears if NEXT_PUBLIC_DEV_TOOLS=true in your .env file.
+ It will also create the users in the database if they do not exist.
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/components/profile/_Profile.tsx b/src/components/profile/_Profile.tsx
new file mode 100644
index 00000000..b7e6b6eb
--- /dev/null
+++ b/src/components/profile/_Profile.tsx
@@ -0,0 +1,244 @@
+"use client";
+import React, { JSX, useContext } from "react";
+import { useState } from "react";
+import Image from "next/image";
+import { type UserProfile } from "@/lib/types/userProfileType";
+import {
+ FaGraduationCap,
+ FaLink,
+ FaCode,
+ FaMapMarkerAlt,
+ FaGithub,
+ FaTwitter,
+ FaUserEdit,
+ FaTelegram,
+ FaFacebook,
+ FaLinkedin,
+ FaUniversity,
+} from "react-icons/fa";
+import { SiLeetcode, SiCodechef, SiCodeforces } from "react-icons/si";
+import Link from "next/link";
+import { useUserContext } from "@/providers/user";
+import "@/styles/components/profile/profile-view.css";
+
+const UserContext = React.createContext(
+ {} as UserProfile | UserProfile,
+);
+
+export default function Profile({
+ user,
+ className,
+}: {
+ user: UserProfile;
+ className?: string;
+}) {
+ const userContent = userData(user);
+ const [activeTab, setActiveTab] = useState("cp");
+ const allowEdit = useUserContext()?.username === user.username;
+
+ return (
+
+
+
+
+
+
+ setActiveTab("cp")}
+ >
+
+ Competitive Programming
+
+ setActiveTab("academics")}
+ >
+
+ Academic
+
+ setActiveTab("socials")}
+ >
+
+ Social Links
+
+ {allowEdit && (
+
+
+ edit profile
+
+ )}
+
+
+
+
+
+ {userContent[activeTab].map((data, index) => {
+ if (!data?.value) return null;
+ return (
+
+
+
+ {data.icon || }
+
+
+
{data.name}
+
{data.value}
+
+
+
+ );
+ })}
+
+
+
+
+ );
+}
+
+function Info() {
+ const user = useContext | UserProfile>(UserContext);
+ return (
+
+
+
+
+
+
@{user.username}
+
+
+
+
+ {`${user.firstNameEn ?? ""} ${user.lastNameEn ?? ""}`}
+ {user.nameAR1 && (
+
+ {`${user.nameAR1} ${user.nameAR2 ?? ""} ${user.nameAR3 ?? ""} ${user.nameAR4 ?? ""}`}
+
+ )}
+
+
+
+ {user.country && (
+
+
+ {`${user.city ?? ""}, ${user.country ?? ""}`}
+
+ )}
+
+
+
+ );
+}
+
+type EntryType = {
+ name: string;
+ value: string | number | null;
+ icon: JSX.Element;
+};
+
+function userData(user: UserProfile | UserProfile): {
+ socials: EntryType[];
+ academics: EntryType[];
+ cp: EntryType[];
+} {
+ return {
+ socials: [
+ {
+ name: "LinkedIn",
+ value: user.linkedIn,
+ icon: ,
+ },
+ {
+ name: "Facebook",
+ value: user.facebook,
+ icon: ,
+ },
+ {
+ name: "Twitter",
+ value: user.twitter,
+ icon: ,
+ },
+ {
+ name: "GitHub",
+ value: user.github,
+ icon: ,
+ },
+ {
+ name: "Telegram",
+ value: user.telegram,
+ icon: ,
+ },
+ ],
+ academics: [
+ {
+ name: "Institute",
+ value: user.institute,
+ icon: ,
+ },
+ {
+ name: "Faculty",
+ value: user.faculty,
+ icon: ,
+ },
+ {
+ name: "Department",
+ value: user.department,
+ icon: ,
+ },
+ {
+ name: "Academic Year",
+ value: user.academicYear,
+ icon: ,
+ },
+ {
+ name: "Expected Graduation",
+ value: user.graduationDate
+ ? new Date(user.graduationDate).getFullYear()
+ : null,
+ icon: ,
+ },
+ ],
+ cp: [
+ {
+ name: "Codeforces",
+ value: user.codeforces,
+ icon: ,
+ },
+ {
+ name: "Vjudge",
+ value: user.vjudge,
+ icon: ,
+ },
+ {
+ name: "AtCoder",
+ value: user.atcoder,
+ icon: ,
+ },
+ {
+ name: "CodeChef",
+ value: user.codechef,
+ icon: ,
+ },
+ {
+ name: "LeetCode",
+ value: user.leetcode,
+ icon: ,
+ },
+ ],
+ };
+}
diff --git a/src/app/(authorized-only)/profile/_Sidebar.tsx b/src/components/profile/_Sidebar.tsx
similarity index 82%
rename from src/app/(authorized-only)/profile/_Sidebar.tsx
rename to src/components/profile/_Sidebar.tsx
index 97adf113..4481e592 100644
--- a/src/app/(authorized-only)/profile/_Sidebar.tsx
+++ b/src/components/profile/_Sidebar.tsx
@@ -1,9 +1,11 @@
import React from "react";
-import { FaUserFriends, FaRobot, FaChalkboardTeacher } from 'react-icons/fa';
+import { FaUserFriends, FaRobot, FaChalkboardTeacher } from "react-icons/fa";
export default function Sidebar({ className }: { className?: string }) {
return (
-
- )
- }
-)
-Sidebar.displayName = "Sidebar"
+ );
+ },
+);
+Sidebar.displayName = "Sidebar";
const SidebarTrigger = React.forwardRef<
React.ElementRef
,
React.ComponentProps
>(({ className, onClick, ...props }, ref) => {
- const { toggleSidebar } = useSidebar()
+ const { toggleSidebar } = useSidebar();
return (
{
- onClick?.(event)
- toggleSidebar()
+ onClick?.(event);
+ toggleSidebar();
}}
{...props}
>
Toggle Sidebar
- )
-})
-SidebarTrigger.displayName = "SidebarTrigger"
+ );
+});
+SidebarTrigger.displayName = "SidebarTrigger";
const SidebarRail = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<"button">
>(({ className, ...props }, ref) => {
- const { toggleSidebar } = useSidebar()
+ const { toggleSidebar } = useSidebar();
return (
- )
-})
-SidebarRail.displayName = "SidebarRail"
+ );
+});
+SidebarRail.displayName = "SidebarRail";
const SidebarInset = React.forwardRef<
HTMLDivElement,
@@ -324,13 +332,13 @@ const SidebarInset = React.forwardRef<
className={cn(
"relative flex min-h-svh flex-1 flex-col bg-background",
"peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
- className
+ className,
)}
{...props}
/>
- )
-})
-SidebarInset.displayName = "SidebarInset"
+ );
+});
+SidebarInset.displayName = "SidebarInset";
const SidebarInput = React.forwardRef<
React.ElementRef,
@@ -342,13 +350,13 @@ const SidebarInput = React.forwardRef<
data-sidebar="input"
className={cn(
"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
- className
+ className,
)}
{...props}
/>
- )
-})
-SidebarInput.displayName = "SidebarInput"
+ );
+});
+SidebarInput.displayName = "SidebarInput";
const SidebarHeader = React.forwardRef<
HTMLDivElement,
@@ -361,9 +369,9 @@ const SidebarHeader = React.forwardRef<
className={cn("flex flex-col gap-2 p-2", className)}
{...props}
/>
- )
-})
-SidebarHeader.displayName = "SidebarHeader"
+ );
+});
+SidebarHeader.displayName = "SidebarHeader";
const SidebarFooter = React.forwardRef<
HTMLDivElement,
@@ -376,9 +384,9 @@ const SidebarFooter = React.forwardRef<
className={cn("flex flex-col gap-2 p-2", className)}
{...props}
/>
- )
-})
-SidebarFooter.displayName = "SidebarFooter"
+ );
+});
+SidebarFooter.displayName = "SidebarFooter";
const SidebarSeparator = React.forwardRef<
React.ElementRef,
@@ -391,9 +399,9 @@ const SidebarSeparator = React.forwardRef<
className={cn("mx-2 w-auto bg-sidebar-border", className)}
{...props}
/>
- )
-})
-SidebarSeparator.displayName = "SidebarSeparator"
+ );
+});
+SidebarSeparator.displayName = "SidebarSeparator";
const SidebarContent = React.forwardRef<
HTMLDivElement,
@@ -405,13 +413,13 @@ const SidebarContent = React.forwardRef<
data-sidebar="content"
className={cn(
"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
- className
+ className,
)}
{...props}
/>
- )
-})
-SidebarContent.displayName = "SidebarContent"
+ );
+});
+SidebarContent.displayName = "SidebarContent";
const SidebarGroup = React.forwardRef<
HTMLDivElement,
@@ -424,15 +432,15 @@ const SidebarGroup = React.forwardRef<
className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
{...props}
/>
- )
-})
-SidebarGroup.displayName = "SidebarGroup"
+ );
+});
+SidebarGroup.displayName = "SidebarGroup";
const SidebarGroupLabel = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div"> & { asChild?: boolean }
>(({ className, asChild = false, ...props }, ref) => {
- const Comp = asChild ? Slot : "div"
+ const Comp = asChild ? Slot : "div";
return (
svg]:size-4 [&>svg]:shrink-0",
"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
- className
+ className,
)}
{...props}
/>
- )
-})
-SidebarGroupLabel.displayName = "SidebarGroupLabel"
+ );
+});
+SidebarGroupLabel.displayName = "SidebarGroupLabel";
const SidebarGroupAction = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<"button"> & { asChild?: boolean }
>(({ className, asChild = false, ...props }, ref) => {
- const Comp = asChild ? Slot : "button"
+ const Comp = asChild ? Slot : "button";
return (
- )
-})
-SidebarGroupAction.displayName = "SidebarGroupAction"
+ );
+});
+SidebarGroupAction.displayName = "SidebarGroupAction";
const SidebarGroupContent = React.forwardRef<
HTMLDivElement,
@@ -482,8 +490,8 @@ const SidebarGroupContent = React.forwardRef<
className={cn("w-full text-sm", className)}
{...props}
/>
-))
-SidebarGroupContent.displayName = "SidebarGroupContent"
+));
+SidebarGroupContent.displayName = "SidebarGroupContent";
const SidebarMenu = React.forwardRef<
HTMLUListElement,
@@ -495,8 +503,8 @@ const SidebarMenu = React.forwardRef<
className={cn("flex w-full min-w-0 flex-col gap-1", className)}
{...props}
/>
-))
-SidebarMenu.displayName = "SidebarMenu"
+));
+SidebarMenu.displayName = "SidebarMenu";
const SidebarMenuItem = React.forwardRef<
HTMLLIElement,
@@ -508,8 +516,8 @@ const SidebarMenuItem = React.forwardRef<
className={cn("group/menu-item relative", className)}
{...props}
/>
-))
-SidebarMenuItem.displayName = "SidebarMenuItem"
+));
+SidebarMenuItem.displayName = "SidebarMenuItem";
const sidebarMenuButtonVariants = cva(
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
@@ -530,15 +538,15 @@ const sidebarMenuButtonVariants = cva(
variant: "default",
size: "default",
},
- }
-)
+ },
+);
const SidebarMenuButton = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<"button"> & {
- asChild?: boolean
- isActive?: boolean
- tooltip?: string | React.ComponentProps
+ asChild?: boolean;
+ isActive?: boolean;
+ tooltip?: string | React.ComponentProps;
} & VariantProps
>(
(
@@ -551,10 +559,10 @@ const SidebarMenuButton = React.forwardRef<
className,
...props
},
- ref
+ ref,
) => {
- const Comp = asChild ? Slot : "button"
- const { isMobile, state } = useSidebar()
+ const Comp = asChild ? Slot : "button";
+ const { isMobile, state } = useSidebar();
const button = (
- )
+ );
if (!tooltip) {
- return button
+ return button;
}
if (typeof tooltip === "string") {
tooltip = {
children: tooltip,
- }
+ };
}
return (
@@ -587,19 +595,19 @@ const SidebarMenuButton = React.forwardRef<
{...tooltip}
/>
- )
- }
-)
-SidebarMenuButton.displayName = "SidebarMenuButton"
+ );
+ },
+);
+SidebarMenuButton.displayName = "SidebarMenuButton";
const SidebarMenuAction = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<"button"> & {
- asChild?: boolean
- showOnHover?: boolean
+ asChild?: boolean;
+ showOnHover?: boolean;
}
>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
- const Comp = asChild ? Slot : "button"
+ const Comp = asChild ? Slot : "button";
return (
- )
-})
-SidebarMenuAction.displayName = "SidebarMenuAction"
+ );
+});
+SidebarMenuAction.displayName = "SidebarMenuAction";
const SidebarMenuBadge = React.forwardRef<
HTMLDivElement,
@@ -637,23 +645,23 @@ const SidebarMenuBadge = React.forwardRef<
"peer-data-[size=default]/menu-button:top-1.5",
"peer-data-[size=lg]/menu-button:top-2.5",
"group-data-[collapsible=icon]:hidden",
- className
+ className,
)}
{...props}
/>
-))
-SidebarMenuBadge.displayName = "SidebarMenuBadge"
+));
+SidebarMenuBadge.displayName = "SidebarMenuBadge";
const SidebarMenuSkeleton = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div"> & {
- showIcon?: boolean
+ showIcon?: boolean;
}
>(({ className, showIcon = false, ...props }, ref) => {
// Random width between 50 to 90%.
const width = React.useMemo(() => {
- return `${Math.floor(Math.random() * 40) + 50}%`
- }, [])
+ return `${Math.floor(Math.random() * 40) + 50}%`;
+ }, []);
return (
- )
-})
-SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton"
+ );
+});
+SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
const SidebarMenuSub = React.forwardRef<
HTMLUListElement,
@@ -692,28 +700,28 @@ const SidebarMenuSub = React.forwardRef<
className={cn(
"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5",
"group-data-[collapsible=icon]:hidden",
- className
+ className,
)}
{...props}
/>
-))
-SidebarMenuSub.displayName = "SidebarMenuSub"
+));
+SidebarMenuSub.displayName = "SidebarMenuSub";
const SidebarMenuSubItem = React.forwardRef<
HTMLLIElement,
React.ComponentProps<"li">
->(({ ...props }, ref) =>
)
-SidebarMenuSubItem.displayName = "SidebarMenuSubItem"
+>(({ ...props }, ref) =>
);
+SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
const SidebarMenuSubButton = React.forwardRef<
HTMLAnchorElement,
React.ComponentProps<"a"> & {
- asChild?: boolean
- size?: "sm" | "md"
- isActive?: boolean
+ asChild?: boolean;
+ size?: "sm" | "md";
+ isActive?: boolean;
}
>(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
- const Comp = asChild ? Slot : "a"
+ const Comp = asChild ? Slot : "a";
return (
- )
-})
-SidebarMenuSubButton.displayName = "SidebarMenuSubButton"
+ );
+});
+SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
export {
Sidebar,
@@ -760,4 +768,4 @@ export {
SidebarSeparator,
SidebarTrigger,
useSidebar,
-}
+};
diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx
index d7e45f7b..c26c4ea9 100644
--- a/src/components/ui/skeleton.tsx
+++ b/src/components/ui/skeleton.tsx
@@ -1,4 +1,4 @@
-import { cn } from "@/lib/utils"
+import { cn } from "@/lib/utils";
function Skeleton({
className,
@@ -9,7 +9,7 @@ function Skeleton({
className={cn("animate-pulse rounded-md bg-primary/10", className)}
{...props}
/>
- )
+ );
}
-export { Skeleton }
+export { Skeleton };
diff --git a/src/components/ui/switch.tsx b/src/components/ui/switch.tsx
new file mode 100644
index 00000000..5f4117f0
--- /dev/null
+++ b/src/components/ui/switch.tsx
@@ -0,0 +1,29 @@
+"use client"
+
+import * as React from "react"
+import * as SwitchPrimitives from "@radix-ui/react-switch"
+
+import { cn } from "@/lib/utils"
+
+const Switch = React.forwardRef<
+ React.ElementRef
,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+Switch.displayName = SwitchPrimitives.Root.displayName
+
+export { Switch }
diff --git a/src/components/ui/table.tsx b/src/components/ui/table.tsx
new file mode 100644
index 00000000..c0df655c
--- /dev/null
+++ b/src/components/ui/table.tsx
@@ -0,0 +1,120 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+const Table = React.forwardRef<
+ HTMLTableElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+Table.displayName = "Table"
+
+const TableHeader = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+TableHeader.displayName = "TableHeader"
+
+const TableBody = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+TableBody.displayName = "TableBody"
+
+const TableFooter = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+ tr]:last:border-b-0",
+ className
+ )}
+ {...props}
+ />
+))
+TableFooter.displayName = "TableFooter"
+
+const TableRow = React.forwardRef<
+ HTMLTableRowElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+TableRow.displayName = "TableRow"
+
+const TableHead = React.forwardRef<
+ HTMLTableCellElement,
+ React.ThHTMLAttributes
+>(({ className, ...props }, ref) => (
+ [role=checkbox]]:translate-y-[2px]",
+ className
+ )}
+ {...props}
+ />
+))
+TableHead.displayName = "TableHead"
+
+const TableCell = React.forwardRef<
+ HTMLTableCellElement,
+ React.TdHTMLAttributes
+>(({ className, ...props }, ref) => (
+ [role=checkbox]]:translate-y-[2px]",
+ className
+ )}
+ {...props}
+ />
+))
+TableCell.displayName = "TableCell"
+
+const TableCaption = React.forwardRef<
+ HTMLTableCaptionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+TableCaption.displayName = "TableCaption"
+
+export {
+ Table,
+ TableHeader,
+ TableBody,
+ TableFooter,
+ TableHead,
+ TableRow,
+ TableCell,
+ TableCaption,
+}
diff --git a/src/components/ui/textarea.tsx b/src/components/ui/textarea.tsx
index e56b0aff..5a7e6350 100644
--- a/src/components/ui/textarea.tsx
+++ b/src/components/ui/textarea.tsx
@@ -1,6 +1,6 @@
-import * as React from "react"
+import * as React from "react";
-import { cn } from "@/lib/utils"
+import { cn } from "@/lib/utils";
const Textarea = React.forwardRef<
HTMLTextAreaElement,
@@ -10,13 +10,13 @@ const Textarea = React.forwardRef<
- )
-})
-Textarea.displayName = "Textarea"
+ );
+});
+Textarea.displayName = "Textarea";
-export { Textarea }
+export { Textarea };
diff --git a/src/components/ui/toast.tsx b/src/components/ui/toast.tsx
new file mode 100644
index 00000000..f95ee4d2
--- /dev/null
+++ b/src/components/ui/toast.tsx
@@ -0,0 +1,131 @@
+"use client"
+
+import * as React from "react"
+import * as ToastPrimitives from "@radix-ui/react-toast"
+import { cva, type VariantProps } from "class-variance-authority"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const ToastProvider = ToastPrimitives.Provider
+
+const ToastViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastViewport.displayName = ToastPrimitives.Viewport.displayName
+
+const toastVariants = cva(
+
+ "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
+
+ {
+ variants: {
+ variant: {
+ default: "border bg-background text-foreground",
+ destructive:
+ "destructive group border-destructive bg-destructive text-destructive-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+const Toast = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, variant, ...props }, ref) => {
+ return (
+
+ )
+})
+Toast.displayName = ToastPrimitives.Root.displayName
+
+const ToastAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastAction.displayName = ToastPrimitives.Action.displayName
+
+const ToastClose = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+ToastClose.displayName = ToastPrimitives.Close.displayName
+
+const ToastTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastTitle.displayName = ToastPrimitives.Title.displayName
+
+const ToastDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastDescription.displayName = ToastPrimitives.Description.displayName
+
+type ToastProps = React.ComponentPropsWithoutRef
+
+type ToastActionElement = React.ReactElement
+
+export {
+ type ToastProps,
+ type ToastActionElement,
+ ToastProvider,
+ ToastViewport,
+ Toast,
+ ToastTitle,
+ ToastDescription,
+ ToastClose,
+ ToastAction,
+}
diff --git a/src/components/ui/toaster.tsx b/src/components/ui/toaster.tsx
new file mode 100644
index 00000000..171beb46
--- /dev/null
+++ b/src/components/ui/toaster.tsx
@@ -0,0 +1,35 @@
+"use client"
+
+import { useToast } from "@/hooks/use-toast"
+import {
+ Toast,
+ ToastClose,
+ ToastDescription,
+ ToastProvider,
+ ToastTitle,
+ ToastViewport,
+} from "@/components/ui/toast"
+
+export function Toaster() {
+ const { toasts } = useToast()
+
+ return (
+
+ {toasts.map(function ({ id, title, description, action, ...props }) {
+ return (
+
+
+ {title && {title} }
+ {description && (
+ {description}
+ )}
+
+ {action}
+
+
+ )
+ })}
+
+
+ )
+}
diff --git a/src/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx
index a66b3f22..3e3f0be4 100644
--- a/src/components/ui/tooltip.tsx
+++ b/src/components/ui/tooltip.tsx
@@ -1,15 +1,15 @@
-"use client"
+"use client";
-import * as React from "react"
-import * as TooltipPrimitive from "@radix-ui/react-tooltip"
+import * as React from "react";
+import * as TooltipPrimitive from "@radix-ui/react-tooltip";
-import { cn } from "@/lib/utils"
+import { cn } from "@/lib/utils";
-const TooltipProvider = TooltipPrimitive.Provider
+const TooltipProvider = TooltipPrimitive.Provider;
-const Tooltip = TooltipPrimitive.Root
+const Tooltip = TooltipPrimitive.Root;
-const TooltipTrigger = TooltipPrimitive.Trigger
+const TooltipTrigger = TooltipPrimitive.Trigger;
const TooltipContent = React.forwardRef<
React.ElementRef,
@@ -21,12 +21,12 @@ const TooltipContent = React.forwardRef<
sideOffset={sideOffset}
className={cn(
"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
- className
+ className,
)}
{...props}
/>
-))
-TooltipContent.displayName = TooltipPrimitive.Content.displayName
+));
+TooltipContent.displayName = TooltipPrimitive.Content.displayName;
-export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
+export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
diff --git a/src/components/ui/typography.tsx b/src/components/ui/typography.tsx
index 7fa198ca..c8067c91 100644
--- a/src/components/ui/typography.tsx
+++ b/src/components/ui/typography.tsx
@@ -1,25 +1,49 @@
-export function TypographyH1({ children, className }: { children: React.ReactNode, className?: string }) {
+export function TypographyH1({
+ children,
+ className,
+}: {
+ children: React.ReactNode;
+ className?: string;
+}) {
return (
-
+
{children}
- )
+ );
}
-export function TypographyH2({ children, className }: { children: React.ReactNode, className?: string }) {
+export function TypographyH2({
+ children,
+ className,
+}: {
+ children: React.ReactNode;
+ className?: string;
+}) {
return (
-
+
{children}
- )
+ );
}
-export function TypographyH3({ children, className }: { children: React.ReactNode, className?: string }) {
+export function TypographyH3({
+ children,
+ className,
+}: {
+ children: React.ReactNode;
+ className?: string;
+}) {
return (
-
+
{children}
- )
+ );
}
export function TypographyH4() {
@@ -27,7 +51,7 @@ export function TypographyH4() {
People stopped telling jokes
- )
+ );
}
export function TypographyP() {
@@ -36,15 +60,14 @@ export function TypographyP() {
The king, seeing how much happier his subjects were, realized the error of
his ways and repealed the joke tax.
- )
+ );
}
export function TypographyBlockquote() {
return (
- {'"'}After all,{'"'} he said, {'"'}everyone enjoys a good joke, so it{"'"}s only fair that
- they should pay for the privilege.{'"'}
+ {'"'}After all,{'"'} he said, {'"'}everyone enjoys a good joke, so it{"'"}
+ s only fair that they should pay for the privilege.{'"'}
- )
+ );
}
-
diff --git a/src/components/util/AddToLocalStorage.tsx b/src/components/util/AddToLocalStorage.tsx
new file mode 100644
index 00000000..1cabdc47
--- /dev/null
+++ b/src/components/util/AddToLocalStorage.tsx
@@ -0,0 +1,29 @@
+"use client";
+
+import NoSSR from "./NoSSR";
+
+export default function AddToLocalStorage({
+ key_,
+ value,
+}: {
+ key_: string;
+ value: string;
+}) {
+ console.log(key_, value);
+ return (
+
+
+
+ );
+}
+
+function AddToLocalStorageComp({
+ key_,
+ value,
+}: {
+ key_: string;
+ value: string;
+}) {
+ localStorage.setItem(key_, value);
+ return <>>;
+}
diff --git a/src/components/util/NoSSR.tsx b/src/components/util/NoSSR.tsx
new file mode 100644
index 00000000..4721675d
--- /dev/null
+++ b/src/components/util/NoSSR.tsx
@@ -0,0 +1,8 @@
+"use client";
+import dynamic from "next/dynamic";
+
+/**
+ * This component is used to render a component that should not be rendered on the server.
+ */
+const NoSSR = dynamic(() => import("./NoSSRComp"), { ssr: false });
+export default NoSSR;
diff --git a/src/components/util/NoSSRComp.tsx b/src/components/util/NoSSRComp.tsx
new file mode 100644
index 00000000..b8350a0a
--- /dev/null
+++ b/src/components/util/NoSSRComp.tsx
@@ -0,0 +1,3 @@
+export default function NoSSRComp({ children }: { children: React.ReactNode }) {
+ return <>{children}>;
+}
diff --git a/src/dao/getStaffRoles.ts b/src/dao/getStaffRoles.ts
new file mode 100644
index 00000000..5f718854
--- /dev/null
+++ b/src/dao/getStaffRoles.ts
@@ -0,0 +1,85 @@
+import { db } from "@/lib/db";
+import { Staff } from "@/lib/db/schema/training/Staff";
+import { Trainings } from "@/lib/db/schema/training/Trainings";
+import { and, eq, isNull } from "drizzle-orm";
+
+export type StaffRole =
+ | "mentor"
+ | "problem_setter"
+ | "instructor"
+ | "co_head"
+ | "manager"
+ | "head"
+ | "chief_judge";
+
+/**
+ * Fetches the staff roles for a given user in a specific training.
+ * @param userId The ID of the user.
+ * @param trainingId The ID of the training.
+ * @returns An array of staff roles, or an empty array if the user has no staff roles.
+ */
+export async function getStaffRoles({
+ userId,
+ trainingId,
+}: {
+ userId?: string;
+ trainingId: number;
+}): Promise {
+ if( !userId || !trainingId) {
+ return [];
+ }
+ const userRoles: StaffRole[] = [];
+ // Check staff table
+ const dbResult = await db
+ .select({
+ trainingHeadId: Trainings.headId,
+ chiefJudgeId: Trainings.chiefJudge,
+ })
+ .from(Trainings)
+ .where(and(eq(Trainings.trainingId, trainingId), isNull(Trainings.deleted)))
+ .execute();
+
+ const { trainingHeadId, chiefJudgeId } = dbResult[0] || {};
+ const staffRows = await db
+ .select({
+ mentor: Staff.mentor,
+ problemSetter: Staff.problemSetter,
+ instructor: Staff.instructor,
+ coHead: Staff.coHead,
+ manager: Staff.manager,
+ })
+ .from(Staff)
+ .where(
+ and(
+ eq(Staff.userId, userId),
+ eq(Staff.trainingId, trainingId),
+ isNull(Staff.deleted),
+ ),
+ )
+ .execute();
+
+ if (staffRows.length > 0) {
+ const staff = staffRows[0];
+ if (staff.manager) {
+ userRoles.push("manager");
+ }
+ if (staff.instructor) {
+ userRoles.push("instructor");
+ }
+ if (staff.mentor) {
+ userRoles.push("mentor");
+ }
+ if (staff.problemSetter) {
+ userRoles.push("problem_setter");
+ }
+ if (staff.coHead) {
+ userRoles.push("co_head");
+ }
+ }
+
+ // Check head_id and chief_judge
+ if (userId === trainingHeadId) userRoles.push("head");
+ if (userId === chiefJudgeId) userRoles.push("chief_judge");
+
+ return userRoles;
+}
diff --git a/src/dao/getTrainingFullData.ts b/src/dao/getTrainingFullData.ts
new file mode 100644
index 00000000..26f46f14
--- /dev/null
+++ b/src/dao/getTrainingFullData.ts
@@ -0,0 +1,178 @@
+"use server";
+import "server-only";
+import { Faculties } from "@/lib/db/schema/user/Faculties";
+import { Institutes } from "@/lib/db/schema/user/Institutes";
+import { UsersFullData } from "@/lib/db/schema/user/UsersFullData";
+import { Users } from "@/lib/db/schema/user/Users";
+import { and, eq, inArray, isNull } from "drizzle-orm";
+import { db } from "@/lib/db";
+import { Trainings } from "@/lib/db/schema/training/Trainings";
+import { Blocks } from "@/lib/db/schema/training/Blocks";
+import {
+ TrainingFullDTO,
+ LeaderBoardEntry,
+} from "@/lib/types/Training";
+import { Contests } from "@/lib/db/schema/training/Contests";
+import camelcaseKeys from "camelcase-keys";
+
+export async function getTrainingFullData({
+ trainingId,
+}: {
+ trainingId: number;
+ userId?: string;
+}): Promise {
+ // Fetch training details
+ const trainingResult = await db
+ .select({
+ leaderBoard: Trainings.leaderBoard,
+ standingView: Trainings.standingView,
+ headId: Trainings.headId,
+ chiefJudge: Trainings.chiefJudge,
+ title: Trainings.title,
+ })
+ .from(Trainings)
+ .where(eq(Trainings.trainingId, trainingId))
+ .execute();
+
+ const training = trainingResult[0];
+ if (!training) {
+ throw new Error("Training not found");
+ }
+
+ const { standingView, leaderBoard ,title} = training;
+ // leaderBoard is expected to be an array of { userId, points }
+ const leaderBoardEntry: LeaderBoardEntry[] = Array.isArray(leaderBoard)
+ ? leaderBoard
+ : [];
+
+ // Get all userIds in the leaderboard
+ const traineeIds = leaderBoardEntry
+ .map((entry) => entry.userId)
+ .filter((id) => id !== undefined);
+
+ // Fetch blocks as they are needed for the contests query within Promise.all
+ const blocksResult = await db
+ .select({
+ id: Blocks.blockNumber,
+ title: Blocks.title,
+ materials: Blocks.material,
+ description: Blocks.description,
+ })
+ .from(Blocks)
+ .where(
+ and(
+ eq(Blocks.trainingId, trainingId),
+ eq(Blocks.hidden, false),
+ isNull(Blocks.deleted),
+ ),
+ )
+ .execute();
+
+ const [trainees, constestEntries] = await Promise.all([
+ db
+ .select({
+ ...selectKeysFromObjects(userSelectFields, standingView),
+ userId: Users.userId,
+ })
+ .from(Users)
+ .leftJoin(UsersFullData, eq(UsersFullData.userId, Users.userId))
+ .leftJoin(Institutes, eq(Institutes.id, UsersFullData.instituteId))
+ .leftJoin(Faculties, eq(Faculties.id, UsersFullData.facultyId))
+ .where(inArray(Users.userId, traineeIds))
+ .execute(),
+ db
+ .select({
+ standing: Contests.standing,
+ })
+ .from(Contests)
+ .where(
+ and(
+ eq(Contests.trainingId, trainingId),
+ isNull(Contests.deleted),
+ inArray(
+ Contests.blockNumber,
+ blocksResult.map((x: { id: number }) => x.id),
+ ),
+ ),
+ ),
+ ]);
+
+ const traineesMap = new Map(
+ trainees.map((trainee) => {
+ const { userId, ...rest } = trainee;
+ return [userId, rest];
+ }),
+ );
+
+ // Merge leaderboard points with user details
+ const leaderBoardWithTrainees = leaderBoardEntry
+ .map((entry) => {
+ const user = traineesMap.get(entry.userId);
+ if (!user) {
+ return undefined; // Skip if user not found
+ }
+ return {
+ ...user,
+ points: entry.points,
+ };
+ })
+ .filter(
+ (entry) => entry !== undefined,
+ ) satisfies TrainingFullDTO["leaderBoard"];
+
+ const blocks = blocksResult satisfies TrainingFullDTO["blocks"];
+ blocks.sort((a, b) => a.id - b.id);
+
+ const contestsStandingWithTrainees: TrainingFullDTO["standing"] = [];
+
+ for (const entry of constestEntries) {
+ const standing = entry.standing;
+ if (!standing) continue;
+
+ // Convert standing object to camelCase
+ const camelStanding = camelcaseKeys(standing, { deep: true });
+ const { contestInfo, rankings, problems } = camelStanding;
+ const rankingsWithTrainees = rankings
+ .map((ranking) => {
+ const user = traineesMap.get(ranking.userId);
+ if (!user) {
+ return undefined; // Skip if user not found
+ }
+ const { userId: __unneeded, ...rankingWithoutUserId } = ranking;
+ return {
+ ...user,
+ ...rankingWithoutUserId,
+ };
+ })
+ .filter((ranking) => ranking !== undefined);
+
+ contestsStandingWithTrainees.push({
+ problems,
+ contestInfo,
+ rankings: rankingsWithTrainees,
+ });
+ }
+
+ // Return as a flat array of user standings (not contest standings)
+ return { leaderBoard: leaderBoardWithTrainees, blocks, standing: contestsStandingWithTrainees, title };
+}
+
+const userSelectFields = {
+ name: UsersFullData.firstNameEn,
+ cfHandle: Users.cfHandle,
+ vjudge: Users.vjHandle,
+ gmail: Users.gmail,
+ level: UsersFullData.academicYear,
+ university: Institutes.name,
+ faculty: Faculties.name,
+};
+
+function selectKeysFromObjects(data: typeof userSelectFields, keys: string[]) {
+ return keys.reduce((acc, key) => {
+ if (key in data) {
+ // @ts-expect-error - This is a hack to get around the type system
+ acc[key] = data[key];
+ }
+ return acc;
+ }, {});
+}
diff --git a/src/dao/getUserFullData.ts b/src/dao/getUserFullData.ts
new file mode 100644
index 00000000..78aa0d27
--- /dev/null
+++ b/src/dao/getUserFullData.ts
@@ -0,0 +1,91 @@
+"use server";
+import "server-only";
+import { db } from "@/lib/db";
+import { Cities } from "@/lib/db/schema/user/Cities";
+import { Countries } from "@/lib/db/schema/user/Countries";
+import { UsersFullData } from "@/lib/db/schema/user/UsersFullData";
+import { Users } from "@/lib/db/schema/user/Users";
+import { eq } from "drizzle-orm";
+import { Departments } from "@/lib/db/schema/user/Departments";
+import { Communities } from "@/lib/db/schema/user/Communities";
+import { type UserProfile } from "@/lib/types/userProfileType";
+import { Institutes } from "@/lib/db/schema/user/Institutes";
+import { Faculties } from "@/lib/db/schema/user/Faculties";
+
+export async function getUserFullData<
+ T extends
+ | {
+ username: string;
+ }
+ | {
+ userId: string;
+ },
+ U extends T extends { username: string } ? true : false,
+>(ident: T): Promise | null> {
+ const comp =
+ "username" in ident
+ ? eq(Users.username, ident.username)
+ : eq(Users.userId, ident.userId);
+ const userData: UserProfile | null =
+ (
+ await db
+ .select({
+ username: Users.username,
+ imageUrl: UsersFullData.imageUrl,
+ gmail: Users.gmail,
+ createdAt: UsersFullData.registrationDate,
+
+ country: Countries.name,
+ city: Cities.name,
+ institute: Institutes.name,
+ department: Departments.name,
+ community: Communities.name,
+ faculty: Faculties.name,
+
+ nameAR1: UsersFullData.nameAR1,
+ nameAR2: UsersFullData.nameAR2,
+ nameAR3: UsersFullData.nameAR3,
+ nameAR4: UsersFullData.nameAR4,
+ firstNameEn: UsersFullData.firstNameEn,
+ lastNameEn: UsersFullData.lastNameEn,
+
+ codeforces: Users.cfHandle,
+ vjudge: Users.vjHandle,
+ atcoder: UsersFullData.atcoder,
+ codechef: UsersFullData.codechef,
+ leetcode: UsersFullData.leetcode,
+ cses: UsersFullData.cses,
+
+ facebook: UsersFullData.facebook,
+ linkedIn: UsersFullData.linkedIn,
+ twitter: UsersFullData.twitter,
+ github: UsersFullData.github,
+ telegram: UsersFullData.telegram,
+
+ academicYear: UsersFullData.academicYear,
+ graduationDate: UsersFullData.graduationDate,
+ visibilityMask: UsersFullData.visibilityMask,
+ })
+ .from(UsersFullData)
+ .leftJoin(Countries, eq(UsersFullData.countryId, Countries.id))
+ .leftJoin(Cities, eq(UsersFullData.cityId, Cities.id))
+ .leftJoin(Users, eq(UsersFullData.userId, Users.userId))
+ .leftJoin(Institutes, eq(UsersFullData.instituteId, Institutes.id))
+ .leftJoin(Faculties, eq(UsersFullData.facultyId, Faculties.id))
+ .leftJoin(
+ Departments,
+ eq(UsersFullData.departmentId, Departments.id),
+ )
+ .leftJoin(
+ Communities,
+ eq(UsersFullData.communityId, Communities.id),
+ )
+ .where(comp)
+ .execute()
+ )[0] ?? null;
+ if (userData === null) return null;
+ if ("username" in ident) {
+ //TODO: check visibility
+ }
+ return userData as UserProfile;
+}
diff --git a/src/devtools/seedUsers.ts b/src/devtools/seedUsers.ts
new file mode 100644
index 00000000..3ba663f8
--- /dev/null
+++ b/src/devtools/seedUsers.ts
@@ -0,0 +1,78 @@
+import { db } from "@/lib/db";
+import { Users } from "@/lib/db/schema/user/Users";
+import { UsersFullData } from "@/lib/db/schema/user/UsersFullData";
+import { eq, or } from "drizzle-orm";
+import bcrypt from "bcrypt";
+
+export type SeedUserStatus = {
+ user: string;
+ status: string;
+ dbUser?: any;
+ password: string;
+};
+
+export async function ensureDefaultUsers(): Promise {
+ const defaultUsers = [
+ {
+ username: "admin_icpc",
+ gmail: "admin_icpc@gmail.com",
+ password: "Admin@123",
+ role: "admin",
+ cfHandle: "admin_cf",
+ vjHandle: "admin_vj",
+ phoneNumber: "+2010000000000",
+ },
+ {
+ username: "user_icpc",
+ gmail: "user_icpc@gmail.com",
+ password: "User@1234",
+ role: "user",
+ cfHandle: "user_cf",
+ vjHandle: "user_vj",
+ phoneNumber: "+2010000000001",
+ },
+ ];
+
+ const results: SeedUserStatus[] = [];
+
+ for (const user of defaultUsers) {
+ // Check for existing user by username, gmail, cfHandle, vjHandle, phoneNumber
+ const exists = await db
+ .select()
+ .from(Users)
+ .where(
+ or(
+ eq(Users.username, user.username),
+ eq(Users.gmail, user.gmail),
+ eq(Users.cfHandle, user.cfHandle),
+ eq(Users.vjHandle, user.vjHandle),
+ eq(Users.phoneNumber, user.phoneNumber),
+ ),
+ )
+ .execute();
+ if (exists.length > 0) {
+ results.push({ user: user.gmail, status: "already exists", dbUser: exists[0], password: user.password });
+ continue;
+ }
+ // Hash password
+ const hashed = await bcrypt.hash(user.password, 10);
+ // Insert into Users
+ const [inserted] = await db
+ .insert(Users)
+ .values({
+ username: user.username,
+ gmail: user.gmail,
+ password: hashed,
+ role: user.role as "admin" | "user",
+ cfHandle: user.cfHandle,
+ vjHandle: user.vjHandle,
+ phoneNumber: user.phoneNumber,
+ })
+ .returning();
+ // Insert into UsersFullData
+ await db.insert(UsersFullData).values({ userId: inserted.userId }).execute();
+ results.push({ user: user.gmail, status: "created", dbUser: inserted, password: user.password });
+ }
+
+ return results;
+}
\ No newline at end of file
diff --git a/src/hooks/use-toast.ts b/src/hooks/use-toast.ts
new file mode 100644
index 00000000..02e111d8
--- /dev/null
+++ b/src/hooks/use-toast.ts
@@ -0,0 +1,194 @@
+"use client"
+
+// Inspired by react-hot-toast library
+import * as React from "react"
+
+import type {
+ ToastActionElement,
+ ToastProps,
+} from "@/components/ui/toast"
+
+const TOAST_LIMIT = 1
+const TOAST_REMOVE_DELAY = 1000000
+
+type ToasterToast = ToastProps & {
+ id: string
+ title?: React.ReactNode
+ description?: React.ReactNode
+ action?: ToastActionElement
+}
+
+const actionTypes = {
+ ADD_TOAST: "ADD_TOAST",
+ UPDATE_TOAST: "UPDATE_TOAST",
+ DISMISS_TOAST: "DISMISS_TOAST",
+ REMOVE_TOAST: "REMOVE_TOAST",
+} as const
+
+let count = 0
+
+function genId() {
+ count = (count + 1) % Number.MAX_SAFE_INTEGER
+ return count.toString()
+}
+
+type ActionType = typeof actionTypes
+
+type Action =
+ | {
+ type: ActionType["ADD_TOAST"]
+ toast: ToasterToast
+ }
+ | {
+ type: ActionType["UPDATE_TOAST"]
+ toast: Partial
+ }
+ | {
+ type: ActionType["DISMISS_TOAST"]
+ toastId?: ToasterToast["id"]
+ }
+ | {
+ type: ActionType["REMOVE_TOAST"]
+ toastId?: ToasterToast["id"]
+ }
+
+interface State {
+ toasts: ToasterToast[]
+}
+
+const toastTimeouts = new Map>()
+
+const addToRemoveQueue = (toastId: string) => {
+ if (toastTimeouts.has(toastId)) {
+ return
+ }
+
+ const timeout = setTimeout(() => {
+ toastTimeouts.delete(toastId)
+ dispatch({
+ type: "REMOVE_TOAST",
+ toastId: toastId,
+ })
+ }, TOAST_REMOVE_DELAY)
+
+ toastTimeouts.set(toastId, timeout)
+}
+
+export const reducer = (state: State, action: Action): State => {
+ switch (action.type) {
+ case "ADD_TOAST":
+ return {
+ ...state,
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
+ }
+
+ case "UPDATE_TOAST":
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
+ ),
+ }
+
+ case "DISMISS_TOAST": {
+ const { toastId } = action
+
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
+ // but I'll keep it here for simplicity
+ if (toastId) {
+ addToRemoveQueue(toastId)
+ } else {
+ state.toasts.forEach((toast) => {
+ addToRemoveQueue(toast.id)
+ })
+ }
+
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === toastId || toastId === undefined
+ ? {
+ ...t,
+ open: false,
+ }
+ : t
+ ),
+ }
+ }
+ case "REMOVE_TOAST":
+ if (action.toastId === undefined) {
+ return {
+ ...state,
+ toasts: [],
+ }
+ }
+ return {
+ ...state,
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
+ }
+ }
+}
+
+const listeners: Array<(state: State) => void> = []
+
+let memoryState: State = { toasts: [] }
+
+function dispatch(action: Action) {
+ memoryState = reducer(memoryState, action)
+ listeners.forEach((listener) => {
+ listener(memoryState)
+ })
+}
+
+type Toast = Omit
+
+function toast({ ...props }: Toast) {
+ const id = genId()
+
+ const update = (props: ToasterToast) =>
+ dispatch({
+ type: "UPDATE_TOAST",
+ toast: { ...props, id },
+ })
+ const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id })
+
+ dispatch({
+ type: "ADD_TOAST",
+ toast: {
+ ...props,
+ id,
+ open: true,
+ onOpenChange: (open) => {
+ if (!open) dismiss()
+ },
+ },
+ })
+
+ return {
+ id: id,
+ dismiss,
+ update,
+ }
+}
+
+function useToast() {
+ const [state, setState] = React.useState(memoryState)
+
+ React.useEffect(() => {
+ listeners.push(setState)
+ return () => {
+ const index = listeners.indexOf(setState)
+ if (index > -1) {
+ listeners.splice(index, 1)
+ }
+ }
+ }, [state])
+
+ return {
+ ...state,
+ toast,
+ dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
+ }
+}
+
+export { useToast, toast }
diff --git a/src/lib/cf/codeforcesStanding.ts b/src/lib/cf/codeforcesStanding.ts
deleted file mode 100644
index 3206783f..00000000
--- a/src/lib/cf/codeforcesStanding.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import crypto from "crypto";
-// import * as Helper from "./helper";
-
-export function CodeforcesStanding(
- apiKey: string,
- apiSecret: string,
- contestId: number,
- handles: string[],
-) {
- return {
- /**
- * Generates the API signature required by Codeforces.
- * This function computes a SHA-512 digest of a string composed of a salt, the request, and the API secret.
- * It returns a string in the format: &apiSig=123456
- *
- */
- getSignature(request: string): string {
- const salt = "123456";
- // The string to hash is of the form: "123456/#"
- const toHash = salt + "/" + request + "#" + apiSecret;
- const hash = crypto
- .createHash("sha512")
- .update(toHash, "ascii")
- .digest("hex")
- .toLowerCase();
- return "&apiSig=" + salt + hash;
- },
-
- constructURL(
- unofficial: boolean,
- from: number | undefined,
- count: number | undefined,
- ): string {
- let request = "contest.standings?";
- request += `apiKey=${apiKey}&contestId=${contestId}`;
- if (count != null) request += `&count=${count}`;
-
- if (from != null) request += `&from=${from}`;
-
- if (handles != null && handles.length > 0) {
- // Sort the handles alphabetically and join them with semicolons.
- handles.sort();
- request += `&handles=${handles.join(";")}`;
- }
- request += `&showUnofficial=${unofficial ? "true" : "false"}`;
- request += `&time=${Math.round(Date.now() / 1000)}`;
- // Append the signature computed from the request string.
- const url =
- "https://codeforces.com/api/" + request + this.getSignature(request);
- return url;
- },
- /**
- * Fetches the standings from Codeforces using the constructed URL.
- *
- */
- // public async getStanding(unofficial: boolean = false, from?: number, count?: number): Promise {
- // // TODO add option asManager check for more info @https://codeforces.com/apiHelp/methods#contest.standings
- //
- // const url = this.constructURL(unofficial, from, count);
- // const response = await Helper.getUrlResponse(url);
- // // Assuming the API returns a JSON object with a "result" property.
- // if (response != null) {
- // return response["result"];
- // }
- // return null;
- // }
- };
-}
diff --git a/src/lib/cf/getStandingFromCodeforces.ts b/src/lib/cf/getStandingFromCodeforces.ts
deleted file mode 100644
index 43ec0495..00000000
--- a/src/lib/cf/getStandingFromCodeforces.ts
+++ /dev/null
@@ -1,145 +0,0 @@
-// import { CodeforcesStanding } from "./codeforcesStanding"; // adjust path accordingly
-//
-// // A small delay helper function using a Promise.
-// const sleep = (ms: number): Promise =>
-// new Promise((resolve) => setTimeout(resolve, ms));
-//
-// /**
-// * Returns the complete standing for a contest along with the number of problems.
-// * For every handle, the returned array’s index 0 contains the total number of solved problems,
-// * and indices 1 to n indicate whether the corresponding problem is solved (true/false).
-// *
-// */
-// export async function getStandingFromCodeforces(
-// contestId: number | string,
-// handles: string[],
-// apiKey: string,
-// apiSecret: string
-// ): Promise<[Record, number] | null> {
-// // Convert contestId to a number
-// const contestIdInt =
-// typeof contestId === "string" ? parseInt(contestId) : contestId;
-// if (isNaN(contestIdInt)) {
-// return null;
-// }
-//
-// const result = await getStandingRowsFromCodeforces(
-// contestIdInt,
-// true,
-// handles,
-// apiKey,
-// apiSecret
-// );
-// if (!result || result.length === 0 || result[0] == null) {
-// console.log("failed", result);
-// return null;
-// }
-//
-// const numberOfProblems = result[0]["problemResults"].length;
-// // Create a set of handles (in lowercase) for quick lookup.
-// const ourTrainees = new Set(handles.map((handle) => handle.toLowerCase()));
-//
-// // We'll store the standing as an object where each key (handle) maps to an array.
-// // The first element (index 0) is the total number of problems solved (number),
-// // while indices 1..numberOfProblems are booleans indicating if the problem is solved.
-// const standing: Record = {};
-// // Create a template array: index 0 is 0 (total solved) and others are false.
-// const templateArray: (number | boolean)[] = [0];
-// for (let i = 0; i < numberOfProblems; i++) {
-// templateArray.push(false);
-// }
-//
-// for (const row of result) {
-// const handleFromRow = row?.party?.members?.[0]?.handle;
-// if (typeof handleFromRow !== "string") continue;
-// const lowerHandle = handleFromRow.toLowerCase();
-// if (!ourTrainees.has(lowerHandle)) {
-// continue;
-// }
-// if (!standing[lowerHandle]) {
-// // Use a shallow copy of the template array.
-// standing[lowerHandle] = templateArray.slice();
-// }
-// const problemResults = row["problemResults"];
-// if (!Array.isArray(problemResults)) continue;
-// for (let j = 0; j < numberOfProblems; j++) {
-// if (problemResults[j]["points"] > 0.0) {
-// if (standing[lowerHandle][j + 1] === false) {
-// standing[lowerHandle][j + 1] = true;
-// standing[lowerHandle][0] = (standing[lowerHandle][0] as number) + 1;
-// }
-// }
-// }
-// }
-// return [standing, numberOfProblems];
-// }
-//
-// /**
-// * Retrieves the standing rows from Codeforces.
-// * It first attempts to fetch the standings normally. If that fails, it falls back to a pagination method.
-// */
-// export async function getStandingRowsFromCodeforces(
-// contestId: number | string,
-// unofficial: boolean,
-// handles: string[],
-// apiKey: string,
-// apiSecret: string
-// ): Promise {
-// console.log(
-// `contestId = ${contestId}, unofficial = ${unofficial}, handles = ${handles}, apiKey = ${apiKey}, apiSecret = ${apiSecret}`
-// );
-// const contestIdInt =
-// typeof contestId === "string" ? parseInt(contestId) : contestId;
-// const codeforces = new CodeforcesStanding(
-// apiKey,
-// apiSecret,
-// contestIdInt,
-// handles
-// );
-//
-// const result = await codeforces.getStanding(unofficial, undefined, undefined);
-// if (result != null) {
-// return result["rows"];
-// }
-// // If the initial attempt fails, wait one second and try pagination.
-// await sleep(1000);
-// return getStandingRowsFromCodeforcesWithPagination(
-// contestIdInt,
-// unofficial,
-// apiKey,
-// apiSecret
-// );
-// }
-//
-// /**
-// * Retrieves Codeforces standing rows using pagination.
-// * It repeatedly fetches batches of rows until no more rows are returned.
-// *
-// */
-// export async function getStandingRowsFromCodeforcesWithPagination(
-// contestId: number | string,
-// unofficial: boolean,
-// apiKey: string,
-// apiSecret: string
-// ): Promise {
-// const contestIdInt =
-// typeof contestId === "string" ? parseInt(contestId) : contestId;
-// // Note: When paginating, we don’t need to filter by handles.
-// const codeforces = new CodeforcesStanding(
-// apiKey,
-// apiSecret,
-// contestIdInt,
-// []
-// );
-// const count = 5000;
-// let rows: any[] = [];
-// for (let i = 1; ; i += count) {
-// await sleep(100);
-// const result = await codeforces.getStanding(unofficial, i, count);
-// if (!result || !result["rows"] || result["rows"].length === 0) {
-// break;
-// }
-// rows = rows.concat(result["rows"]);
-// }
-// return rows;
-// }
diff --git a/src/lib/cf/helper.ts b/src/lib/cf/helper.ts
deleted file mode 100644
index cb9d1d9e..00000000
--- a/src/lib/cf/helper.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Converts a byte array to a hexadecimal string.
- */
-export function toHexString(byteArray: number[] | Uint8Array): string {
- return Array.from(byteArray, (byte) =>
- ("0" + (byte & 0xff).toString(16)).slice(-2),
- ).join("");
-}
-
-/**
- * Fetches a URL using the specified HTTP method and returns the parsed JSON response.
- */
-// export async function getUrlResponse(
-// url: string,
-// httpMethod: string = "GET",
-// ): Promise {
-// try {
-// const response = await fetch(url, { method: httpMethod });
-// if (!response.ok) {
-// console.error("Error fetching URL:", response.statusText);
-// return null;
-// }
-// return await response.json();
-// } catch (error) {
-// console.error("Exception occurred while fetching URL:", error);
-// return null;
-// }
-// }
diff --git a/src/lib/const/block-error-messages.ts b/src/lib/const/block-error-messages.ts
new file mode 100644
index 00000000..4367bbdb
--- /dev/null
+++ b/src/lib/const/block-error-messages.ts
@@ -0,0 +1,8 @@
+export const BLOCK_ERROR_MESSAGES = {
+ TITLE_REQUIRED: 'Title is required',
+ TITLE_TOO_LONG: 'Title is too long',
+ DESCRIPTION_REQUIRED: 'Description is required',
+ DESCRIPTION_TOO_LONG: 'Description is too long',
+ DATE_INVALID: 'Date must be in the future',
+
+} as const;
\ No newline at end of file
diff --git a/src/lib/const/communities.ts b/src/lib/const/communities.ts
new file mode 100644
index 00000000..6830bfdf
--- /dev/null
+++ b/src/lib/const/communities.ts
@@ -0,0 +1,13 @@
+const communities = [
+ "Icpc Assiut Community",
+ "Icpc Minya Community",
+ "Icpc Sohag Community",
+ "Icpc Luxor Community",
+ "Icpc Assiut National Community",
+ "Icpc EELU Community",
+ "Icpc SVU Community",
+] as const;
+
+
+
+export default communities;
diff --git a/src/lib/const/countries.ts b/src/lib/const/countries.ts
index 1e0da841..81fbfc78 100644
--- a/src/lib/const/countries.ts
+++ b/src/lib/const/countries.ts
@@ -204,5 +204,4 @@ const countries = [
"Zimbabwe",
] as const;
-
export default countries;
diff --git a/src/lib/const/error-messages.ts b/src/lib/const/error-messages.ts
new file mode 100644
index 00000000..c86c84eb
--- /dev/null
+++ b/src/lib/const/error-messages.ts
@@ -0,0 +1,105 @@
+// Username errors
+const userExist: string = "User already exists";
+const usernameRequired: string = "Username is required.";
+const usernameContainsBannedWords: string = "Username contains banned words.";
+const usernameTooShort: string = "Username too short.";
+const usernameInvalidFormat: string = "Username must contain only letters, numbers, and underscores.";
+const usernameTooLong = "Username too long";
+
+// Email errors
+const invalidEmail: string = "Invalid email format.";
+const emailExist: string = "Email already in use.";
+const emailRequired: string = "Email is required.";
+const emailTooLong = "Email too long";
+const unsupportedEmailDomain: string = "Unsupported email domain.";
+
+// Password errors
+const invalidPassword: string = "Password must be at least 8 characters long and include at least one uppercase letter, one lowercase letter, one number, and one special character.";
+const passwordRequired: string = "Password is required.";
+const confirmPasswordRequired: string = "Confirm Password is required.";
+const passwordExceedsMaxLength: string = "Password exceeds maximum length.";
+const passwordContainsUsername = "Password cannot contain the username.";
+const passwordContainsEmail = "Password cannot contain the email.";
+const passwordInvalidFormat = "Password must include an uppercase letter, a lowercase letter, a number, and a special character, with no spaces.";
+const passwordMustMatch: string = "Passwords must match.";
+const passwordMinLength: string = "Password must be at least 8 characters long.";
+
+// Codeforces Handle errors
+const invalidCodeforces: string = "Invalid Codeforces handle.";
+const codeforcesHandleRequired: string = "Codeforces Handle is required.";
+const codeforcesHandleRequiredExist: string = "Phone number already in use.";
+
+// Phone Number errors
+const invalidPhoneNumber: string = "Invalid phone number.";
+const phoneNumberRequired: string = "Phone Number is required.";
+const phoneNumberExist: string = "Phone number already in use.";
+const phoneNumberTooShort: string = "Phone number too short.";
+const phoneNumberTooLong: string = "Phone number too long.";
+const phoneNumberInvalid: string = "Phone number must be a valid Egyptian number (starts with +20).";
+
+// Terms and Conditions errors
+const termsNotAccepted: string = "You must agree to the terms of service.";
+
+// General errors
+const invalidCharacters: string = "Invalid characters.";
+const networkError : string = "Network Error occurred.";
+
+// UserFulldataValidations errors
+const academicYearInvalid = "Academic Year must be a number between 1 and 7";
+const academicYearNotNumber = "Academic Year must be Number";
+const academicYearNotPositive = "Academic Year must be Positive";
+const academicYearOutOfRange = "Academic Year must be between 1 and 5";
+const englishNameTooShort = "too short";
+const englishNameInvalid = "Name must contain only letters";
+const arabicNameTooShort = "too short";
+const arabicNameInvalid = "Name must contain only Arabic letters";
+const nationalIdInvalidLength = "Egyptian National ID must be exactly 14 digits";
+const nationalIdInvalid = "Invalid National ID";
+
+const successMessage = "Registration successful. Please check your email for verification.";
+
+export {
+ userExist,
+ usernameRequired,
+ usernameInvalidFormat,
+ usernameContainsBannedWords,
+ usernameTooShort,
+ invalidEmail,
+ emailExist,
+ emailRequired,
+ emailTooLong,
+ unsupportedEmailDomain,
+ invalidPassword,
+ passwordRequired,
+ confirmPasswordRequired,
+ passwordExceedsMaxLength,
+ invalidCodeforces,
+ codeforcesHandleRequired,
+ codeforcesHandleRequiredExist,
+ invalidPhoneNumber,
+ phoneNumberRequired,
+ phoneNumberExist,
+ phoneNumberTooShort,
+ phoneNumberTooLong,
+ phoneNumberInvalid,
+ termsNotAccepted,
+ invalidCharacters,
+ networkError,
+ passwordContainsUsername,
+ passwordContainsEmail,
+ academicYearInvalid,
+ academicYearNotNumber,
+ academicYearNotPositive,
+ academicYearOutOfRange,
+ englishNameTooShort,
+ englishNameInvalid,
+ arabicNameTooShort,
+ arabicNameInvalid,
+ nationalIdInvalidLength,
+ nationalIdInvalid,
+ usernameTooLong,
+ passwordInvalidFormat,
+ passwordMustMatch,
+ passwordMinLength,
+ successMessage
+};
diff --git a/src/lib/const/index.ts b/src/lib/const/index.ts
index f9d8a481..5db805ed 100644
--- a/src/lib/const/index.ts
+++ b/src/lib/const/index.ts
@@ -3,6 +3,7 @@ import departments from "@/lib/const/departments";
import countries from "@/lib/const/countries";
import validGovernorateCodes from "@/lib/const/governorateCodes";
import universities from "@/lib/const/universities";
+import communities from "@/lib/const/communities";
export {
faculties,
@@ -10,4 +11,5 @@ export {
countries,
validGovernorateCodes,
universities,
+ communities,
};
diff --git a/src/lib/const/training-error-messages.ts b/src/lib/const/training-error-messages.ts
new file mode 100644
index 00000000..fe0f29ae
--- /dev/null
+++ b/src/lib/const/training-error-messages.ts
@@ -0,0 +1,13 @@
+export const TRAINING_ERROR_MESSAGES = {
+ TITLE_REQUIRED: 'Title is required',
+ TITLE_TOO_SHORT: 'Title must be more than 3 characters',
+ TITLE_TOO_LONG: 'Title must be less than 128 characters',
+ DESCRIPTION_REQUIRED: 'Description is required',
+ DESCRIPTION_TOO_SHORT: 'Description must be more than 3 characters',
+ DESCRIPTION_TOO_LONG: 'Description must be less than 512 characters',
+ START_DATE_REQUIRED: 'Start date is required',
+ START_DATE_INVALID: 'Start date must be in the future',
+ DURATION_REQUIRED: 'Duration is required',
+ DURATION_INVALID: 'Duration must be a positive number',
+ STATUS_INVALID: 'Invalid status',
+};
\ No newline at end of file
diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts
index e2be866c..9333e713 100644
--- a/src/lib/db/index.ts
+++ b/src/lib/db/index.ts
@@ -2,14 +2,13 @@ import "server-only";
import { drizzle } from "drizzle-orm/node-postgres";
import { Pool } from "pg";
import { EmailAuth } from "./schema/user/EmailAuth";
-import { lt, sql } from "drizzle-orm";
+import { eq, sql } from "drizzle-orm";
import { Users } from "./schema/user/Users";
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
-// Test the connection
pool
.connect()
.then(() => {
@@ -23,14 +22,14 @@ export const db = drizzle(pool, {
casing: "snake_case",
});
-// this is temporary, will be moved to a cron job
+/// this is temporary, will be moved to a cron job
async function deleteExpiredLogs() {
- const user = await db
+ const userArr = await db
.delete(EmailAuth)
.where(sql`expires_at < now()`)
.returning();
- if (user.length > 0) {
- await db.delete(Users).where(lt(Users.userId, user[0].userId)).execute();
+ if (userArr.length > 0) {
+ await db.delete(Users).where(eq(Users.userId, userArr[0].userId)).execute();
}
}
diff --git a/src/lib/db/schema/training/Applications.ts b/src/lib/db/schema/training/Applications.ts
new file mode 100644
index 00000000..3e4e8e4a
--- /dev/null
+++ b/src/lib/db/schema/training/Applications.ts
@@ -0,0 +1,40 @@
+import {
+ integer,
+ pgTable,
+ uuid,
+ timestamp,
+ serial,
+ varchar,
+ unique,
+} from "drizzle-orm/pg-core";
+
+import { Users } from "../user/Users";
+import { Trainings } from "./Trainings";
+
+/**
+ * Applications is the table that holds the applications for a training
+ */
+export const Applications = pgTable(
+ "applications",
+ {
+ applicationId: serial().primaryKey(),
+ userId: uuid()
+ .references(() => Users.userId, {
+ onDelete: "cascade",
+ onUpdate: "cascade",
+ })
+ .notNull(),
+
+ trainingId: integer()
+ .references(() => Trainings.trainingId, {
+ onDelete: "cascade",
+ onUpdate: "cascade",
+ })
+ .notNull(),
+ status: varchar({ length: 20 }),
+ appliedAt: timestamp().notNull().defaultNow(),
+ updatedAt: timestamp().notNull().defaultNow(),
+ description: varchar({ length: 512 }).notNull(),
+ },
+ (table) => [unique().on(table.userId, table.trainingId)]
+);
diff --git a/src/lib/db/schema/training/AttendanceLogs.ts b/src/lib/db/schema/training/AttendanceLogs.ts
deleted file mode 100644
index de78f630..00000000
--- a/src/lib/db/schema/training/AttendanceLogs.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import {
- foreignKey,
- integer,
- pgTable,
- serial,
- timestamp,
- varchar,
-} from "drizzle-orm/pg-core";
-
-import { Staff } from "./Staff";
-import { Trainees } from "./Trainees";
-import { Sessions } from "./Sessions";
-type logType = "checkin" | "checkout";
-
-export const AttendanceLogs = pgTable(
- "attendance_logs",
- {
- attendanceLogId: serial().primaryKey(),
- staffId: integer()
- .notNull(),
- traineeId: integer()
- .notNull(),
- trainingId: integer()
- .notNull(),
- sessionId: integer()
- .references(() => Sessions.sessionId)
- .notNull(),
-
- logType: varchar({ length: 40 }).$type().notNull(),
- logTime: timestamp().defaultNow(),
- logRemarks: varchar(),
- },
- (table) => [
- foreignKey({
- columns: [table.traineeId, table.trainingId],
- foreignColumns: [Trainees.userId, Trainees.trainingId],
- name: "fk_attendance_trainees",
- }),
- foreignKey({
- columns: [table.staffId, table.trainingId],
- foreignColumns: [Staff.userId, Staff.trainingId],
- name: "fk_attendance_staff",
- }),
- ],
-);
diff --git a/src/lib/db/schema/training/Blocks.ts b/src/lib/db/schema/training/Blocks.ts
new file mode 100644
index 00000000..c198f027
--- /dev/null
+++ b/src/lib/db/schema/training/Blocks.ts
@@ -0,0 +1,47 @@
+import {
+ primaryKey,
+ timestamp,
+ integer,
+ pgTable,
+ varchar,
+ boolean,
+ jsonb,
+} from "drizzle-orm/pg-core";
+
+import { Trainings } from "./Trainings";
+import { MaterialsEntry } from "@/lib/types/Training";
+
+/**
+ * block is the smallest unit of a training
+ */
+export const Blocks = pgTable(
+ "blocks",
+ {
+ trainingId: integer()
+ .references(() => Trainings.trainingId)
+ .notNull(),
+
+ // blockNumber is the 0 - training.duration
+ // where 0 is the default block for the training
+ // and training.duration is the final block
+ blockNumber: integer().notNull(),
+
+ title: varchar({ length: 128 }).notNull(),
+
+ description: varchar({ length: 512 }).notNull(),
+
+ hidden: boolean().default(false).notNull(),
+
+ date: timestamp().defaultNow().notNull(),
+
+ material: jsonb().default([]).$type().notNull(),
+
+ deleted: timestamp(),
+ },
+ (table) => [
+ primaryKey({
+ name: "block_pkey",
+ columns: [table.blockNumber, table.trainingId],
+ }),
+ ],
+);
diff --git a/src/lib/db/schema/training/Contests.ts b/src/lib/db/schema/training/Contests.ts
new file mode 100644
index 00000000..83183f44
--- /dev/null
+++ b/src/lib/db/schema/training/Contests.ts
@@ -0,0 +1,50 @@
+import {
+ primaryKey,
+ timestamp,
+ integer,
+ pgTable,
+ varchar,
+ foreignKey,
+ jsonb,
+} from "drizzle-orm/pg-core";
+
+import { Blocks } from "./Blocks";
+import { StandingEntry } from "@/lib/types/Training";
+type Judge = "cf" | "vj";
+
+/**
+ * Contests is the table that holds the contests for a training
+ */
+export const Contests = pgTable(
+ "contests",
+ {
+ trainingId: integer().notNull(),
+ // reference ./Blocks.ts -> Blocks.blockNumber
+ blockNumber: integer().notNull(),
+ contestId: varchar({ length: 32 }).notNull(),
+
+ groupId: varchar({ length: 32 }), // if group contest either codeforces or vjudge could be null
+
+ judge: varchar({ length: 2 }).notNull().$type(), // codeforces or vjudge
+ type: varchar({ length: 32 }).notNull(), // practice or contest => for points calculation
+ title: varchar({ length: 128 }).notNull(),
+ description: varchar({ length: 512 }).default("").notNull(),
+
+ standing: jsonb().$type(),
+ pointPerProblem: integer().default(20).notNull(),
+ firstPoints: integer().default(1000).notNull(),
+ calcSys: varchar({ length: 32 }).default("90%").notNull(),
+ date: timestamp().notNull(),
+ deleted: timestamp(),
+ },
+ (table) => [
+ primaryKey({
+ name: "Contest_pkey",
+ columns: [table.blockNumber, table.trainingId, table.contestId],
+ }),
+ foreignKey({
+ columns: [table.trainingId, table.blockNumber],
+ foreignColumns: [Blocks.trainingId, Blocks.blockNumber],
+ }),
+ ],
+);
diff --git a/src/lib/db/schema/training/MentorTraineeHistory.ts b/src/lib/db/schema/training/MentorTraineeHistory.ts
new file mode 100644
index 00000000..ece183bc
--- /dev/null
+++ b/src/lib/db/schema/training/MentorTraineeHistory.ts
@@ -0,0 +1,55 @@
+import {
+ integer,
+ pgTable,
+ primaryKey,
+ uuid,
+ timestamp,
+ foreignKey,
+} from "drizzle-orm/pg-core";
+
+import { Trainings } from "./Trainings";
+import { Staff } from "./Staff";
+import { Trainees } from "./Trainees";
+
+/**
+ * Represents the historical records of mentor and trainee relationships within a specific training session.
+ * This table keeps track of which mentor was assigned to which trainee and in which training,
+ * along with the duration of the mentorship.
+ */
+export const MentorTraineeHistory = pgTable(
+ "mentor_trainee_history",
+ {
+ mentorId: uuid().notNull(),
+
+ traineeId: uuid().notNull(),
+
+ // Identifier of the training session in which the mentorship took place.
+ trainingId: integer()
+ .references(() => Trainings.trainingId, {
+ onDelete: "cascade",
+ onUpdate: "cascade",
+ })
+ .notNull(),
+
+ startDate: timestamp().notNull(),
+ endDate: timestamp(),
+ },
+ (table) => [
+ primaryKey({
+ columns: [
+ table.trainingId,
+ table.mentorId,
+ table.traineeId,
+ table.startDate,
+ ],
+ }),
+ foreignKey({
+ columns: [table.mentorId, table.trainingId],
+ foreignColumns: [Staff.userId, Staff.trainingId],
+ }),
+ foreignKey({
+ columns: [table.traineeId, table.trainingId],
+ foreignColumns: [Trainees.userId, Trainees.trainingId],
+ }),
+ ]
+);
diff --git a/src/lib/db/schema/training/Sessions.ts b/src/lib/db/schema/training/Sessions.ts
deleted file mode 100644
index b41b4898..00000000
--- a/src/lib/db/schema/training/Sessions.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import {
- timestamp,
- integer,
- pgTable,
- serial,
- varchar,
-} from "drizzle-orm/pg-core";
-
-import { Trainings } from "./Trainings";
-
-export const Sessions = pgTable("sessions", {
- // 32 bits => (8 bits weeknumber + 24 bits pseudo-random number)
- sessionId: integer().primaryKey(),
- trainingId: serial()
- .references(() => Trainings.trainingId)
- .notNull(),
- dateTime: timestamp().notNull(),
- title: varchar().notNull(),
- description: varchar().notNull(),
-});
diff --git a/src/lib/db/schema/training/Staff.ts b/src/lib/db/schema/training/Staff.ts
index f4c49ffe..d5ece5e4 100644
--- a/src/lib/db/schema/training/Staff.ts
+++ b/src/lib/db/schema/training/Staff.ts
@@ -3,8 +3,9 @@ import {
integer,
pgTable,
primaryKey,
- foreignKey,
- unique,
+ timestamp,
+ uuid,
+ index,
} from "drizzle-orm/pg-core";
import { Users } from "../user/Users";
@@ -13,20 +14,32 @@ import { Trainings } from "./Trainings";
export const Staff = pgTable(
"staff",
{
- userId: integer().notNull(),
- trainingId: integer().notNull(),
- mentor: boolean().default(false),
- coHead: boolean().default(false),
- instructor: boolean().default(false),
- coach: boolean().default(false),
+ userId: uuid()
+ .references(() => Users.userId, {
+ onDelete: "cascade",
+ onUpdate: "cascade",
+ })
+ .notNull(),
+
+ trainingId: integer()
+ .references(() => Trainings.trainingId, {
+ onDelete: "cascade",
+ onUpdate: "cascade",
+ })
+ .notNull(),
+
+ mentor: boolean().default(false).notNull(),
+ problemSetter: boolean().default(false).notNull(),
+ instructor: boolean().default(false).notNull(),
+ coHead: boolean().default(false).notNull(),
+ manager: boolean().default(false).notNull(),
+ deleted: timestamp(),
},
(table) => [
- primaryKey({ columns: [table.userId, table.trainingId], name: "staff_pk" }),
- unique().on(table.userId, table.trainingId),
- foreignKey({ columns: [table.userId], foreignColumns: [Users.userId] }),
- foreignKey({
- columns: [table.trainingId],
- foreignColumns: [Trainings.trainingId],
+ primaryKey({
+ columns: [table.userId, table.trainingId],
+ name: "staff_pk",
}),
- ],
+ index("mentor_idx").on(table.mentor),
+ ]
);
diff --git a/src/lib/db/schema/training/Trainees.ts b/src/lib/db/schema/training/Trainees.ts
index 4ac50fe6..a19ce1e2 100644
--- a/src/lib/db/schema/training/Trainees.ts
+++ b/src/lib/db/schema/training/Trainees.ts
@@ -1,17 +1,46 @@
-import { integer, pgTable , primaryKey } from "drizzle-orm/pg-core";
+import {
+ integer,
+ pgTable,
+ primaryKey,
+ uuid,
+ timestamp,
+ foreignKey,
+} from "drizzle-orm/pg-core";
import { Users } from "../user/Users";
import { Trainings } from "./Trainings";
+import { Staff } from "./Staff";
+
+/**
+ * Trainees is the table that holds the trainees for a training
+ */
export const Trainees = pgTable(
"trainees",
{
- userId: integer()
- .references(() => Users.userId)
+ userId: uuid()
+ .references(() => Users.userId, {
+ onDelete: "cascade",
+ onUpdate: "cascade",
+ })
.notNull(),
+
trainingId: integer()
- .references(() => Trainings.trainingId)
+ .references(() => Trainings.trainingId, {
+ onDelete: "cascade",
+ onUpdate: "cascade",
+ })
.notNull(),
+
+ mentorId: uuid().notNull(),
+ mentor_assigned_date: timestamp().defaultNow().notNull(),
+ deleted: timestamp(),
},
- (table) => [primaryKey({ columns: [table.userId, table.trainingId] })],
+ (table) => [
+ primaryKey({ columns: [table.userId, table.trainingId] }),
+ foreignKey({
+ columns: [table.mentorId, table.trainingId],
+ foreignColumns: [Staff.userId, Staff.trainingId],
+ }),
+ ],
);
diff --git a/src/lib/db/schema/training/Trainings.ts b/src/lib/db/schema/training/Trainings.ts
index 53a4d216..4b80ac6e 100644
--- a/src/lib/db/schema/training/Trainings.ts
+++ b/src/lib/db/schema/training/Trainings.ts
@@ -1,15 +1,58 @@
-import { integer, pgTable, varchar, date, serial } from "drizzle-orm/pg-core";
-
+import {
+ integer,
+ pgTable,
+ varchar,
+ date,
+ serial,
+ uuid,
+ timestamp,
+ jsonb,
+} from "drizzle-orm/pg-core";
+import { LeaderBoard } from "@/lib/types/Training";
import { Users } from "../user/Users";
-type Status = "active" | "inactive";
+import { citext } from "@/lib/db/util";
+
+export type Status = "active" | "roadmap" | "private" | "over";
+
+export type StandingView =
+ | "name"
+ | "cfHandle"
+ | "vjudge"
+ | "gmail"
+ | "level"
+ | "university"
+ | "faculty";
+
+/**
+ * Trainings is the table that holds the training information
+ */
export const Trainings = pgTable("trainings", {
trainingId: serial().primaryKey(),
- headId: integer()
- .references(() => Users.userId)
+ headId: uuid()
+ .references(() => Users.userId, {
+ onDelete: "restrict",
+ onUpdate: "cascade",
+ })
.notNull(),
- title: varchar().notNull(),
- description: varchar().notNull(),
+
+ chiefJudge: uuid()
+ .references(() => Users.userId, {
+ onDelete: "restrict",
+ onUpdate: "cascade",
+ })
+ .notNull(),
+
+ title: citext({ length: 128 }).notNull().unique(),
+ description: varchar({ length: 512 }).notNull(),
+ leaderBoard: jsonb().$type(),
+ /// saves which attributes of standing are visible to trainees
+ standingView: jsonb()
+ .notNull()
+ .default(["name", "handle", "numberofsolved", "mentor", "level"])
+ .$type(),
startDate: date().notNull(),
- duration: integer(), // number of weeks/days
- status: varchar({ length: 40 }).$type().notNull().default("active"),
+ duration: integer().notNull().default(1), // number of weeks/days
+ status: varchar({ length: 20 }).$type().default("private").notNull(),
+ deleted: timestamp(),
});
+
diff --git a/src/lib/db/schema/user/Cities.ts b/src/lib/db/schema/user/Cities.ts
new file mode 100644
index 00000000..be92187c
--- /dev/null
+++ b/src/lib/db/schema/user/Cities.ts
@@ -0,0 +1,7 @@
+import { pgTable, serial } from "drizzle-orm/pg-core";
+import { citext } from "@/lib/db/util";
+
+export const Cities = pgTable("cities", {
+ id: serial().primaryKey(),
+ name: citext({ length: 60 }).notNull().unique(),
+});
diff --git a/src/lib/db/schema/user/Communities.ts b/src/lib/db/schema/user/Communities.ts
new file mode 100644
index 00000000..3f93e22f
--- /dev/null
+++ b/src/lib/db/schema/user/Communities.ts
@@ -0,0 +1,7 @@
+import { pgTable, serial } from "drizzle-orm/pg-core";
+import { citext } from "@/lib/db/util";
+
+export const Communities = pgTable("communities", {
+ id: serial().primaryKey(),
+ name: citext({ length: 60 }).notNull().unique(),
+});
diff --git a/src/lib/db/schema/user/Countries.ts b/src/lib/db/schema/user/Countries.ts
new file mode 100644
index 00000000..ef77c5ba
--- /dev/null
+++ b/src/lib/db/schema/user/Countries.ts
@@ -0,0 +1,7 @@
+import { pgTable, serial } from "drizzle-orm/pg-core";
+import { citext } from "@/lib/db/util";
+
+export const Countries = pgTable("countries", {
+ id: serial().primaryKey(),
+ name: citext({ length: 60 }).notNull().unique(),
+});
diff --git a/src/lib/db/schema/user/Departments.ts b/src/lib/db/schema/user/Departments.ts
new file mode 100644
index 00000000..881d96cc
--- /dev/null
+++ b/src/lib/db/schema/user/Departments.ts
@@ -0,0 +1,7 @@
+import { pgTable, serial } from "drizzle-orm/pg-core";
+import { citext } from "@/lib/db/util";
+
+export const Departments = pgTable("departments", {
+ id: serial().primaryKey(),
+ name: citext({ length: 60 }).notNull().unique(),
+});
diff --git a/src/lib/db/schema/user/EmailAuth.ts b/src/lib/db/schema/user/EmailAuth.ts
index d4f2fd03..2d44c412 100644
--- a/src/lib/db/schema/user/EmailAuth.ts
+++ b/src/lib/db/schema/user/EmailAuth.ts
@@ -1,9 +1,9 @@
import { sql } from "drizzle-orm";
-import { integer, pgTable, varchar, date } from "drizzle-orm/pg-core";
+import { pgTable, varchar, date, uuid } from "drizzle-orm/pg-core";
export const EmailAuth = pgTable("email_auth", {
- token: varchar().notNull(),
- userId: integer().primaryKey(),
+ userId: uuid().primaryKey(),
+ token: varchar().notNull(), // length ?
expiresAt: date()
.default(sql`now() + interval '7 day'`)
.notNull(),
diff --git a/src/lib/db/schema/user/Faculties.ts b/src/lib/db/schema/user/Faculties.ts
new file mode 100644
index 00000000..d00156b2
--- /dev/null
+++ b/src/lib/db/schema/user/Faculties.ts
@@ -0,0 +1,7 @@
+import { pgTable, serial } from "drizzle-orm/pg-core";
+import { citext } from "@/lib/db/util";
+
+export const Faculties = pgTable("faculties", {
+ id: serial().primaryKey(),
+ name: citext({ length: 60 }).notNull().unique(),
+});
diff --git a/src/lib/db/schema/user/Institutes.ts b/src/lib/db/schema/user/Institutes.ts
new file mode 100644
index 00000000..b8e8b593
--- /dev/null
+++ b/src/lib/db/schema/user/Institutes.ts
@@ -0,0 +1,7 @@
+import { pgTable, serial } from "drizzle-orm/pg-core";
+import { citext } from "@/lib/db/util";
+
+export const Institutes = pgTable("institutes", {
+ id: serial().primaryKey(),
+ name: citext({ length: 60 }).notNull().unique(),
+});
diff --git a/src/lib/db/schema/user/ResetPassword.ts b/src/lib/db/schema/user/ResetPassword.ts
new file mode 100644
index 00000000..f81caa65
--- /dev/null
+++ b/src/lib/db/schema/user/ResetPassword.ts
@@ -0,0 +1,14 @@
+import { char, pgTable, timestamp, uuid } from "drizzle-orm/pg-core";
+import { Users } from "./Users";
+import { sql } from "drizzle-orm";
+
+
+export const ResetPassword = pgTable("reset_password", {
+ userId: uuid().primaryKey().references(() => Users.userId, {
+ onDelete: "no action",
+ onUpdate: "no action"
+ }).notNull(),
+ token: char({ length: 25 }).notNull(),
+ endAt: timestamp().default(sql`now() + interval '1 day'`).notNull(),
+
+})
diff --git a/src/lib/db/schema/user/Tasks.ts b/src/lib/db/schema/user/Tasks.ts
deleted file mode 100644
index 7fa66d8e..00000000
--- a/src/lib/db/schema/user/Tasks.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import {
- varchar,
- integer,
- pgTable,
- serial,
- timestamp,
- foreignKey,
-} from "drizzle-orm/pg-core";
-
-import { Trainees } from "../training/Trainees";
-import { Staff } from "../training/Staff";
-
-type States = "pending" | "in_progress" | "done" | "deleted";
-export const Tasks = pgTable(
- "tasks",
- {
- taskId: serial().primaryKey(),
- title: varchar().notNull(),
- description: varchar().notNull(),
- trainingId: integer().default(0),
- traineeId: integer().notNull(),
- staffId: integer().notNull(),
- state: varchar({ length: 40 }).$type().notNull().default("pending"),
- creationTime: timestamp().defaultNow(),
- deadline: timestamp().notNull(),
- },
- (table) => [
- foreignKey({
- columns: [table.traineeId, table.trainingId],
- foreignColumns: [Trainees.userId, Trainees.trainingId],
- }),
- foreignKey({
- columns: [table.staffId, table.trainingId],
- foreignColumns: [Staff.userId, Staff.trainingId],
- }),
- ],
-);
diff --git a/src/lib/db/schema/user/Users.ts b/src/lib/db/schema/user/Users.ts
index de93609c..2927de87 100644
--- a/src/lib/db/schema/user/Users.ts
+++ b/src/lib/db/schema/user/Users.ts
@@ -1,29 +1,30 @@
import {
pgTable,
- serial,
+ uuid,
varchar,
timestamp,
- boolean,
- char,
uniqueIndex,
} from "drizzle-orm/pg-core";
+import { citext } from "@/lib/db/util";
+
type Role = "admin" | "user" | "coach";
export const Users = pgTable(
"users",
{
- userId: serial().primaryKey(),
- username: varchar().notNull().unique(),
- password: varchar().notNull().unique(),
+ userId: uuid().primaryKey().defaultRandom(),
+ username: citext().notNull().unique(),
+ password: varchar().notNull(),// TBD make length 80 ?
+ gmail: citext().notNull().unique(),
+ cfHandle: citext().notNull().unique(),
+ vjHandle: citext().unique(),
- gmail: varchar().notNull().unique(),
- cfHandle: varchar().notNull().unique(),
- phoneNumber: char({ length: 11 }).notNull().unique(),
+ // international numbers could be accepted in the future
+ phoneNumber: varchar({ length: 15 }).notNull(),
// set by admin and the server
role: varchar({ length: 40 }).$type().default("user").notNull(),
- lastOnline: timestamp().defaultNow(),
- isVerified: boolean().default(false).notNull(),
- deleted: boolean().default(false).notNull(),
+ deleted: timestamp(), // null means otherwise
},
+ // makes sure that the username is unique and searches are faster
(table) => [uniqueIndex("users_username_idx").on(table.username)],
);
diff --git a/src/lib/db/schema/user/UsersFullData.ts b/src/lib/db/schema/user/UsersFullData.ts
index 4604819a..1864dbad 100644
--- a/src/lib/db/schema/user/UsersFullData.ts
+++ b/src/lib/db/schema/user/UsersFullData.ts
@@ -4,69 +4,84 @@ import {
date,
integer,
pgTable,
- uniqueIndex,
+ uuid,
varchar,
+ timestamp,
} from "drizzle-orm/pg-core";
import { Users } from "./Users";
+import { Cities } from "./Cities";
+import { Departments } from "./Departments";
+import { Faculties } from "./Faculties";
+import { Institutes } from "./Institutes";
+import { Countries } from "./Countries";
+import { Communities } from "./Communities";
+import { citext } from "@/lib/db/util";
-export const UsersFullData = pgTable(
- "users_full_data",
- {
- userId: integer()
- .primaryKey()
- .references(() => Users.userId, {
- onDelete: "cascade",
- onUpdate: "cascade",
- }),
- username: varchar()
- .notNull()
- .references(() => Users.username, {
- onUpdate: "cascade",
- onDelete: "cascade",
- }),
- cfHandle: varchar()
- .notNull()
- .references(() => Users.cfHandle, {
- onUpdate: "cascade",
- onDelete: "cascade",
- }),
+export const UsersFullData = pgTable("users_full_data", {
+ userId: uuid()
+ .primaryKey()
+ .references(() => Users.userId, {
+ onDelete: "cascade",
+ onUpdate: "cascade",
+ }),
- /* Academic */
- university: varchar(),
- faculty: varchar(),
- department: varchar(),
- academicYear: integer(),
- graduationYear: date(),
+ /* Academic */
+ instituteId: integer().references(() => Institutes.id, {
+ onDelete: "set null",
+ onUpdate: "cascade",
+ }),
+ facultyId: integer().references(() => Faculties.id, {
+ onDelete: "set null",
+ onUpdate: "cascade",
+ }),
+ departmentId: integer().references(() => Departments.id, {
+ onDelete: "set null",
+ onUpdate: "cascade",
+ }),
+ communityId: integer().references(() => Communities.id, {
+ onDelete: "set null",
+ onUpdate: "cascade",
+ }),
+ academicYear: integer(),
+ graduationDate: date(),
- /* handles */
- vjudge: varchar(),
- atcoder: varchar(),
- topcoder: varchar(),
- spoj: varchar(),
- codechef: varchar(),
- csacademy: varchar(),
- leetcode: varchar(),
- cses: varchar(),
+ /* handles */
+ atcoder: citext(),
+ codechef: citext(),
+ leetcode: citext(),
+ cses: citext(),
- /* Personal */
- nameEnFirst: varchar(),
- nameEnLast: varchar(),
- nameAR1: varchar(),
- nameAR2: varchar(),
- nameAR3: varchar(),
- nameAR4: varchar(),
- nationalID: char({ length: 14 }),
- country: varchar(),
- city: varchar(),
- isMale: boolean(),
- imageURL: varchar(),
+ /* Personal */
+ firstNameEn: varchar({ length: 20 }),
+ lastNameEn: varchar({ length: 20 }),
+ nameAR1: varchar({ length: 20 }),
+ nameAR2: varchar({ length: 20 }),
+ nameAR3: varchar({ length: 20 }),
+ nameAR4: varchar({ length: 20 }),
+ nationalId: char({ length: 14 }).unique(), // EG
+ countryId: integer().references(() => Countries.id, {
+ onDelete: "set null",
+ onUpdate: "cascade",
+ }),
+ cityId: integer().references(() => Cities.id, {
+ onDelete: "set null",
+ onUpdate: "cascade",
+ }),
+ isMale: boolean(),
+ imageUrl: varchar({ length: 255 }),
+ whatsappPhoneNumber: varchar({ length: 15 }),
+ /* Socials */
+ facebook: varchar({ length: 128 }), // facebook link||id to profile
+ linkedIn: varchar({ length: 30 }), // linkedin username 29 mx length
+ twitter: varchar({ length: 16 }), // twitter username 15 mx length
+ github: varchar({ length: 40 }), // github username 39 mx length
+ telegram: varchar({ length: 32 }), // telegram username
- /* Socials */
- facebook: varchar(), // link to facebook profile
- linkedIn: varchar(), // link to linkedIn profile
- twitter: varchar(), // link to twitter profile
- github: varchar(), // link to github profile
- },
- (table) => [uniqueIndex("users_full_data_username_idx").on(table.username)],
-);
+ /* server stuff */
+ visibilityMask: integer().default(0), // 1 means hide field
+ registrationDate: timestamp().defaultNow(),
+});
+
+// TODO make sure all key components her are in it's ZOD verification
+// ype k = keyof typeof UsersFullData.$inferInsert;
diff --git a/src/lib/db/util.ts b/src/lib/db/util.ts
new file mode 100644
index 00000000..4642f8d8
--- /dev/null
+++ b/src/lib/db/util.ts
@@ -0,0 +1,18 @@
+import { customType } from "drizzle-orm/pg-core";
+
+/**
+ * A custom type definition for PostgreSQL `citext` (case-insensitive text) type.
+ *
+ * @example
+ * ```typescript
+ * import { citext } from './path/to/util';
+ *
+ * // Usage in a table definition
+ * const users = pgTable('users', {
+ * username: citext,
+ * });
+ * ```
+ */
+export const citext = customType<{ data: string }>({
+ dataType: () => `citext`
+});
diff --git a/src/lib/email/sendEmail.ts b/src/lib/email/sendEmail.ts
index d5baefe6..a6f629de 100644
--- a/src/lib/email/sendEmail.ts
+++ b/src/lib/email/sendEmail.ts
@@ -1,4 +1,12 @@
import { Resend } from "resend";
+
+
+/**
+ * Send an email using the Resend API.
+ * @param to - The email address to send the email to
+ * @param subject - The subject of the email
+ * @param html - The HTML content of the email
+ */
export default async function send({
to,
subject,
@@ -10,7 +18,7 @@ export default async function send({
}) {
const resend = new Resend(process.env.RESEND_API_KEY);
return await resend.emails.send({
- from: "Icpc assiut Community ",
+ from: "Icpc assiut Community ",
to,
subject,
html,
diff --git a/src/lib/mock/training-data.ts b/src/lib/mock/training-data.ts
deleted file mode 100644
index 9c5985da..00000000
--- a/src/lib/mock/training-data.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { Training } from '../types/training';
-
-export const mockTraining: Training = {
- id: 'test',
- title: 'Advanced Software Development Training',
- description: 'An intensive training program covering advanced software development concepts and practices.',
- startDate: '2024-02-01',
- endDate: '2024-04-01',
- status: 'ongoing',
- enrollmentStatus: 'open',
- capacity: 50,
- enrolled: 35,
- level: 'advanced',
- topics: ['Design Patterns', 'Clean Code', 'Testing', 'CI/CD'],
- announcements: [
- {
- date: '10/23',
- message: 'Reminder: Task 2 is due on 10/30.'
- },
- {
- date: '10/21',
- message: "New material added: 'Advanced Design Patterns.'"
- }
- ],
- tasks: [
- {
- id: 1,
- title: 'Implement feature X',
- completed: false
- },
- {
- id: 2,
- title: 'Submit project report',
- completed: false
- },
- {
- id: 3,
- title: 'Attend weekly session',
- completed: false
- }
- ],
- chatMessages: [
- {
- sender: 'Mentor',
- message: 'Let me know if you need help with Task 1!',
- timestamp: '2024-02-17T10:00:00Z'
- },
- {
- sender: 'You',
- message: 'Could you explain the second requirement?',
- timestamp: '2024-02-17T10:05:00Z'
- }
- ],
- mentors: ['John Doe', 'Jane Smith']
-};
\ No newline at end of file
diff --git a/src/lib/mock/trainings.ts b/src/lib/mock/trainings.ts
deleted file mode 100644
index 3ee6d688..00000000
--- a/src/lib/mock/trainings.ts
+++ /dev/null
@@ -1,182 +0,0 @@
-import { Training, UserTraining } from '../types/training';
-
-export const mockUserTrainings: UserTraining[] = [
- {
- id: '1',
- title: 'Phase 1: Data Structures & Algorithms',
- description: 'Master essential data structures and algorithms including STLs, Frequency Arrays, Prefix Sum, and Two Pointers techniques.',
- startDate: '2024-01-01',
- endDate: '2024-03-01',
- status: 'ongoing',
- enrollmentStatus: 'closed',
- capacity: 150,
- enrolled: 125,
- level: 'intermediate',
- mentors: ['Mohamed Ahmed', 'Sara Hassan'],
- topics: ['STLs', 'Frequency Array', 'Prefix Sum', 'Two Pointers', 'Binary Search', 'Sorting Techniques'],
- progress: 60,
- joinedAt: '2024-01-01',
- lastAccessed: '2024-02-15',
- announcements: [
- {
- date: '2024-01-15',
- message: 'New practice problems added for Binary Search topic'
- },
- {
- date: '2024-02-01',
- message: 'Upcoming live session on Advanced STL techniques'
- }
- ],
- tasks: [
- {
- id: 1,
- title: 'Complete STL practice set',
- completed: true
- },
- {
- id: 2,
- title: 'Submit Frequency Array assignment',
- completed: false
- }
- ],
- chatMessages: [
- {
- sender: 'Mentor',
- message: 'How are you progressing with the STL problems?',
- timestamp: '2024-02-10T14:30:00Z'
- },
- {
- sender: 'You',
- message: 'Going well! Just finished the vector problems',
- timestamp: '2024-02-10T14:35:00Z'
- }
- ]
- },
- {
- id: '2',
- title: 'Newcomers: C++ Fundamentals',
- description: 'Learn the basics of C++ programming language, including syntax, control structures, functions, and basic problem-solving techniques.',
- startDate: '2024-02-01',
- endDate: '2024-03-15',
- status: 'ongoing',
- enrollmentStatus: 'closed',
- capacity: 200,
- enrolled: 180,
- level: 'beginner',
- mentors: ['Ali Mohamed', 'Nour Ibrahim'],
- topics: ['C++ Basics', 'Control Flow', 'Functions', 'Arrays', 'Strings', 'Basic Math'],
- progress: 75,
- joinedAt: '2024-02-01',
- lastAccessed: '2024-02-14',
- announcements: [
- {
- date: '2024-02-05',
- message: 'Welcome to C++ Fundamentals!'
- },
- {
- date: '2024-02-10',
- message: 'First assignment due next week'
- }
- ],
- tasks: [
- {
- id: 1,
- title: 'Setup C++ environment',
- completed: true
- },
- {
- id: 2,
- title: 'Complete basic syntax exercises',
- completed: true
- },
- {
- id: 3,
- title: 'Submit control flow assignment',
- completed: false
- }
- ],
- chatMessages: [
- {
- sender: 'Mentor',
- message: 'Don\'t forget to submit your first assignment',
- timestamp: '2024-02-12T10:00:00Z'
- },
- {
- sender: 'You',
- message: 'Thanks for the reminder!',
- timestamp: '2024-02-12T10:05:00Z'
- }
- ]
- }
-];
-
-export const mockAvailableTrainings: Training[] = [
- {
- id: '3',
- title: 'Phase 2: Advanced Algorithms',
- description: 'Deep dive into advanced algorithmic concepts including Dynamic Programming, Graph Theory, and advanced data structures.',
- startDate: '2024-03-01',
- endDate: '2024-05-01',
- status: 'upcoming',
- enrollmentStatus: 'open',
- capacity: 100,
- enrolled: 45,
- level: 'advanced',
- mentors: ['Dr. Ahmed Sayed', 'Mostafa Ibrahim'],
- topics: ['Dynamic Programming', 'Graph Algorithms', 'Segment Trees', 'Advanced Number Theory', 'Network Flow'],
- announcements: [],
- tasks: [],
- chatMessages: []
- },
- {
- id: '4',
- title: 'Newcomers: Introduction to CP',
- description: 'Start your competitive programming journey with C++ fundamentals and basic problem-solving techniques.',
- startDate: '2024-03-15',
- endDate: '2024-05-01',
- status: 'upcoming',
- enrollmentStatus: 'open',
- capacity: 250,
- enrolled: 125,
- level: 'beginner',
- mentors: ['Youssef Ali', 'Mariam Hassan'],
- topics: ['C++ Basics', 'Problem Solving', 'Time Complexity', 'Basic Math', 'Arrays & Strings'],
- announcements: [],
- tasks: [],
- chatMessages: []
- },
- {
- id: '5',
- title: 'Semi-Seniors Training',
- description: 'Advanced training for experienced competitive programmers, covering complex algorithms and contest strategies.',
- startDate: '2024-04-01',
- endDate: '2024-06-01',
- status: 'upcoming',
- enrollmentStatus: 'open',
- capacity: 50,
- enrolled: 15,
- level: 'advanced',
- mentors: ['Mohamed Reda', 'Ahmed Gamal'],
- topics: ['Advanced DP', 'Advanced Graph Theory', 'String Algorithms', 'Geometry', 'Contest Strategy'],
- announcements: [],
- tasks: [],
- chatMessages: []
- },
- {
- id: '6',
- title: 'Phase 1: Spring Training',
- description: 'Master fundamental algorithms and data structures essential for competitive programming.',
- startDate: '2024-04-15',
- endDate: '2024-06-15',
- status: 'upcoming',
- enrollmentStatus: 'open',
- capacity: 150,
- enrolled: 30,
- level: 'intermediate',
- mentors: ['Omar Hassan', 'Asmaa Mohamed'],
- topics: ['STLs', 'Binary Search', 'Two Pointers', 'Prefix Sum', 'Frequency Array', 'Basic Number Theory'],
- announcements: [],
- tasks: [],
- chatMessages: []
- }
-];
\ No newline at end of file
diff --git a/src/lib/permissions/getUserTrainingPermissions.ts b/src/lib/permissions/getUserTrainingPermissions.ts
new file mode 100644
index 00000000..0278bcc6
--- /dev/null
+++ b/src/lib/permissions/getUserTrainingPermissions.ts
@@ -0,0 +1,147 @@
+"use server";
+import { db } from "@/lib/db";
+import { Staff } from "../db/schema/training/Staff";
+import { Trainees } from "../db/schema/training/Trainees";
+import { eq, and, isNull } from "drizzle-orm";
+import { Trainings } from "../db/schema/training/Trainings";
+
+type PermissionAction = "View" | "Edit";
+type PermissionTarget =
+ | "standing"
+ | "material"
+ | "block"
+ | "training"
+ | "practice"
+ | "attendance"
+ | "contest"
+ | "staff";
+
+export type TrainingPermissions =
+ | `${PermissionAction}:${PermissionTarget}`
+ | "View:trainee";
+
+async function getUserTrainingPermissionsNotCache(
+ userId: string,
+ trainingId: number,
+): Promise {
+ if (isNaN(trainingId)) {
+ return [];
+ }
+ const headRes = await db
+ .select({})
+ .from(Trainings)
+ .where(
+ and(eq(Trainings.trainingId, trainingId), eq(Trainings.headId, userId)),
+ )
+ .execute();
+ if (headRes.length === 1) {
+ return [
+ "View:standing",
+ "Edit:standing",
+ "View:material",
+ "Edit:material",
+ "Edit:contest",
+ "Edit:block",
+ "View:practice",
+ "Edit:practice",
+ "View:attendance",
+ "Edit:attendance",
+ "Edit:staff",
+ "View:trainee"
+ ];
+ }
+
+ const staffRes = await db
+ .select({
+ mentor: Staff.mentor,
+ problemSetter: Staff.problemSetter,
+ instructor: Staff.instructor,
+ coHead: Staff.coHead,
+ manager: Staff.manager,
+ })
+ .from(Staff)
+ .where(
+ and(
+ eq(Staff.userId, userId),
+ eq(Staff.trainingId, trainingId),
+ isNull(Staff.deleted),
+ ),
+ )
+ .execute();
+
+ if (staffRes.length === 1) {
+ const staff = staffRes[0];
+ const permissions: Set = new Set();
+
+ // Base permissions for all staff
+ (
+ [
+ "View:standing",
+ "View:material",
+ "View:practice",
+ "View:attendance",
+ "Edit:attendance",
+ "View:trainee",
+ ] as const
+ ).forEach((perm) => permissions.add(perm));
+
+ // Manager permissions
+ if (staff.manager) {
+ // all permissions
+ (
+ [
+ "View:standing",
+ "Edit:standing",
+ "View:material",
+ "Edit:material",
+ "View:practice",
+ "Edit:practice",
+ "View:attendance",
+ "Edit:attendance",
+ "View:contest",
+ "Edit:contest",
+ "View:block",
+ "Edit:block",
+ "Edit:training",
+ "View:training",
+ "View:trainee",
+ ] as const
+ ).forEach((perm) => permissions.add(perm));
+ }
+
+ // Instructor permissions
+ if (staff.instructor) {
+ permissions.add("Edit:material");
+ permissions.add("View:material");
+ }
+
+ // Mentor permissions
+ if (staff.mentor) {
+ permissions.add("Edit:practice");
+ permissions.add("View:practice");
+ }
+
+ return [...permissions];
+ }
+
+ // Check if user is a trainee
+ const studentRes = await db
+ .select({})
+ .from(Trainees)
+ .where(
+ and(
+ eq(Trainees.userId, userId),
+ eq(Trainees.trainingId, trainingId),
+ isNull(Trainees.deleted),
+ ),
+ )
+ .execute();
+
+ if (studentRes.length === 1) {
+ return ["View:trainee"];
+ }
+
+ return [];
+}
+
+export const getUserTrainingPermissions = getUserTrainingPermissionsNotCache;
diff --git a/src/lib/session.ts b/src/lib/session.ts
index a052e820..e19d5f23 100644
--- a/src/lib/session.ts
+++ b/src/lib/session.ts
@@ -1,17 +1,19 @@
import "server-only";
import { JWTPayload, SignJWT, jwtVerify } from "jose";
+import { NextRequest } from "next/server";
+import { cookies } from "next/headers";
// Encrypting a payload
//
const secretKey = process.env.SESSION_SECRET;
const encodedKey = new TextEncoder().encode(secretKey);
-export type userData = {
- userId: number;
+export type UserDataJWT = {
+ userId: string;
username: string;
role: string;
};
-export async function encryptSession(data: userData) {
+export async function encryptSession(data: UserDataJWT) {
const session = await new SignJWT(data)
.setProtectedHeader({ alg: "HS256" })
.setIssuedAt()
@@ -25,7 +27,7 @@ export async function encryptSession(data: userData) {
*/
export async function decryptSession(
session: string | undefined,
-): Promise<(JWTPayload & userData) | null> {
+): Promise<(JWTPayload & UserDataJWT) | null> {
if (!session) return null;
// bad
@@ -35,7 +37,23 @@ export async function decryptSession(
return {
payload: null,
};
- })) as { payload: (JWTPayload & userData) | null };
+ })) as { payload: (JWTPayload & UserDataJWT) | null };
return payload;
}
+
+export async function getUserData(): Promise {
+ const cookieStore = await cookies();
+ const userData = cookieStore.get("session")?.value;
+ if (!userData) return null;
+ const user = await decryptSession(userData);
+ return user;
+}
+export async function getUserDataMiddleware(
+ req: NextRequest,
+): Promise {
+ const userData = req.headers.get("x-user");
+ if (!userData) return null;
+ const user = JSON.parse(userData) as UserDataJWT;
+ return user;
+}
diff --git a/src/lib/types/DefaultResponse.d.ts b/src/lib/types/DefaultResponse.d.ts
new file mode 100644
index 00000000..bd5a64c1
--- /dev/null
+++ b/src/lib/types/DefaultResponse.d.ts
@@ -0,0 +1,6 @@
+import type { NextResponse } from "next/server";
+
+/**
+ * A default response type for API routes.
+ */
+type DefaultResponse = NextResponse<{ msg: string } | { err: string }>;
diff --git a/src/lib/types/training.ts b/src/lib/types/training.ts
index f1cdb6c4..c743ad41 100644
--- a/src/lib/types/training.ts
+++ b/src/lib/types/training.ts
@@ -1,46 +1,109 @@
-export interface Announcement {
- date: string;
- message: string;
-}
+/**
+ * Training Data send to the client
+ */
+export type TrainingFullDTO = {
+ title: string;
+ standing:
+ | {
+ contestInfo: ContestInfo;
+ rankings: RankingEntryWithTrainees[];
+ problems: string[];
+ }[]
+ | undefined;
+ leaderBoard: LeaderBoardWithTrainees[];
+ blocks: Blocks; // to in the DAO
+};
-export interface Task {
- id: number;
- title: string;
- completed: boolean;
-}
+export type Blocks = {
+ id: number;
+ title: string;
+ materials: Material[];
+}[];
-export interface ChatMessage {
- sender: 'Mentor' | 'You';
- message: string;
- timestamp: string;
-}
+/**
+ * Material type from db.training.material
+ * this type is used from the database
+ */
+export type MaterialsEntry = Material[];
-export interface Mentor {
- id: number;
- name: string;
- status: 'Online' | 'Offline';
-}
+/**
+ * map from blockId to array of materials
+ */
+export type MaterialsDTO = Record;
+
+export type Material = {
+ title: string;
+ link: string;
+ des: string;
+};
+
+/**
+ * Training Data riveted from the Database
+ */
+export type Training = {
+ standing: StandingEntry | null;
+ standingView: string[]; // Dynamic configuration
+};
-export interface Training {
- id: string;
- title: string;
- description: string;
- startDate: string;
- endDate: string;
- status: 'ongoing' | 'upcoming' | 'completed';
- enrollmentStatus: 'open' | 'closed';
- capacity: number;
- enrolled: number;
- level: 'beginner' | 'intermediate' | 'advanced';
- mentors: string[];
- topics: string[];
- announcements: Announcement[];
- tasks: Task[];
- chatMessages: ChatMessage[];
+/**
+ * Contest Info
+ */
+export type ContestInfo = {
+ id: number;
+ title: string;
+ start_time: string;
+ duration: string;
+ participant_count: number;
+ problem_count: number;
+};
+
+/**
+ * Standing type from db.training.standing
+ */
+export type StandingEntry = {
+ contestInfo: ContestInfo;
+ rankings: Ranking[];
+ problems: string[];
+};
+
+/**
+ * Ranking Entry
+ */
+export type Ranking = {
+ userId: string;
+ penalty: number;
+ solved: string[];
+ attempted: string[];
+};
+
+/**
+ * Trainee Details
+ * this type is used from the database
+ */
+export type Trainee = {
+ userId?: string;
+ name?: string | null;
+ cfHandle?: string;
+ vjudge?: string | null;
+ gmail?: string;
+ level?: number;
+ university?: string;
+ faculty?: string;
+};
+
+export interface LeaderBoardEntry {
+ userId: string;
+ points: number;
}
+export type LeaderBoard = LeaderBoardEntry[];
+/**
+ * Standing Entry with Trainee Details
+ */
+export type RankingEntryWithTrainees = Omit;
+
+export type LeaderBoardWithTrainees = Omit<
+ Trainee & LeaderBoardEntry,
+ "userId"
+>;
-export interface UserTraining extends Training {
- progress: number;
- joinedAt: string;
- lastAccessed?: string;
-}
\ No newline at end of file
+export { type TrainingPermissions } from "@/lib/permissions/getUserTrainingPermissions";
diff --git a/src/lib/types/userProfileType.ts b/src/lib/types/userProfileType.ts
new file mode 100644
index 00000000..552f552b
--- /dev/null
+++ b/src/lib/types/userProfileType.ts
@@ -0,0 +1,36 @@
+/**
+ * User Profile Type
+ */
+export type UserProfile = {
+ username: string | null;
+ imageUrl: string | null;
+ gmail: string | null;
+ createdAt: Date | null;
+ country: string | null;
+ city: string | null;
+ institute: string | null;
+ department: string | null;
+ community: string | null;
+ faculty: string | null;
+ nameAR1: string | null;
+ nameAR2: string | null;
+ nameAR3: string | null;
+ nameAR4: string | null;
+ firstNameEn: string | null;
+ lastNameEn: string | null;
+ codeforces: string | null;
+ vjudge: string | null;
+ atcoder: string | null;
+ codechef: string | null;
+ leetcode: string | null;
+ cses: string | null;
+ facebook: string | null;
+ linkedIn: string | null;
+ twitter: string | null;
+ github: string | null;
+ telegram: string | null;
+ academicYear: number | null;
+ graduationDate: string | null;
+} & (Filter extends false
+ ? { visibilityMask: number | null }
+ : unknown);
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
index d084ccad..365058ce 100644
--- a/src/lib/utils.ts
+++ b/src/lib/utils.ts
@@ -1,6 +1,6 @@
-import { type ClassValue, clsx } from "clsx"
-import { twMerge } from "tailwind-merge"
+import { type ClassValue, clsx } from "clsx";
+import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs))
+ return twMerge(clsx(inputs));
}
diff --git a/src/lib/validation/resetPassword.ts b/src/lib/validation/resetPassword.ts
new file mode 100644
index 00000000..280170de
--- /dev/null
+++ b/src/lib/validation/resetPassword.ts
@@ -0,0 +1,11 @@
+import { z } from "zod";
+import { password } from "./util";
+
+/**
+ * used in reset password
+ */
+export const resetPasswordValid = z.object({
+ password,
+ confirmPassword: password,
+ token: z.string(),
+});
diff --git a/src/lib/validation/training/addContest.ts b/src/lib/validation/training/addContest.ts
new file mode 100644
index 00000000..09977739
--- /dev/null
+++ b/src/lib/validation/training/addContest.ts
@@ -0,0 +1,14 @@
+import { z } from "zod";
+
+export const addContestSchema = z.object({
+ trainingId: z.number().int(),
+ blockNumber: z.coerce
+ .number()
+ .int()
+ .transform((val) => Number(val)),
+ contestUrl: z.string().url(),
+ type: z.enum(["contest", "practice"]),
+ title: z.string().min(1).max(128),
+ description: z.string().max(512).optional(),
+ date: z.date(),
+});
diff --git a/src/lib/validation/training/blockValidations.ts b/src/lib/validation/training/blockValidations.ts
new file mode 100644
index 00000000..967cdbd9
--- /dev/null
+++ b/src/lib/validation/training/blockValidations.ts
@@ -0,0 +1,10 @@
+import zod from 'zod';
+import { BLOCK_ERROR_MESSAGES } from '@/lib/const/block-error-messages';
+export const blockValidations = zod.object({
+ title: zod.string().min(1, BLOCK_ERROR_MESSAGES.TITLE_REQUIRED).max(128, BLOCK_ERROR_MESSAGES.TITLE_TOO_LONG),
+ description: zod.string().min(1, BLOCK_ERROR_MESSAGES.DESCRIPTION_REQUIRED).max(512, BLOCK_ERROR_MESSAGES.DESCRIPTION_TOO_LONG),
+ date: zod.date().min(new Date(), BLOCK_ERROR_MESSAGES.DATE_INVALID),
+ hidden: zod.boolean(),
+})
+
+export type BlockFormData = zod.infer
\ No newline at end of file
diff --git a/src/lib/validation/training/createTraining.ts b/src/lib/validation/training/createTraining.ts
new file mode 100644
index 00000000..40ed45e7
--- /dev/null
+++ b/src/lib/validation/training/createTraining.ts
@@ -0,0 +1,23 @@
+import { z } from "zod";
+import { username } from "../util";
+
+export const createTrainingSchema = z.object({
+ title: z
+ .string()
+ .min(3, "Title must be at least 3 characters")
+ .max(128, "Title must be less than 128 characters"),
+ description: z
+ .string()
+ .min(10, "Description must be at least 10 characters")
+ .max(512, "Description must be less than 512 characters"),
+ headUsername: username,
+ chiefJudgeUsername: username,
+ startDate: z.date({ required_error: "Start date is required" }),
+ duration: z
+ .coerce
+ .number()
+ .int()
+ .min(1, "Duration must be at least 1 week")
+ .default(1),
+ status: z.enum(["active", "roadmap", "private", "over"]).default("private"),
+});
diff --git a/src/lib/validation/training/deleteContest.ts b/src/lib/validation/training/deleteContest.ts
new file mode 100644
index 00000000..a87e2e58
--- /dev/null
+++ b/src/lib/validation/training/deleteContest.ts
@@ -0,0 +1,8 @@
+import { z } from 'zod';
+
+
+export const deleteContestSchema = z.object({
+ trainingId: z.number().int(),
+ blockNumber: z.number().int(),
+ contestId: z.string().min(1).max(32),
+});
diff --git a/src/lib/validation/training/trainingValidations.ts b/src/lib/validation/training/trainingValidations.ts
new file mode 100644
index 00000000..b951a2a6
--- /dev/null
+++ b/src/lib/validation/training/trainingValidations.ts
@@ -0,0 +1,25 @@
+import zod from 'zod';
+import { TRAINING_ERROR_MESSAGES } from '@/lib/const/training-error-messages';
+
+
+export const trainingValidations = zod.object({
+ title: zod.string().nonempty(TRAINING_ERROR_MESSAGES.TITLE_REQUIRED)
+ .min(5, TRAINING_ERROR_MESSAGES.TITLE_TOO_SHORT)
+ .max(128, TRAINING_ERROR_MESSAGES.TITLE_TOO_LONG),
+
+ description: zod.string().nonempty(TRAINING_ERROR_MESSAGES.DESCRIPTION_REQUIRED)
+ .min(3, TRAINING_ERROR_MESSAGES.DESCRIPTION_TOO_SHORT)
+ .max(512, TRAINING_ERROR_MESSAGES.DESCRIPTION_TOO_LONG),
+
+ startDate: zod.date()
+ .min(new Date(), TRAINING_ERROR_MESSAGES.START_DATE_INVALID),
+
+ duration: zod.number()
+ .positive(TRAINING_ERROR_MESSAGES.DURATION_INVALID),
+
+ status: zod.enum(["active" , "roadmap" , "private" , "over"]),
+
+ deleted: zod.date().nullable().optional(),
+});
+
+export type TrainingFormData = zod.infer;
diff --git a/src/lib/validation/training/updateBlocks.ts b/src/lib/validation/training/updateBlocks.ts
new file mode 100644
index 00000000..04d08b6d
--- /dev/null
+++ b/src/lib/validation/training/updateBlocks.ts
@@ -0,0 +1,8 @@
+import { z } from "zod";
+
+export const updateBlockSchema = z.object({
+ title: z.string().min(1, { message: "Title is required" }),
+ description: z.string().min(1, { message: "Description is required" }),
+ date: z.string().date("Expected Date"),
+ hidden: z.boolean(),
+});
diff --git a/src/lib/validation/training/updateContest.ts b/src/lib/validation/training/updateContest.ts
new file mode 100644
index 00000000..7e19b3d8
--- /dev/null
+++ b/src/lib/validation/training/updateContest.ts
@@ -0,0 +1,11 @@
+import { z } from "zod";
+
+export const updateContestSchema = z.object({
+ trainingId: z.number().int(),
+ blockNumber: z.number().int(),
+ contestId: z.string(),
+ type: z.enum(["contest", "practice"]).optional(),
+ title: z.string().min(1).max(128).optional(),
+ description: z.string().max(512).optional(),
+ date: z.date().optional(),
+});
diff --git a/src/lib/validation/training/updateMaterial.ts b/src/lib/validation/training/updateMaterial.ts
new file mode 100644
index 00000000..09fe3dc2
--- /dev/null
+++ b/src/lib/validation/training/updateMaterial.ts
@@ -0,0 +1,9 @@
+import { z } from "zod";
+
+export const updateMaterialSchema = z.array(
+ z.object({
+ title: z.string().min(1, { message: "Title is required" }),
+ des: z.string().min(1, { message: "Description is required" }),
+ link: z.string().url({ message: "Link must be a valid URL" }),
+ }),
+);
diff --git a/src/lib/validation/userFulldataValidations.ts b/src/lib/validation/userFulldataValidations.ts
index 566186d6..2b96aef0 100644
--- a/src/lib/validation/userFulldataValidations.ts
+++ b/src/lib/validation/userFulldataValidations.ts
@@ -1,42 +1,60 @@
import { z } from "zod";
+
+// Academic
import {
faculties,
departments,
countries,
validGovernorateCodes,
universities,
+ communities,
} from "@/lib/const";
+import {
+ academicYearInvalid,
+ academicYearNotNumber,
+ academicYearNotPositive,
+ academicYearOutOfRange,
+ usernameTooShort,
+ usernameInvalidFormat,
+ englishNameTooShort,
+ englishNameInvalid,
+ arabicNameTooShort,
+ arabicNameInvalid,
+ nationalIdInvalidLength,
+ nationalIdInvalid,
+} from "../const/error-messages";
+
// Academic
const universitiesValues = [...universities, "Other"] as const;
-const university = z.enum(universitiesValues).default("Other");
+const institute = z.enum(universitiesValues).default("Other");
const faculty = z.enum(faculties).optional();
const department = z.enum(departments).optional();
-
+const community = z.enum(communities).optional();
// don't touch this
const academicYear = z
.string()
.trim()
.regex(/^[1-7]$/, {
- message: "Academic Year must be a number between 1 and 7",
+ message: academicYearInvalid,
})
.transform((value) => Number(value))
.or(
z
- .number({ message: " Academic Year must be Number" })
- .positive({ message: " Academic Year must be Positive" })
- .max(7, { message: " Academic Year must be between 1 and 5" }),
+ .number({ message: academicYearNotNumber })
+ .positive({ message: academicYearNotPositive })
+ .max(7, { message: academicYearOutOfRange }),
)
.optional();
-const graduationYear = z.string().date().optional();
+const graduationDate = z.string().date().optional();
const handle = z
.string()
.trim()
- .min(3, { message: "Username too short" })
+ .min(3, { message: usernameTooShort })
.regex(/^[a-zA-Z0-9_]+$/, {
- message: "Username must contain only letters, numbers, and underscores",
+ message: usernameInvalidFormat,
})
.optional();
@@ -45,29 +63,29 @@ const handle = z
const englishName = z
.string()
.trim()
- .min(3, { message: "too short" })
- .regex(/^[a-zA-Z]+$/)
+ .min(3, { message: englishNameTooShort })
+ .regex(/^[a-zA-Z]+$/, { message: englishNameInvalid })
.optional();
const arabicName = z
.string()
.trim()
- .min(2, { message: "too short" })
- .regex(/^[ء-ي]+$/)
+ .min(2, { message: arabicNameTooShort })
+ .regex(/^[ء-ي]+$/, { message: arabicNameInvalid })
.optional();
-const nationalID = z
+const nationalId = z
.string()
.trim()
- .regex(/^\d{14}$/, "Egyptian National ID must be exactly 14 digits")
- .refine(birthdate, "Invalid National ID")
- .refine(govNumber, "Invalid National ID")
- .refine(isValidEgyptianNIDChecksum, "Invalid National ID")
+ .regex(/^\d{14}$/, nationalIdInvalidLength)
+ .refine(birthdate, nationalIdInvalid)
+ .refine(govNumber, nationalIdInvalid)
+ .refine(isValidEgyptianNIDChecksum, nationalIdInvalid)
.optional();
-const countryName = z.enum(countries).default("Egypt");
-const city = z.string().optional();
+const country = z.enum(countries).optional();
+
const isMale = z.boolean().optional();
-const imageURL = z.string().url().optional();
+const imageUrl = z.string().url().optional();
const facebook = z.string().url().optional();
const linkedIn = z.string().url().optional();
@@ -80,6 +98,8 @@ function govNumber(id: string) {
return validGovernorateCodes.includes(govCode);
}
+const city = z.string().optional();
+
function birthdate(id: string) {
// Birthdate: digits 2-7 (0-indexed positions 2-7)
// Determine century: first digit (assume '2' means 1900s, '3' means 2000s)
@@ -125,37 +145,41 @@ function isValidEgyptianNIDChecksum(id: string) {
return expectedCheckDigit === givenCheckDigit;
}
-export const userFullData = z.object({
- university,
+/**
+ * User full data validation schema
+ * used in edit-profile
+ */
+const userFullDataValid = z.object({
+ institute,
faculty,
department,
academicYear,
- graduationYear,
+ graduationDate,
- vjudge: handle,
atcoder: handle,
- topcoder: handle,
- spoj: handle,
codechef: handle,
- csacademy: handle,
cses: handle,
leetcode: handle,
- nameEnFirst: englishName,
- nameEnLast: englishName,
+ firstNameEn: englishName,
+ lastNameEn: englishName,
nameAR1: arabicName,
nameAR2: arabicName,
nameAR3: arabicName,
nameAR4: arabicName,
- nationalID,
- country: countryName,
+ nationalId,
+ country,
city,
isMale,
- imageURL,
+ imageUrl,
facebook,
linkedIn,
twitter,
github,
+ visibilityMask: z.number().int().optional(),
+ community,
});
+
+export { userFullDataValid };
diff --git a/src/lib/validation/userLogin.ts b/src/lib/validation/userLogin.ts
new file mode 100644
index 00000000..9a9b74a2
--- /dev/null
+++ b/src/lib/validation/userLogin.ts
@@ -0,0 +1,10 @@
+import { z } from "zod";
+import { gmail, password, username } from "./util";
+
+/**
+ * used in login page
+ */
+export const userLoginValid = z.object({
+ usernameOrGmail: username.or(gmail),
+ password,
+});
diff --git a/src/lib/validation/userValidations.ts b/src/lib/validation/userValidations.ts
index 87acccb7..096ea0b9 100644
--- a/src/lib/validation/userValidations.ts
+++ b/src/lib/validation/userValidations.ts
@@ -1,53 +1,47 @@
import { z } from "zod";
-
-const username = z
- .string()
- .trim()
- .min(3, { message: "Username too short" })
- .regex(/^[a-zA-Z0-9_]+$/, {
- message: "Username must contain only letters, numbers, and underscores",
- });
-
-const password = z
- .string()
- .min(8, { message: "Password must be at least 8 characters" })
- .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_])(?!.*\s).{8,}$/, {
- message:
- "Password must be include an uppercase letter, a lowercase letter, a number, and a special character, with no spaces.",
- });
-
-const gmail = z
- .string()
- .trim()
- .email({ message: "Invalid gmail address" })
- .regex(/@gmail.com$/, { message: "Email must be a gmail account" });
+import { username, password, gmail, type EnforceKeys } from "./util";
+import { Users } from "@/lib/db/schema/user/Users";
+import { usernameTooShort, usernameInvalidFormat, phoneNumberTooShort, phoneNumberTooLong, phoneNumberInvalid, termsNotAccepted, passwordMustMatch, invalidPassword } from "../const/error-messages";
// TODO CF Handle
const cfHandle = z
.string()
.trim()
- .min(3, { message: "Username too short" })
+ .min(3, { message: usernameTooShort })
.regex(/^[a-zA-Z0-9_]+$/, {
- message: "Username must contain only letters, numbers, and underscores",
+ message: usernameInvalidFormat,
});
-const phone = z
+const phoneNumber = z
.string()
.trim()
+ .min(13, { message: phoneNumberTooShort })
+ .max(15, { message: phoneNumberTooLong })
.regex(
/^\+201[0-9]{9}$/,
- "Phone number must be a valid Egyptian number (starts with +20)"
- )
- .nullable();
+ phoneNumberInvalid,
+ );
+const confirmPassword = z.string().min(8, { message: invalidPassword });
+const termsAccepted = z.boolean().refine((val) => val === true, {
+ message: termsNotAccepted
+});
-export const user = z.object({
+export const userRegisterValid = z.object({
username,
password,
gmail,
cfHandle,
- phone,
+ vjHandle: cfHandle.optional(),
+ phoneNumber,
+ confirmPassword,
+ termsAccepted,
+}).refine((data) => data.password === data.confirmPassword, {
+ message: passwordMustMatch,
+ path: ['confirmPassword'],
});
+const _: EnforceKeys = {} as EnforceKeys; // Ensure validation matches Users schema
+
+// Type checking is handled by TypeScript compiler
// Usage example:
-// const { success, data, error } = password.safeParse(""); // Replace with an actual 14-digit ID
-// console.log("Valid Name:", success, data, error?.message);
+// const { success, data, error } = password.safeParse("");
diff --git a/src/lib/validation/userValidationsServer.ts b/src/lib/validation/userValidationsServer.ts
index 5e912942..3a1088aa 100644
--- a/src/lib/validation/userValidationsServer.ts
+++ b/src/lib/validation/userValidationsServer.ts
@@ -1 +1 @@
-import "server-only";
\ No newline at end of file
+import "server-only";
diff --git a/src/lib/validation/util.ts b/src/lib/validation/util.ts
new file mode 100644
index 00000000..7dd252a2
--- /dev/null
+++ b/src/lib/validation/util.ts
@@ -0,0 +1,57 @@
+/**
+ * commanly used validation
+ */
+import { z } from "zod";
+import { type AnyPgTable } from "drizzle-orm/pg-core";
+import {
+ invalidEmail,
+ passwordExceedsMaxLength,
+ invalidPassword,
+ passwordRequired,
+ usernameTooShort,
+ usernameTooLong,
+ usernameRequired,
+ usernameInvalidFormat,
+ emailTooLong, unsupportedEmailDomain, emailRequired
+} from "../const/error-messages";
+
+export const username = z
+ .string()
+ .nonempty(usernameRequired)
+ .trim()
+ .min(3, { message: usernameTooShort })
+ .max(20, { message: usernameTooLong })
+ .regex(/^[a-zA-Z_][a-zA-Z0-9_]+$/, {
+ message: usernameInvalidFormat,
+ });
+
+export const password = z
+ .string()
+ .nonempty(passwordRequired)
+ .min(8, { message: invalidPassword })
+ .max(100, { message: passwordExceedsMaxLength })
+ .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_])(?!.*\s).{8,}$/, {
+ message: invalidPassword,
+ });
+
+export const gmail = z
+ .string()
+ .nonempty({message : emailRequired})
+ .trim()
+ .email({ message: invalidEmail })
+ .max(100, { message: emailTooLong })
+ .regex(/@gmail.com$/, { message: unsupportedEmailDomain });
+
+/**
+ * check if the keys of the zod object are the same as the keys of the pgTable
+ * @param T - zod object
+ * @param Expected - pgTable
+ *
+ * how to use
+ * @example
+ * const _: EnforceKeys = true;
+ * */
+export type EnforceKeys<
+ T extends z.ZodTypeAny,
+ Expected extends AnyPgTable,
+> = keyof z.infer extends keyof Expected["$inferInsert"] ? true : never;
diff --git a/src/middelwares/adminOnly.ts b/src/middelwares/adminOnly.ts
deleted file mode 100644
index a22cf50f..00000000
--- a/src/middelwares/adminOnly.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { NextResponse, NextRequest } from "next/server";
-import { decryptSession, type userData } from "@/lib/session";
-
-/**
- * this is a clouser function that takes a function as an argument and returns a function
- * How to use
- * `
- * async function POST(request: NextRequest, user: userData) {}
- * exports { POST: adminOnly(POST) };
- * `
- */
-export default function adminOnly(
- f: (_request: NextRequest, _user: userData) => Promise,
-) {
- return async (request: NextRequest) => {
- const session = request.cookies.get("session")?.value;
- const user = (await decryptSession(session)) as userData;
- if (user.role === "admin") {
- return await f(request, user);
- }
- return new NextResponse(null, { status: 401 });
- };
-}
diff --git a/src/middelwares/authOnly.ts b/src/middelwares/authOnly.ts
deleted file mode 100644
index cb3ecf0e..00000000
--- a/src/middelwares/authOnly.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { NextResponse, NextRequest } from "next/server";
-import { decryptSession, type userData } from "@/lib/session";
-
-/**
- * this is a clouser function that takes a function as an argument and returns a function
- * How to use
- * `
- * async function POST(request: NextRequest, user: userData) {}
- * const POST = adminOnly(POSTfn);
- * export { POST } ;
- * `
- */
-export default function authOnly(
- f: (_request: NextRequest, _user: userData) => Promise
-) {
- return async (request: NextRequest) => {
- const session = request.cookies.get("session")?.value;
- const user = (await decryptSession(session)) as userData;
- if (user) return await f(request, user);
- return new NextResponse(null, { status: 401 });
- };
-}
diff --git a/src/middleware.ts b/src/middleware.ts
new file mode 100644
index 00000000..6b122f28
--- /dev/null
+++ b/src/middleware.ts
@@ -0,0 +1,34 @@
+import { NextRequest, NextResponse } from "next/server";
+
+import { middlewares } from "./middlewares/index";
+import { composeMiddlewares } from "./middlewares/utils";
+
+export default async function middleware(
+ req: NextRequest,
+): Promise {
+ // check if x-user header is present
+ // if present, refuse the request
+ if (req.headers.has("x-user")) {
+ // this prevent security issues stop
+ return new NextResponse(null, { status: 403 });
+ }
+
+ const composedMiddleware = composeMiddlewares(middlewares.functions);
+ const response = await composedMiddleware(req);
+ if (response instanceof NextResponse) {
+ return response;
+ }
+ return NextResponse.next({ request: req });
+}
+
+export const config = {
+ matcher: [
+ /*
+ * Match all request paths except for the ones starting with:
+ * - _next/static (static files)
+ * - _next/image (image optimization files)
+ * - favicon.ico, sitemap.xml, robots.txt (metadata files)
+ */
+ "/((?!_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt).*)",
+ ],
+};
diff --git a/src/middlewares/adminOnly.ts b/src/middlewares/adminOnly.ts
new file mode 100644
index 00000000..64ae69e6
--- /dev/null
+++ b/src/middlewares/adminOnly.ts
@@ -0,0 +1,38 @@
+import { NextRequest, NextResponse } from "next/server";
+import { decryptSession } from "@/lib/session";
+import { NoAction } from "./utils";
+
+/**
+ * middleware to check if the user is admin and logged
+ * this middleware add x-user header to the request
+ * __containg the user data__ if the user is logged in
+ */
+export async function middleware(
+ req: NextRequest,
+): Promise {
+ const url = req.nextUrl.pathname;
+ if (url.startsWith("/admin-only")) {
+ const session = req.cookies.get("session")?.value;
+ const validation = await decryptSession(session);
+ if (!validation || validation.role !== "admin") {
+ // is not logged in or not an admin
+ return NextResponse.redirect(new URL("/not-found", req.url));
+ }
+ req.headers.set(
+ "x-user",
+ JSON.stringify({
+ username: validation.username,
+ role: validation.role,
+ userId: validation.userId,
+ }),
+ );
+ }
+ return [NoAction, req];
+}
+
+/*
+ * `neededPaths` is an array of strings that are
+ * the paths that the middleware will be applied to
+ * you need to insure that the path is correct
+ * and used above
+ */
diff --git a/src/middlewares/authOnly.ts b/src/middlewares/authOnly.ts
new file mode 100644
index 00000000..145b2e2b
--- /dev/null
+++ b/src/middlewares/authOnly.ts
@@ -0,0 +1,32 @@
+import { type NextRequest, NextResponse } from "next/server";
+import { decryptSession } from "@/lib/session";
+import { NoAction } from "./utils";
+
+/**
+ * middleware to check if the user logged
+ * this middleware add x-user header to the request
+ * __containg the user data__ if the user is logged in
+ */
+export async function middleware(
+ req: NextRequest,
+): Promise<[NoAction, NextRequest] | NextResponse> {
+ const url = req.nextUrl.pathname;
+ const session = req.cookies.get("session")?.value;
+ if (url.startsWith("/protected")) {
+ const validation = await decryptSession(session);
+ if (!validation) {
+ // is not logged in
+ return NextResponse.redirect(new URL("/login", req.url));
+ }
+
+ req.headers.set(
+ "x-user",
+ JSON.stringify({
+ username: validation.username,
+ role: validation.role,
+ userId: validation.userId,
+ }),
+ );
+ }
+ return [NoAction, req];
+}
diff --git a/src/middlewares/index.ts b/src/middlewares/index.ts
new file mode 100644
index 00000000..7639aaca
--- /dev/null
+++ b/src/middlewares/index.ts
@@ -0,0 +1,14 @@
+import { NextRequest, NextResponse } from "next/server";
+import * as adminOnly from "./adminOnly";
+import * as authOnly from "./authOnly";
+import * as training from "./training";
+import { NoAction } from "./utils";
+
+export const middlewares = {
+ // order is needed
+ functions: [
+ authOnly.middleware,
+ adminOnly.middleware,
+ training.middleware,
+ ] satisfies ((req: NextRequest) => Promise)[],
+};
diff --git a/src/middlewares/training/index.ts b/src/middlewares/training/index.ts
new file mode 100644
index 00000000..3152494e
--- /dev/null
+++ b/src/middlewares/training/index.ts
@@ -0,0 +1,167 @@
+/**
+ * Training Middleware Module
+ *
+ * This module provides middleware functions to handle training-related route protection
+ * and permission checks. It ensures that users have the appropriate permissions to access
+ * training resources and materials.
+ */
+
+import { getUserData } from "@/lib/session";
+import { NextRequest, NextResponse } from "next/server";
+import { userTrainingPermissions } from "./utils";
+import { TrainingPermissions } from "@/lib/permissions/getUserTrainingPermissions";
+import { composeMiddlewares, NoAction } from "../utils";
+import UrlPattern from "url-pattern";
+import { z } from "zod";
+
+/**
+ * Configuration for training route permissions
+ * Maps URL patterns to required permissions
+ */
+const permissionNeedToPath: {
+ urlPath: UrlPattern;
+ permissions: TrainingPermissions[];
+}[] = [
+ // Match paths like /protected/trainings/123/materials
+ {
+ urlPath: new UrlPattern("/protected/trainings/:trainingId(/:tail*)"),
+ permissions: ["View:trainee"],
+ },
+ // Match paths like /protected/trainings/123/staff/materials
+ {
+ urlPath: new UrlPattern(
+ "/protected/trainings/:trainingId/staff/materials",
+ ),
+ permissions: ["View:material"],
+ },
+ // Match paths like /protected/trainings/123/staff/materials/edit-materials/456
+ {
+ urlPath: new UrlPattern(
+ "/protected/trainings/:trainingId/staff/materials/edit-materials/:materialId",
+ ),
+ permissions: ["Edit:material", "View:material"],
+ },
+ // Match paths like /protected/trainings/123/staff/materials
+ {
+ urlPath: new UrlPattern(
+ "/protected/trainings/:trainingId/staff/materials",
+ ),
+ permissions: ["View:material"],
+ },
+ // Match paths like /protected/trainings/123/staff/contests
+ {
+ urlPath: new UrlPattern(
+ "/protected/trainings/:trainingId/staff/contests",
+ ),
+ permissions: ["View:contest"],
+ },
+ // Match paths like /protected/trainings/123/staff/contests/edit-contest
+ {
+ urlPath: new UrlPattern(
+ "/protected/trainings/:trainingId/staff/contests/:contestId/edit-contest",
+ ),
+ permissions: ["Edit:contest", "View:contest"],
+ },
+ // Match paths like /protected/trainings/123/staff/edit-blocks
+ {
+ urlPath: new UrlPattern(
+ "/protected/trainings/:trainingId/staff/edit-blocks",
+ ),
+ permissions: ["Edit:block", "View:block"],
+ },
+ // Match paths like /protected/trainings/123/staff/edit-blocks/456
+ {
+ urlPath: new UrlPattern(
+ "/protected/trainings/:trainingId/staff/edit-blocks/:blockId",
+ ),
+ permissions: ["Edit:block", "View:block"],
+ },
+ {
+ urlPath: new UrlPattern(
+ "/protected/trainings/:trainingId/staff/edit-standing-view",
+ ),
+ permissions: ["Edit:training"],
+ },
+ {
+ urlPath: new UrlPattern(
+ "/protected/trainings/:trainingId/staff/edit-training",
+ ),
+ permissions: ["Edit:training"],
+ },
+ {
+ urlPath: new UrlPattern(
+ "/protected/trainings/:trainingId/staff/staff-management(/:tail*)",
+ ),
+ permissions: ["Edit:staff"],
+ },
+];
+
+/**
+ * Main middleware function that composes all training-related middleware functions
+ */
+export const middleware = composeMiddlewares(
+ permissionNeedToPath.map(({urlPath, permissions }) =>
+ trainingMiddlewareBuilder({ urlPath, permissions }),
+ ),
+);
+
+/**
+ * Creates a middleware function for checking training permissions
+ *
+ * @param urlPath - URL pattern to match training paths
+ * @param permissions - Array of required permissions for the matched paths
+ * @returns Middleware function that checks user permissions for training routes
+ */
+function trainingMiddlewareBuilder({
+ urlPath,
+ permissions,
+}: {
+ urlPath: UrlPattern;
+ permissions: TrainingPermissions[];
+}) {
+ // Create a copy of permissions to prevent mutation
+ const permissionsCopy = [...permissions];
+
+ return async function viewTrainingMiddleware(
+ req: NextRequest,
+ ): Promise {
+ const permissions = permissionsCopy;
+ const url = req.nextUrl.pathname;
+
+ // Skip if URL doesn't match the pattern
+ const match = urlPath.match(url);
+ if (!match) return [NoAction, req];
+ const trainingIdRaw = Number(match.trainingId);
+ let trainingId;
+ if (!isNaN(trainingIdRaw) && z.number().int().safeParse(trainingIdRaw).success) {
+ trainingId = trainingIdRaw;
+ } else {
+ return new NextResponse('/404', { status: 404 });
+ }
+
+ const user = await getUserData();
+
+ // Handle authentication
+ if (!user) {
+ // User not logged in, redirect to login
+ return NextResponse.redirect(new URL("/login", req.url));
+ }
+
+ // Get user permissions for the training
+ const userPermissions = new Set(
+ await userTrainingPermissions({
+ trainingId,
+ userId: user.userId,
+ }),
+ );
+
+ // Check if user has all required permissions
+ if (permissions.every((val) => userPermissions.has(val))) {
+ // User has access, continue
+ return [NoAction, req];
+ } else {
+ // User doesn't have access, redirect to not found
+ return NextResponse.redirect(new URL("/not-found", req.url));
+ }
+ };
+}
diff --git a/src/middlewares/training/utils.ts b/src/middlewares/training/utils.ts
new file mode 100644
index 00000000..9cb593ca
--- /dev/null
+++ b/src/middlewares/training/utils.ts
@@ -0,0 +1,46 @@
+import { TrainingPermissions } from "@/lib/permissions/getUserTrainingPermissions";
+
+export interface TrainingMatch {
+ trainingId: number;
+ userId: string;
+}
+
+export function extractTrainingId(pathname: string): number | null {
+
+ const PATH_REGEX = /^\/protected\/trainings\/(?\d+)\/.*$/
+ const match = pathname.match(PATH_REGEX);
+ if (match === null ) {
+ return null;
+ }
+
+ const trainingId = Number(match.groups?.trainingId ?? "NaN");
+ if(isNaN(trainingId)){
+ return null;
+ }
+
+ return trainingId;
+}
+// Function to extract training ID from URL if it matches a training path
+
+export async function userTrainingPermissions({ trainingId, userId }: TrainingMatch): Promise {
+ const AUTH_API_URL = 'http://localhost:3000/api/auth/access-control/trainings';
+
+ try {
+ const response = await fetch(AUTH_API_URL, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({ trainingId, userId }),
+ });
+
+ if (!response.ok) return [];
+
+
+ const permissions = await response.json() as TrainingPermissions[];
+ return permissions;
+ } catch (error) {
+ console.error("Failed to check training access:", error);
+ return [];
+ }
+}
diff --git a/src/middlewares/utils.ts b/src/middlewares/utils.ts
new file mode 100644
index 00000000..e1ba62be
--- /dev/null
+++ b/src/middlewares/utils.ts
@@ -0,0 +1,26 @@
+import { NextRequest, NextResponse } from "next/server";
+
+export type NoAction = "NoAction";
+export const NoAction: NoAction = "NoAction";
+
+export function composeMiddlewares(
+ middlewares: ((
+ req: NextRequest,
+ ) => Promise)[],
+): (req: NextRequest) => Promise {
+ return async function (req: NextRequest) {
+ let updatedRequest = req;
+
+ for (const middleware of middlewares) {
+ const result = await middleware(updatedRequest);
+ if (result instanceof NextResponse) {
+ return result;
+ }
+ if (result[0] !== NoAction) {
+ // If the middleware returns a request, update the request
+ updatedRequest = result[1];
+ }
+ }
+ return [NoAction, updatedRequest];
+ };
+}
diff --git a/src/providers/training.tsx b/src/providers/training.tsx
new file mode 100644
index 00000000..7a38999b
--- /dev/null
+++ b/src/providers/training.tsx
@@ -0,0 +1,16 @@
+"use client";
+import { createContext, useContext } from "react";
+import { type TrainingFullDTO } from "@/lib/types/Training";
+const trainingContext = createContext(null);
+export default function TrainingProvider({
+ children,
+ trainingData,
+}: {
+ children: React.ReactNode;
+ trainingData: TrainingFullDTO;
+}) {
+ return {children} ;
+}
+export function useTrainingContext() {
+ return useContext(trainingContext);
+}
diff --git a/src/providers/user.tsx b/src/providers/user.tsx
index 369ab999..daa37b4b 100644
--- a/src/providers/user.tsx
+++ b/src/providers/user.tsx
@@ -1,16 +1,16 @@
"use client";
-import { type userData } from "@/lib/session";
+import { type UserDataJWT } from "@/lib/session";
import { createContext, useContext } from "react";
-const userContext = createContext(null);
+const userContext = createContext(null);
export default function UserProvider({
children,
user,
}: {
children: React.ReactNode;
- user: userData|null;
+ user: UserDataJWT | null;
}) {
return {children} ;
}
-export function useUserContext(){
+export function useUserContext() {
return useContext(userContext);
}
diff --git a/src/styles/base/base.css b/src/styles/base/base.css
new file mode 100644
index 00000000..f6b5f46e
--- /dev/null
+++ b/src/styles/base/base.css
@@ -0,0 +1,11 @@
+* {
+ @apply border-[hsl(var(--border))];
+}
+
+body {
+ @apply bg-[hsl(var(--background))] text-[hsl(var(--foreground))];
+}
+
+.font-arabic {
+ font-family: "Noto Kufi Arabic", "Noto Sans Arabic", Arial, sans-serif;
+}
\ No newline at end of file
diff --git a/src/styles/base/variables.css b/src/styles/base/variables.css
new file mode 100644
index 00000000..8d01cf3a
--- /dev/null
+++ b/src/styles/base/variables.css
@@ -0,0 +1,44 @@
+:root {
+ --background: 0 0% 100%;
+ --foreground: 240 10% 3.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 240 10% 3.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 240 10% 3.9%;
+ --primary: 240 5.9% 10%;
+ --primary-foreground: 0 0% 98%;
+ --secondary: 240 4.8% 95.9%;
+ --secondary-foreground: 240 5.9% 10%;
+ --muted: 240 4.8% 95.9%;
+ --muted-foreground: 240 3.8% 46.1%;
+ --accent: 240 4.8% 95.9%;
+ --accent-foreground: 240 5.9% 10%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 240 5.9% 90%;
+ --input: 240 5.9% 90%;
+ --ring: 240 5.9% 10%;
+ --radius: 0.5rem;
+}
+
+.dark {
+ --background: 240 10% 4%;
+ --foreground: 0 0% 98%;
+ --card: 240 10% 4%;
+ --card-foreground: 0 0% 98%;
+ --popover: 240 10% 4%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 0 0% 98%;
+ --primary-foreground: 240 5.9% 10%;
+ --secondary: 240 4% 8%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 240 4% 8%;
+ --muted-foreground: 240 5% 65%;
+ --accent: 240 4% 8%;
+ --accent-foreground: 0 0% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 240 4% 16%;
+ --input: 240 4% 16%;
+ --ring: 240 5% 65%;
+}
\ No newline at end of file
diff --git a/src/styles/components/auth/auth.css b/src/styles/components/auth/auth.css
new file mode 100644
index 00000000..a626f64d
--- /dev/null
+++ b/src/styles/components/auth/auth.css
@@ -0,0 +1,68 @@
+.auth-container {
+ @apply flex min-h-screen items-center justify-center bg-[hsl(var(--background))];
+}
+
+.auth-card {
+ @apply w-full max-w-md p-8 shadow-lg rounded-lg mt-10 bg-[hsl(var(--card))] text-[hsl(var(--card-foreground))];
+}
+
+.auth-title {
+ @apply text-2xl font-bold mb-4 text-center text-[hsl(var(--foreground))];
+}
+
+.auth-subtitle {
+ @apply text-sm text-[hsl(var(--muted-foreground))] mb-6 text-center;
+}
+
+.auth-form {
+ @apply space-y-6;
+}
+
+.auth-input-wrapper {
+ @apply relative;
+}
+
+.auth-input {
+ @apply w-full bg-[hsl(var(--background))] border border-[hsl(var(--input))] text-[hsl(var(--foreground))]
+ rounded-md p-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--ring))];
+}
+
+.auth-button {
+ @apply w-full bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]
+ py-2 rounded-md hover:opacity-90 transition-colors
+ disabled:opacity-50 disabled:cursor-not-allowed;
+}
+
+.auth-link {
+ @apply text-sm text-center mt-6 text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))];
+}
+
+.auth-error {
+ @apply flex items-center justify-center text-[hsl(var(--destructive))] text-sm mt-2;
+}
+
+.auth-success {
+ @apply flex items-center justify-center text-green-500 text-sm mt-2;
+}
+
+.auth-form-description {
+ @apply text-xs text-[hsl(var(--muted-foreground))] mt-1;
+}
+
+.auth-form-label {
+ @apply text-sm font-medium text-[hsl(var(--foreground))];
+}
+
+.auth-checkbox-wrapper {
+ @apply flex flex-row items-start space-x-3 space-y-0 rounded-md;
+}
+
+.auth-checkbox {
+ @apply mt-1 h-4 w-4 rounded border border-[hsl(var(--input))]
+ bg-[hsl(var(--background))] text-[hsl(var(--primary))]
+ focus:ring-2 focus:ring-[hsl(var(--ring))];
+}
+
+.auth-link-text {
+ @apply text-[hsl(var(--primary))] hover:underline;
+}
\ No newline at end of file
diff --git a/src/styles/components/block.css b/src/styles/components/block.css
new file mode 100644
index 00000000..af2b744e
--- /dev/null
+++ b/src/styles/components/block.css
@@ -0,0 +1,279 @@
+/* blocks.css - Enhanced with motion, interaction, and elegance */
+
+.blocks-wrapper {
+ @apply bg-[hsl(var(--background))]/50 rounded-2xl shadow-lg;
+ animation: fadeIn 0.5s ease-out forwards;
+}
+
+.blocks-content {
+ @apply p-4 md:p-6 ;
+}
+
+.blocks-list {
+ @apply space-y-6;
+}
+
+.block-card {
+ @apply p-5 md:p-6 bg-[hsl(var(--background))] rounded-2xl border border-[hsl(var(--border))]
+ hover:shadow-xl hover:scale-[1.02] transition-all duration-300 ease-in-out relative;
+ overflow: hidden;
+}
+
+.block-card::before {
+ content: "";
+ @apply absolute top-0 left-0 w-full h-[4px] bg-[hsl(var(--primary))];
+ animation: slideIn 0.4s ease-out forwards;
+}
+
+.block-header {
+ @apply flex justify-between items-start gap-4;
+}
+
+.block-title {
+ @apply text-xl md:text-2xl font-bold text-[hsl(var(--foreground))] tracking-tight;
+}
+
+.block-description {
+ @apply mt-2 text-[hsl(var(--muted-foreground))] leading-relaxed;
+}
+
+.materials-section {
+ @apply mt-6 pt-4 border-t border-[hsl(var(--border))];
+}
+
+.material-item {
+ @apply flex justify-between items-center gap-3 py-3 px-2 bg-[hsl(var(--muted)/0.1)] rounded-lg hover:bg-[hsl(var(--muted)/0.2)] transition;
+}
+
+.material-icon {
+ @apply w-6 h-6 text-[hsl(var(--muted-foreground))];
+}
+
+.material-link {
+ @apply text-[hsl(var(--primary))] font-medium hover:underline hover:text-[hsl(var(--primary)/0.9)] transition;
+}
+
+.view-material-button {
+ @apply inline-flex items-center gap-2 px-4 py-1.5 text-sm font-semibold rounded-md
+ text-[hsl(var(--primary))] border border-[hsl(var(--primary))]
+ hover:bg-[hsl(var(--primary)/0.1)] hover:text-[hsl(var(--primary-foreground))]
+ transition-colors duration-200;
+}
+
+.actions-section {
+ @apply mt-6 pt-4 border-t border-[hsl(var(--border))] flex gap-4;
+}
+
+.action-button {
+ @apply px-4 py-2 text-sm font-medium rounded-xl transition-all duration-200;
+}
+
+.edit-button {
+ @apply bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]
+ hover:bg-[hsl(var(--primary)/0.85)] shadow hover:shadow-md;
+}
+
+
+.delete-button {
+ @apply action-button bg-red-600 text-white hover:bg-red-700
+ px-4 py-2 rounded-lg flex items-center gap-2
+ transition-all duration-200 ease-in-out;
+}
+
+
+.contest-button {
+ @apply bg-[hsl(var(--secondary))] text-[hsl(var(--secondary-foreground))]
+ hover:bg-[hsl(var(--secondary)/0.9)] border border-[hsl(var(--border))] shadow-sm;
+}
+
+.add-block-button {
+ @apply inline-flex items-center gap-2 px-4 py-2 text-sm font-semibold rounded-xl
+ bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]
+ hover:bg-[hsl(var(--primary)/0.9)] hover:shadow-lg transition-all;
+}
+
+.empty-icon {
+ @apply mx-auto w-12 h-12 text-[hsl(var(--muted-foreground))];
+}
+
+.empty-text {
+ @apply mt-4 text-[hsl(var(--muted-foreground))] text-base;
+}
+
+/* Animations */
+@keyframes fadeIn {
+ from { opacity: 0; transform: translateY(10px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+@keyframes slideIn {
+ from { transform: scaleX(0); }
+ to { transform: scaleX(1); }
+}
+
+
+.form-layout {
+ @apply bg-white dark:bg-[hsl(var(--background))]
+ rounded-[2rem] p-10 md:p-12 shadow-2xl
+ max-w-3xl w-full mx-auto space-y-10
+ transition-all duration-500 ease-out
+ backdrop-blur-sm bg-opacity-90
+
+}
+
+.form-field {
+ @apply flex flex-col gap-2;
+}
+
+.form-label {
+ @apply text-sm font-semibold text-[hsl(var(--muted-foreground))] tracking-wide;
+}
+
+.form-input {
+ @apply w-full rounded-2xl border border-[hsl(var(--border))] bg-[hsl(var(--accent))]
+ px-5 py-3 text-[hsl(var(--foreground))] placeholder:text-[hsl(var(--muted-foreground))]
+ focus:outline-none focus:ring-4 focus:ring-[hsl(var(--primary)/0.4)] focus:border-[hsl(var(--primary))]
+ transition-all duration-300 ease-in-out shadow-sm hover:shadow-md
+ backdrop-blur-sm bg-opacity-70;
+}
+
+/* Optional: Add animations for focus or input filled */
+.form-input:focus {
+ box-shadow: 0 0 0 4px hsl(var(--primary) / 0.2);
+}
+
+/* Example animation on hover */
+.form-input:hover {
+ @apply border-[hsl(var(--primary))];
+}
+
+/* Define popup styles */
+.popup-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: rgba(0, 0, 0, 0.5); /* Semi-transparent background */
+ visibility: hidden; /* Hidden by default */
+ opacity: 0;
+ transition: visibility 0s, opacity 0.3s ease-in-out; /* Fade-in effect */
+}
+
+.popup-container.show {
+ visibility: visible;
+ opacity: 1;
+}
+
+.popup-content {
+ background-color: white;
+ border-radius: 2rem;
+ padding: 2.5rem;
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
+ max-width: 50%;
+ width: 100%;
+ text-align: center;
+ background: rgba(255, 255, 255, 0.9); /* Slight transparency */
+ backdrop-filter: blur(10px); /* Glassmorphism effect */
+ transition: transform 0.5s ease-out;
+ transform: translateY(-20px); /* Start with a small offset */
+}
+
+.popup-container.show .popup-content {
+ transform: translateY(0); /* Slide into place */
+}
+
+.popup-icon {
+ color: #48bb78; /* Success green */
+ font-size: 3rem;
+}
+
+.popup-message {
+ font-size: 1.125rem;
+ font-weight: 600;
+ color: #2d3748; /* Dark gray text */
+ margin-top: 1rem;
+}
+
+.popup-close-btn {
+ background-color: #48bb78; /* Success green */
+ color: white;
+ padding: 0.75rem 2rem;
+ border-radius: 1rem;
+ margin-top: 1.5rem;
+ cursor: pointer;
+ transition: background-color 0.3s;
+}
+
+.popup-close-btn:hover {
+ background-color: #38a169; /* Darker green on hover */
+}
+
+
+/* Toggle Switch Styles */
+.toggle-field {
+ @apply flex items-center gap-4;
+}
+
+.toggle-label {
+ @apply text-sm font-semibold text-[hsl(var(--muted-foreground))] cursor-pointer;
+}
+
+.toggle-container {
+ @apply relative inline-block w-12 h-6;
+}
+
+.toggle-input {
+ @apply opacity-0 w-0 h-0;
+}
+
+.toggle-slider {
+ @apply absolute cursor-pointer inset-0 bg-[hsl(var(--muted))] rounded-full
+ transition-all duration-300 before:content-[''] before:absolute before:h-5 before:w-5
+ before:left-0.5 before:bottom-0.5 before:bg-white before:rounded-full
+ before:transition-all before:duration-300 before:shadow-md;
+}
+
+.toggle-input:checked + .toggle-slider {
+ @apply bg-[hsl(var(--primary))];
+}
+
+.toggle-input:checked + .toggle-slider:before {
+ @apply translate-x-6;
+}
+
+/* Date Picker Styles */
+.date-field {
+ @apply relative;
+}
+
+.date-input {
+ @apply form-input pr-10 cursor-pointer;
+}
+
+.date-input::-webkit-calendar-picker-indicator {
+ @apply absolute right-3 top-1/2 -translate-y-1/2 w-6 h-6
+ text-[hsl(var(--muted-foreground))] cursor-pointer;
+}
+
+/* Visibility Badge */
+.visibility-badge {
+ @apply inline-flex items-center gap-2 px-3 py-1 rounded-full text-sm
+ transition-colors duration-200;
+}
+
+.visibility-badge.hidden {
+ @apply bg-red-100 text-red-800 dark:bg-red-800/20 dark:text-red-500 !important;
+}
+
+.visibility-badge.visible {
+ @apply bg-green-100 text-green-800 dark:bg-green-800/20 dark:text-green-500;
+}
+
+/* Enhanced Form Field Layout */
+.form-field-group {
+ @apply grid grid-cols-1 md:grid-cols-2 gap-6;
+}
\ No newline at end of file
diff --git a/src/styles/components/profile/profile-edit.css b/src/styles/components/profile/profile-edit.css
new file mode 100644
index 00000000..808f30fa
--- /dev/null
+++ b/src/styles/components/profile/profile-edit.css
@@ -0,0 +1,41 @@
+.profile-edit-container {
+ @apply container mx-auto py-6;
+}
+
+.profile-edit-layout {
+ @apply flex gap-6;
+}
+
+.profile-edit-sidebar {
+ @apply flex-shrink-0 w-64 bg-[hsl(var(--card))] rounded-lg border p-4;
+}
+
+.profile-edit-nav-button {
+ @apply w-full flex items-center gap-3 px-4 py-2 text-sm font-medium rounded-md transition-colors whitespace-nowrap;
+}
+
+.profile-edit-nav-button-active {
+ @apply bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))];
+}
+
+.profile-edit-nav-button-inactive {
+ @apply hover:bg-[hsl(var(--accent))] hover:text-[hsl(var(--accent-foreground))];
+}
+
+.profile-edit-save-button {
+ @apply w-full mt-6 bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]
+ hover:bg-[hsl(var(--primary))]/90 px-4 py-2 rounded-md text-sm font-medium text-left
+ disabled:opacity-50 disabled:cursor-not-allowed;
+}
+
+.profile-edit-main {
+ @apply flex-1 bg-[hsl(var(--card))] rounded-lg border p-6;
+}
+
+.profile-edit-form {
+ @apply space-y-6;
+}
+
+.profile-edit-icon {
+ @apply w-4 h-4 inline-block mr-3 mb-1;
+}
\ No newline at end of file
diff --git a/src/styles/components/profile/profile-form.css b/src/styles/components/profile/profile-form.css
new file mode 100644
index 00000000..fc8dda17
--- /dev/null
+++ b/src/styles/components/profile/profile-form.css
@@ -0,0 +1,43 @@
+.profile-form-container {
+ @apply space-y-6;
+}
+
+.profile-form-section {
+ @apply space-y-4;
+}
+
+.profile-form-row {
+ @apply flex space-x-4 items-center;
+}
+
+.profile-form-label {
+ @apply text-[hsl(var(--foreground))] flex items-center;
+}
+
+.profile-form-icon {
+ @apply mr-2 h-4 w-4;
+}
+
+.profile-form-input {
+ @apply w-full bg-[hsl(var(--background))] text-[hsl(var(--foreground))];
+}
+
+.profile-form-select {
+ @apply bg-[hsl(var(--background))];
+}
+
+.profile-form-select-content {
+ @apply !bg-[hsl(var(--popover))] border shadow-md !z-[100];
+}
+
+.profile-form-visibility-btn {
+ @apply text-[hsl(var(--muted-foreground))];
+}
+
+.profile-form-description {
+ @apply text-[hsl(var(--muted-foreground))];
+}
+
+.profile-form-group {
+ @apply flex items-center space-x-2;
+}
\ No newline at end of file
diff --git a/src/styles/components/profile/profile-view.css b/src/styles/components/profile/profile-view.css
new file mode 100644
index 00000000..b1987833
--- /dev/null
+++ b/src/styles/components/profile/profile-view.css
@@ -0,0 +1,161 @@
+.profile-wrapper {
+ @apply bg-[hsl(var(--background))]/50 rounded-xl;
+}
+
+.profile-content {
+ @apply p-4 md:p-6;
+}
+
+.profile-tabs {
+ @apply flex flex-wrap md:flex-nowrap space-x-4 mt-6 border-b border-[hsl(var(--border))];
+}
+
+.profile-tab {
+ @apply px-3 md:px-4 py-2 font-medium text-sm md:text-base;
+}
+
+.profile-tab-active {
+ @apply text-[hsl(var(--primary))] border-b-2 border-[hsl(var(--primary))];
+}
+
+.profile-tab-inactive {
+ @apply text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))];
+}
+
+.profile-tab-content {
+ @apply px-4 md:px-6 pt-4;
+}
+
+.profile-section {
+ @apply grid grid-cols-1 sm:grid-cols-2 gap-4 md:gap-6 mb-6 md:mb-8;
+}
+
+.profile-platform-card {
+ @apply h-[72px];
+}
+
+.profile-platform {
+ @apply flex items-center h-full space-x-4 px-4 md:px-5 bg-[hsl(var(--background))]
+ rounded-xl border border-[hsl(var(--border))] hover:shadow-md transition-all duration-200;
+}
+
+.profile-platform-icon {
+ @apply flex-shrink-0 w-9 h-9 md:w-10 md:h-10 flex items-center justify-center rounded-lg
+ bg-[hsl(var(--muted))] text-[hsl(var(--muted-foreground))];
+}
+
+.profile-platform-content {
+ @apply flex-1 min-w-0 flex flex-col justify-center py-3;
+}
+
+.profile-platform-label {
+ @apply text-sm font-medium text-[hsl(var(--muted-foreground))];
+}
+
+.profile-platform-value {
+ @apply text-base font-semibold text-[hsl(var(--foreground))] truncate
+ hover:text-[hsl(var(--primary))] transition-colors;
+}
+
+.profile-user-info {
+ @apply flex flex-col md:flex-row gap-6 md:gap-8;
+}
+
+.profile-photo-section {
+ @apply flex md:block items-center gap-4 md:gap-0;
+}
+
+.profile-photo {
+ @apply flex-shrink-0;
+}
+
+.profile-photo-image {
+ @apply object-cover rounded-lg w-24 h-24 md:w-[140px] md:h-[140px];
+}
+
+.profile-username {
+ @apply mt-2 text-center font-medium text-[hsl(var(--muted-foreground))] md:mt-2;
+}
+
+.profile-info-section {
+ @apply flex-1;
+}
+
+.profile-name {
+ @apply text-xl md:text-2xl font-bold text-[hsl(var(--foreground))] mb-4;
+}
+
+.profile-name-ar {
+ @apply text-base md:text-lg text-[hsl(var(--muted-foreground))] mt-1;
+ font-family: "Noto Kufi Arabic", "Noto Sans Arabic", Arial, sans-serif;
+}
+
+.profile-location {
+ @apply flex items-center text-[hsl(var(--muted-foreground))];
+}
+
+.profile-container {
+ @apply bg-[hsl(var(--background))] p-8 border border-[hsl(var(--border))] rounded-lg shadow-sm;
+}
+
+.user-info {
+ @apply grid grid-cols-[1fr,auto] gap-8 mb-8 pb-8 border-b border-[hsl(var(--border))];
+}
+
+.info-section {
+ @apply flex flex-col gap-4;
+}
+
+.info-section div {
+ @apply text-[0.95rem];
+}
+
+.info-section span {
+ @apply text-[hsl(var(--muted-foreground))] mr-2;
+}
+
+.info-section .info-value {
+ @apply text-[hsl(var(--foreground))];
+}
+
+.photo-section {
+ @apply text-center;
+}
+
+.photo-placeholder {
+ @apply w-[140px] h-[140px] bg-[hsl(var(--muted))] rounded-lg mb-4 border border-[hsl(var(--border))]
+ overflow-hidden flex items-center justify-center;
+}
+
+.photo-placeholder img {
+ @apply w-full h-full object-cover;
+}
+
+.username {
+ @apply text-base font-medium text-[hsl(var(--foreground))];
+}
+
+.platform {
+ @apply py-3 border-b border-[hsl(var(--border))] flex items-center gap-4 text-sm last:border-b-0 last:pb-0;
+}
+
+.platform-icon {
+ @apply text-[hsl(var(--muted-foreground))] w-5 h-5 flex-shrink-0;
+}
+
+.platform-name {
+ @apply text-[hsl(var(--muted-foreground))] w-[120px] flex-shrink-0;
+}
+
+.platform-handle {
+ @apply font-medium text-[hsl(var(--foreground))] flex-1;
+}
+
+.profile-section {
+ @apply bg-[hsl(var(--background))] p-6 border border-[hsl(var(--border))] rounded-lg mb-4;
+}
+
+.chatbot-section {
+ @apply bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] p-3 rounded-md text-center
+ my-4 text-sm font-medium;
+}
\ No newline at end of file
diff --git a/src/styles/components/shared/buttons.css b/src/styles/components/shared/buttons.css
new file mode 100644
index 00000000..c681de40
--- /dev/null
+++ b/src/styles/components/shared/buttons.css
@@ -0,0 +1,19 @@
+.btn {
+ @apply inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--ring))] focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none;
+}
+
+.btn-primary {
+ @apply bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] hover:bg-[hsl(var(--primary))]/90;
+}
+
+.btn-secondary {
+ @apply bg-[hsl(var(--secondary))] text-[hsl(var(--secondary-foreground))] hover:bg-[hsl(var(--secondary))]/80;
+}
+
+.btn-destructive {
+ @apply bg-[hsl(var(--destructive))] text-[hsl(var(--destructive-foreground))] hover:bg-[hsl(var(--destructive))]/90;
+}
+
+.btn-outline {
+ @apply border border-[hsl(var(--input))] bg-[hsl(var(--background))] hover:bg-[hsl(var(--accent))] hover:text-[hsl(var(--accent-foreground))];
+}
\ No newline at end of file
diff --git a/tailwind.config.js b/tailwind.config.js
index 197f87d7..7986d21c 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -1,103 +1,103 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
- darkMode: ["class"],
- content: [
- './pages/**/*.{ts,tsx}',
- './components/**/*.{ts,tsx}',
- './app/**/*.{ts,tsx}',
- './src/**/*.{ts,tsx}',
+ darkMode: ["class"],
+ content: [
+ "./pages/**/*.{ts,tsx}",
+ "./components/**/*.{ts,tsx}",
+ "./app/**/*.{ts,tsx}",
+ "./src/**/*.{ts,tsx}",
],
theme: {
- screens: {
- 'sm': '640px',
- 'md': '768px',
- 'lg': '1024px',
- 'xl': '1280px',
- '2xl': '1536px',
- },
- container: {
- center: true,
- padding: "2rem",
- screens: {
- "2xl": "1400px",
- },
- },
- extend: {
- maxWidth: {
- '7xl': '80rem',
- },
- borderRadius: {
- lg: 'var(--radius)',
- md: 'calc(var(--radius) - 2px)',
- sm: 'calc(var(--radius) - 4px)'
- },
- colors: {
- border: 'hsl(var(--border))',
- input: 'hsl(var(--input))',
- ring: 'hsl(var(--ring))',
- background: 'hsl(var(--background))',
- foreground: 'hsl(var(--foreground))',
- primary: {
- DEFAULT: 'hsl(var(--primary))',
- foreground: 'hsl(var(--primary-foreground))'
- },
- secondary: {
- DEFAULT: 'hsl(var(--secondary))',
- foreground: 'hsl(var(--secondary-foreground))'
- },
- destructive: {
- DEFAULT: 'hsl(var(--destructive))',
- foreground: 'hsl(var(--destructive-foreground))'
- },
- muted: {
- DEFAULT: 'hsl(var(--muted))',
- foreground: 'hsl(var(--muted-foreground))'
- },
- accent: {
- DEFAULT: 'hsl(var(--accent))',
- foreground: 'hsl(var(--accent-foreground))'
- },
- popover: {
- DEFAULT: 'hsl(var(--popover))',
- foreground: 'hsl(var(--popover-foreground))'
- },
- card: {
- DEFAULT: 'hsl(var(--card))',
- foreground: 'hsl(var(--card-foreground))'
- },
- chart: {
- '1': 'hsl(var(--chart-1))',
- '2': 'hsl(var(--chart-2))',
- '3': 'hsl(var(--chart-3))',
- '4': 'hsl(var(--chart-4))',
- '5': 'hsl(var(--chart-5))'
- },
- sidebar: {
- DEFAULT: 'hsl(var(--sidebar-background))',
- foreground: 'hsl(var(--sidebar-foreground))',
- primary: 'hsl(var(--sidebar-primary))',
- 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))',
- accent: 'hsl(var(--sidebar-accent))',
- 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',
- border: 'hsl(var(--sidebar-border))',
- ring: 'hsl(var(--sidebar-ring))'
- }
- },
- keyframes: {
- "accordion-down": {
- from: { height: 0 },
- to: { height: "var(--radix-accordion-content-height)" },
- },
- "accordion-up": {
- from: { height: "var(--radix-accordion-content-height)" },
- to: { height: 0 },
- },
- },
- animation: {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out",
- },
- }
+ screens: {
+ sm: "640px",
+ md: "768px",
+ lg: "1024px",
+ xl: "1280px",
+ "2xl": "1536px",
+ },
+ container: {
+ center: true,
+ padding: "2rem",
+ screens: {
+ "2xl": "1400px",
+ },
+ },
+ extend: {
+ maxWidth: {
+ "7xl": "80rem",
+ },
+ borderRadius: {
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
+ colors: {
+ border: "hsl(var(--border))",
+ input: "hsl(var(--input))",
+ ring: "hsl(var(--ring))",
+ background: "hsl(var(--background))",
+ foreground: "hsl(var(--foreground))",
+ primary: {
+ DEFAULT: "hsl(var(--primary))",
+ foreground: "hsl(var(--primary-foreground))",
+ },
+ secondary: {
+ DEFAULT: "hsl(var(--secondary))",
+ foreground: "hsl(var(--secondary-foreground))",
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive))",
+ foreground: "hsl(var(--destructive-foreground))",
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted))",
+ foreground: "hsl(var(--muted-foreground))",
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent))",
+ foreground: "hsl(var(--accent-foreground))",
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover))",
+ foreground: "hsl(var(--popover-foreground))",
+ },
+ card: {
+ DEFAULT: "hsl(var(--card))",
+ foreground: "hsl(var(--card-foreground))",
+ },
+ chart: {
+ 1: "hsl(var(--chart-1))",
+ 2: "hsl(var(--chart-2))",
+ 3: "hsl(var(--chart-3))",
+ 4: "hsl(var(--chart-4))",
+ 5: "hsl(var(--chart-5))",
+ },
+ sidebar: {
+ DEFAULT: "hsl(var(--sidebar-background))",
+ foreground: "hsl(var(--sidebar-foreground))",
+ primary: "hsl(var(--sidebar-primary))",
+ "primary-foreground": "hsl(var(--sidebar-primary-foreground))",
+ accent: "hsl(var(--sidebar-accent))",
+ "accent-foreground": "hsl(var(--sidebar-accent-foreground))",
+ border: "hsl(var(--sidebar-border))",
+ ring: "hsl(var(--sidebar-ring))",
+ },
+ },
+ keyframes: {
+ "accordion-down": {
+ from: { height: 0 },
+ to: { height: "var(--radix-accordion-content-height)" },
+ },
+ "accordion-up": {
+ from: { height: "var(--radix-accordion-content-height)" },
+ to: { height: 0 },
+ },
+ },
+ animation: {
+ "accordion-down": "accordion-down 0.2s ease-out",
+ "accordion-up": "accordion-up 0.2s ease-out",
+ },
+ },
},
plugins: [require("tailwindcss-animate")],
};
diff --git a/tailwind.config.ts b/tailwind.config.ts
index fcd3fef1..78292368 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -1,71 +1,71 @@
/** @type {import('tailwindcss').Config} */
const tailwindcss = {
- darkMode: ["class"],
- content: [
+ darkMode: ["class"],
+ content: [
"./pages/**/*.{js,ts,jsx,tsx}",
"./components/**/*.{js,ts,jsx,tsx}",
"./app/**/*.{js,ts,jsx,tsx}",
],
theme: {
- extend: {
- borderRadius: {
- lg: 'var(--radius)',
- md: 'calc(var(--radius) - 2px)',
- sm: 'calc(var(--radius) - 4px)'
- },
- colors: {
- background: 'hsl(var(--background))',
- foreground: 'hsl(var(--foreground))',
- card: {
- DEFAULT: 'hsl(var(--card))',
- foreground: 'hsl(var(--card-foreground))'
- },
- popover: {
- DEFAULT: 'hsl(var(--popover))',
- foreground: 'hsl(var(--popover-foreground))'
- },
- primary: {
- DEFAULT: 'hsl(var(--primary))',
- foreground: 'hsl(var(--primary-foreground))'
- },
- secondary: {
- DEFAULT: 'hsl(var(--secondary))',
- foreground: 'hsl(var(--secondary-foreground))'
- },
- muted: {
- DEFAULT: 'hsl(var(--muted))',
- foreground: 'hsl(var(--muted-foreground))'
- },
- accent: {
- DEFAULT: 'hsl(var(--accent))',
- foreground: 'hsl(var(--accent-foreground))'
- },
- destructive: {
- DEFAULT: 'hsl(var(--destructive))',
- foreground: 'hsl(var(--destructive-foreground))'
- },
- border: 'hsl(var(--border))',
- input: 'hsl(var(--input))',
- ring: 'hsl(var(--ring))',
- chart: {
- '1': 'hsl(var(--chart-1))',
- '2': 'hsl(var(--chart-2))',
- '3': 'hsl(var(--chart-3))',
- '4': 'hsl(var(--chart-4))',
- '5': 'hsl(var(--chart-5))'
- },
- sidebar: {
- DEFAULT: 'hsl(var(--sidebar-background))',
- foreground: 'hsl(var(--sidebar-foreground))',
- primary: 'hsl(var(--sidebar-primary))',
- 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))',
- accent: 'hsl(var(--sidebar-accent))',
- 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',
- border: 'hsl(var(--sidebar-border))',
- ring: 'hsl(var(--sidebar-ring))'
- }
- }
- }
+ extend: {
+ borderRadius: {
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
+ colors: {
+ background: "hsl(var(--background))",
+ foreground: "hsl(var(--foreground))",
+ card: {
+ DEFAULT: "hsl(var(--card))",
+ foreground: "hsl(var(--card-foreground))",
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover))",
+ foreground: "hsl(var(--popover-foreground))",
+ },
+ primary: {
+ DEFAULT: "hsl(var(--primary))",
+ foreground: "hsl(var(--primary-foreground))",
+ },
+ secondary: {
+ DEFAULT: "hsl(var(--secondary))",
+ foreground: "hsl(var(--secondary-foreground))",
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted))",
+ foreground: "hsl(var(--muted-foreground))",
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent))",
+ foreground: "hsl(var(--accent-foreground))",
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive))",
+ foreground: "hsl(var(--destructive-foreground))",
+ },
+ border: "hsl(var(--border))",
+ input: "hsl(var(--input))",
+ ring: "hsl(var(--ring))",
+ chart: {
+ "1": "hsl(var(--chart-1))",
+ "2": "hsl(var(--chart-2))",
+ "3": "hsl(var(--chart-3))",
+ "4": "hsl(var(--chart-4))",
+ "5": "hsl(var(--chart-5))",
+ },
+ sidebar: {
+ DEFAULT: "hsl(var(--sidebar-background))",
+ foreground: "hsl(var(--sidebar-foreground))",
+ primary: "hsl(var(--sidebar-primary))",
+ "primary-foreground": "hsl(var(--sidebar-primary-foreground))",
+ accent: "hsl(var(--sidebar-accent))",
+ "accent-foreground": "hsl(var(--sidebar-accent-foreground))",
+ border: "hsl(var(--sidebar-border))",
+ ring: "hsl(var(--sidebar-ring))",
+ },
+ },
+ },
},
plugins: [require("tailwindcss-animate")],
};
diff --git a/tests-examples/demo-todo-app.spec.ts b/tests-examples/demo-todo-app.spec.ts
new file mode 100644
index 00000000..8641cb5f
--- /dev/null
+++ b/tests-examples/demo-todo-app.spec.ts
@@ -0,0 +1,437 @@
+import { test, expect, type Page } from '@playwright/test';
+
+test.beforeEach(async ({ page }) => {
+ await page.goto('https://demo.playwright.dev/todomvc');
+});
+
+const TODO_ITEMS = [
+ 'buy some cheese',
+ 'feed the cat',
+ 'book a doctors appointment'
+] as const;
+
+test.describe('New Todo', () => {
+ test('should allow me to add todo items', async ({ page }) => {
+ // create a new todo locator
+ const newTodo = page.getByPlaceholder('What needs to be done?');
+
+ // Create 1st todo.
+ await newTodo.fill(TODO_ITEMS[0]);
+ await newTodo.press('Enter');
+
+ // Make sure the list only has one todo item.
+ await expect(page.getByTestId('todo-title')).toHaveText([
+ TODO_ITEMS[0]
+ ]);
+
+ // Create 2nd todo.
+ await newTodo.fill(TODO_ITEMS[1]);
+ await newTodo.press('Enter');
+
+ // Make sure the list now has two todo items.
+ await expect(page.getByTestId('todo-title')).toHaveText([
+ TODO_ITEMS[0],
+ TODO_ITEMS[1]
+ ]);
+
+ await checkNumberOfTodosInLocalStorage(page, 2);
+ });
+
+ test('should clear text input field when an item is added', async ({ page }) => {
+ // create a new todo locator
+ const newTodo = page.getByPlaceholder('What needs to be done?');
+
+ // Create one todo item.
+ await newTodo.fill(TODO_ITEMS[0]);
+ await newTodo.press('Enter');
+
+ // Check that input is empty.
+ await expect(newTodo).toBeEmpty();
+ await checkNumberOfTodosInLocalStorage(page, 1);
+ });
+
+ test('should append new items to the bottom of the list', async ({ page }) => {
+ // Create 3 items.
+ await createDefaultTodos(page);
+
+ // create a todo count locator
+ const todoCount = page.getByTestId('todo-count')
+
+ // Check test using different methods.
+ await expect(page.getByText('3 items left')).toBeVisible();
+ await expect(todoCount).toHaveText('3 items left');
+ await expect(todoCount).toContainText('3');
+ await expect(todoCount).toHaveText(/3/);
+
+ // Check all items in one call.
+ await expect(page.getByTestId('todo-title')).toHaveText(TODO_ITEMS);
+ await checkNumberOfTodosInLocalStorage(page, 3);
+ });
+});
+
+test.describe('Mark all as completed', () => {
+ test.beforeEach(async ({ page }) => {
+ await createDefaultTodos(page);
+ await checkNumberOfTodosInLocalStorage(page, 3);
+ });
+
+ test.afterEach(async ({ page }) => {
+ await checkNumberOfTodosInLocalStorage(page, 3);
+ });
+
+ test('should allow me to mark all items as completed', async ({ page }) => {
+ // Complete all todos.
+ await page.getByLabel('Mark all as complete').check();
+
+ // Ensure all todos have 'completed' class.
+ await expect(page.getByTestId('todo-item')).toHaveClass(['completed', 'completed', 'completed']);
+ await checkNumberOfCompletedTodosInLocalStorage(page, 3);
+ });
+
+ test('should allow me to clear the complete state of all items', async ({ page }) => {
+ const toggleAll = page.getByLabel('Mark all as complete');
+ // Check and then immediately uncheck.
+ await toggleAll.check();
+ await toggleAll.uncheck();
+
+ // Should be no completed classes.
+ await expect(page.getByTestId('todo-item')).toHaveClass(['', '', '']);
+ });
+
+ test('complete all checkbox should update state when items are completed / cleared', async ({ page }) => {
+ const toggleAll = page.getByLabel('Mark all as complete');
+ await toggleAll.check();
+ await expect(toggleAll).toBeChecked();
+ await checkNumberOfCompletedTodosInLocalStorage(page, 3);
+
+ // Uncheck first todo.
+ const firstTodo = page.getByTestId('todo-item').nth(0);
+ await firstTodo.getByRole('checkbox').uncheck();
+
+ // Reuse toggleAll locator and make sure its not checked.
+ await expect(toggleAll).not.toBeChecked();
+
+ await firstTodo.getByRole('checkbox').check();
+ await checkNumberOfCompletedTodosInLocalStorage(page, 3);
+
+ // Assert the toggle all is checked again.
+ await expect(toggleAll).toBeChecked();
+ });
+});
+
+test.describe('Item', () => {
+
+ test('should allow me to mark items as complete', async ({ page }) => {
+ // create a new todo locator
+ const newTodo = page.getByPlaceholder('What needs to be done?');
+
+ // Create two items.
+ for (const item of TODO_ITEMS.slice(0, 2)) {
+ await newTodo.fill(item);
+ await newTodo.press('Enter');
+ }
+
+ // Check first item.
+ const firstTodo = page.getByTestId('todo-item').nth(0);
+ await firstTodo.getByRole('checkbox').check();
+ await expect(firstTodo).toHaveClass('completed');
+
+ // Check second item.
+ const secondTodo = page.getByTestId('todo-item').nth(1);
+ await expect(secondTodo).not.toHaveClass('completed');
+ await secondTodo.getByRole('checkbox').check();
+
+ // Assert completed class.
+ await expect(firstTodo).toHaveClass('completed');
+ await expect(secondTodo).toHaveClass('completed');
+ });
+
+ test('should allow me to un-mark items as complete', async ({ page }) => {
+ // create a new todo locator
+ const newTodo = page.getByPlaceholder('What needs to be done?');
+
+ // Create two items.
+ for (const item of TODO_ITEMS.slice(0, 2)) {
+ await newTodo.fill(item);
+ await newTodo.press('Enter');
+ }
+
+ const firstTodo = page.getByTestId('todo-item').nth(0);
+ const secondTodo = page.getByTestId('todo-item').nth(1);
+ const firstTodoCheckbox = firstTodo.getByRole('checkbox');
+
+ await firstTodoCheckbox.check();
+ await expect(firstTodo).toHaveClass('completed');
+ await expect(secondTodo).not.toHaveClass('completed');
+ await checkNumberOfCompletedTodosInLocalStorage(page, 1);
+
+ await firstTodoCheckbox.uncheck();
+ await expect(firstTodo).not.toHaveClass('completed');
+ await expect(secondTodo).not.toHaveClass('completed');
+ await checkNumberOfCompletedTodosInLocalStorage(page, 0);
+ });
+
+ test('should allow me to edit an item', async ({ page }) => {
+ await createDefaultTodos(page);
+
+ const todoItems = page.getByTestId('todo-item');
+ const secondTodo = todoItems.nth(1);
+ await secondTodo.dblclick();
+ await expect(secondTodo.getByRole('textbox', { name: 'Edit' })).toHaveValue(TODO_ITEMS[1]);
+ await secondTodo.getByRole('textbox', { name: 'Edit' }).fill('buy some sausages');
+ await secondTodo.getByRole('textbox', { name: 'Edit' }).press('Enter');
+
+ // Explicitly assert the new text value.
+ await expect(todoItems).toHaveText([
+ TODO_ITEMS[0],
+ 'buy some sausages',
+ TODO_ITEMS[2]
+ ]);
+ await checkTodosInLocalStorage(page, 'buy some sausages');
+ });
+});
+
+test.describe('Editing', () => {
+ test.beforeEach(async ({ page }) => {
+ await createDefaultTodos(page);
+ await checkNumberOfTodosInLocalStorage(page, 3);
+ });
+
+ test('should hide other controls when editing', async ({ page }) => {
+ const todoItem = page.getByTestId('todo-item').nth(1);
+ await todoItem.dblclick();
+ await expect(todoItem.getByRole('checkbox')).not.toBeVisible();
+ await expect(todoItem.locator('label', {
+ hasText: TODO_ITEMS[1],
+ })).not.toBeVisible();
+ await checkNumberOfTodosInLocalStorage(page, 3);
+ });
+
+ test('should save edits on blur', async ({ page }) => {
+ const todoItems = page.getByTestId('todo-item');
+ await todoItems.nth(1).dblclick();
+ await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages');
+ await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).dispatchEvent('blur');
+
+ await expect(todoItems).toHaveText([
+ TODO_ITEMS[0],
+ 'buy some sausages',
+ TODO_ITEMS[2],
+ ]);
+ await checkTodosInLocalStorage(page, 'buy some sausages');
+ });
+
+ test('should trim entered text', async ({ page }) => {
+ const todoItems = page.getByTestId('todo-item');
+ await todoItems.nth(1).dblclick();
+ await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(' buy some sausages ');
+ await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter');
+
+ await expect(todoItems).toHaveText([
+ TODO_ITEMS[0],
+ 'buy some sausages',
+ TODO_ITEMS[2],
+ ]);
+ await checkTodosInLocalStorage(page, 'buy some sausages');
+ });
+
+ test('should remove the item if an empty text string was entered', async ({ page }) => {
+ const todoItems = page.getByTestId('todo-item');
+ await todoItems.nth(1).dblclick();
+ await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('');
+ await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter');
+
+ await expect(todoItems).toHaveText([
+ TODO_ITEMS[0],
+ TODO_ITEMS[2],
+ ]);
+ });
+
+ test('should cancel edits on escape', async ({ page }) => {
+ const todoItems = page.getByTestId('todo-item');
+ await todoItems.nth(1).dblclick();
+ await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages');
+ await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Escape');
+ await expect(todoItems).toHaveText(TODO_ITEMS);
+ });
+});
+
+test.describe('Counter', () => {
+ test('should display the current number of todo items', async ({ page }) => {
+ // create a new todo locator
+ const newTodo = page.getByPlaceholder('What needs to be done?');
+
+ // create a todo count locator
+ const todoCount = page.getByTestId('todo-count')
+
+ await newTodo.fill(TODO_ITEMS[0]);
+ await newTodo.press('Enter');
+
+ await expect(todoCount).toContainText('1');
+
+ await newTodo.fill(TODO_ITEMS[1]);
+ await newTodo.press('Enter');
+ await expect(todoCount).toContainText('2');
+
+ await checkNumberOfTodosInLocalStorage(page, 2);
+ });
+});
+
+test.describe('Clear completed button', () => {
+ test.beforeEach(async ({ page }) => {
+ await createDefaultTodos(page);
+ });
+
+ test('should display the correct text', async ({ page }) => {
+ await page.locator('.todo-list li .toggle').first().check();
+ await expect(page.getByRole('button', { name: 'Clear completed' })).toBeVisible();
+ });
+
+ test('should remove completed items when clicked', async ({ page }) => {
+ const todoItems = page.getByTestId('todo-item');
+ await todoItems.nth(1).getByRole('checkbox').check();
+ await page.getByRole('button', { name: 'Clear completed' }).click();
+ await expect(todoItems).toHaveCount(2);
+ await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]);
+ });
+
+ test('should be hidden when there are no items that are completed', async ({ page }) => {
+ await page.locator('.todo-list li .toggle').first().check();
+ await page.getByRole('button', { name: 'Clear completed' }).click();
+ await expect(page.getByRole('button', { name: 'Clear completed' })).toBeHidden();
+ });
+});
+
+test.describe('Persistence', () => {
+ test('should persist its data', async ({ page }) => {
+ // create a new todo locator
+ const newTodo = page.getByPlaceholder('What needs to be done?');
+
+ for (const item of TODO_ITEMS.slice(0, 2)) {
+ await newTodo.fill(item);
+ await newTodo.press('Enter');
+ }
+
+ const todoItems = page.getByTestId('todo-item');
+ const firstTodoCheck = todoItems.nth(0).getByRole('checkbox');
+ await firstTodoCheck.check();
+ await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]);
+ await expect(firstTodoCheck).toBeChecked();
+ await expect(todoItems).toHaveClass(['completed', '']);
+
+ // Ensure there is 1 completed item.
+ await checkNumberOfCompletedTodosInLocalStorage(page, 1);
+
+ // Now reload.
+ await page.reload();
+ await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]);
+ await expect(firstTodoCheck).toBeChecked();
+ await expect(todoItems).toHaveClass(['completed', '']);
+ });
+});
+
+test.describe('Routing', () => {
+ test.beforeEach(async ({ page }) => {
+ await createDefaultTodos(page);
+ // make sure the app had a chance to save updated todos in storage
+ // before navigating to a new view, otherwise the items can get lost :(
+ // in some frameworks like Durandal
+ await checkTodosInLocalStorage(page, TODO_ITEMS[0]);
+ });
+
+ test('should allow me to display active items', async ({ page }) => {
+ const todoItem = page.getByTestId('todo-item');
+ await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check();
+
+ await checkNumberOfCompletedTodosInLocalStorage(page, 1);
+ await page.getByRole('link', { name: 'Active' }).click();
+ await expect(todoItem).toHaveCount(2);
+ await expect(todoItem).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]);
+ });
+
+ test('should respect the back button', async ({ page }) => {
+ const todoItem = page.getByTestId('todo-item');
+ await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check();
+
+ await checkNumberOfCompletedTodosInLocalStorage(page, 1);
+
+ await test.step('Showing all items', async () => {
+ await page.getByRole('link', { name: 'All' }).click();
+ await expect(todoItem).toHaveCount(3);
+ });
+
+ await test.step('Showing active items', async () => {
+ await page.getByRole('link', { name: 'Active' }).click();
+ });
+
+ await test.step('Showing completed items', async () => {
+ await page.getByRole('link', { name: 'Completed' }).click();
+ });
+
+ await expect(todoItem).toHaveCount(1);
+ await page.goBack();
+ await expect(todoItem).toHaveCount(2);
+ await page.goBack();
+ await expect(todoItem).toHaveCount(3);
+ });
+
+ test('should allow me to display completed items', async ({ page }) => {
+ await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check();
+ await checkNumberOfCompletedTodosInLocalStorage(page, 1);
+ await page.getByRole('link', { name: 'Completed' }).click();
+ await expect(page.getByTestId('todo-item')).toHaveCount(1);
+ });
+
+ test('should allow me to display all items', async ({ page }) => {
+ await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check();
+ await checkNumberOfCompletedTodosInLocalStorage(page, 1);
+ await page.getByRole('link', { name: 'Active' }).click();
+ await page.getByRole('link', { name: 'Completed' }).click();
+ await page.getByRole('link', { name: 'All' }).click();
+ await expect(page.getByTestId('todo-item')).toHaveCount(3);
+ });
+
+ test('should highlight the currently applied filter', async ({ page }) => {
+ await expect(page.getByRole('link', { name: 'All' })).toHaveClass('selected');
+
+ //create locators for active and completed links
+ const activeLink = page.getByRole('link', { name: 'Active' });
+ const completedLink = page.getByRole('link', { name: 'Completed' });
+ await activeLink.click();
+
+ // Page change - active items.
+ await expect(activeLink).toHaveClass('selected');
+ await completedLink.click();
+
+ // Page change - completed items.
+ await expect(completedLink).toHaveClass('selected');
+ });
+});
+
+async function createDefaultTodos(page: Page) {
+ // create a new todo locator
+ const newTodo = page.getByPlaceholder('What needs to be done?');
+
+ for (const item of TODO_ITEMS) {
+ await newTodo.fill(item);
+ await newTodo.press('Enter');
+ }
+}
+
+async function checkNumberOfTodosInLocalStorage(page: Page, expected: number) {
+ return await page.waitForFunction(e => {
+ return JSON.parse(localStorage['react-todos']).length === e;
+ }, expected);
+}
+
+async function checkNumberOfCompletedTodosInLocalStorage(page: Page, expected: number) {
+ return await page.waitForFunction(e => {
+ return JSON.parse(localStorage['react-todos']).filter((todo: any) => todo.completed).length === e;
+ }, expected);
+}
+
+async function checkTodosInLocalStorage(page: Page, title: string) {
+ return await page.waitForFunction(t => {
+ return JSON.parse(localStorage['react-todos']).map((todo: any) => todo.title).includes(t);
+ }, title);
+}
diff --git a/tests/login.spec.ts b/tests/login.spec.ts
new file mode 100644
index 00000000..fbec438e
--- /dev/null
+++ b/tests/login.spec.ts
@@ -0,0 +1,139 @@
+import { test, expect } from '@playwright/test';
+
+test.describe("Login Test Suite", () => {
+ const usernameOrEmail = "reda";
+ const password = "Cgmoreda@123";
+
+ test.beforeEach(async ({ page }) => {
+ await page.goto("http://localhost:3001/login");
+ });
+
+ // Positive Test: Successful Login
+ /*test("should redirect to /profile on successful login (status 200)", async ({ page }) => {
+ await page.fill('input[name="username"]', usernameOrEmail);
+ await page.fill('input[name="password"]', password);
+ await page.click('button[type="submit"]');
+ await page.waitForURL("/profile");
+ expect(page.url()).toContain("/profile");
+ });
+
+ // Negative Test: Login with Email Field Empty
+ test("should display error when username field is empty", async ({ page }) => {
+ await page.fill('input[name="password"]', password);
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Email is required");
+ });
+
+ // Negative Test: Login with Password Field Empty
+ test("should display error when password field is empty", async ({ page }) => {
+ await page.fill('input[name="username"]', usernameOrEmail);
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Password is required");
+ });
+
+ // Negative Test: Login with Invalid Email Format
+ test("should display error for invalid username format", async ({ page }) => {
+ await page.fill('input[name="username"]', "invalid-username");
+ await page.fill('input[name="password"]', password);
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Invalid Email format");
+ });
+
+ // Negative Test: Login with Incorrect Password
+ test("should display error for incorrect password", async ({ page }) => {
+ await page.fill('input[name="username"]', usernameOrEmail);
+ await page.fill('input[name="password"]', "wrongpassword");
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Incorrect password");
+ });
+
+ // Security Test: Login with SQL Injection in Email Field
+ test("should prevent SQL injection in username field", async ({ page }) => {
+ await page.fill('input[name="username"]', "cgmoredax@gmail.com' OR '1'='1");
+ await page.fill('input[name="password"]', password);
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Invalid credentials");
+ });
+
+ // Security Test: Login with SQL Injection in Password Field
+ test("should prevent SQL injection in password field", async ({ page }) => {
+ await page.fill('input[name="username"]', usernameOrEmail);
+ await page.fill('input[name="password"]', "Cgmoreda@123' OR '1'='1");
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Invalid credentials");
+ });
+
+ // Security Test: Login with XSS Attempt in Email Field
+ test("should prevent XSS in username field", async ({ page }) => {
+ await page.fill('input[name="username"]', '');
+ await page.fill('input[name="password"]', password);
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Invalid Email format");
+ });
+
+ // Security Test: Login with XSS Attempt in Password Field
+ test("should prevent XSS in password field", async ({ page }) => {
+ await page.fill('input[name="username"]', usernameOrEmail);
+ await page.fill('input[name="password"]', '');
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Invalid credentials");
+ });
+
+ // Edge Case: Login with Password Exceeding Maximum Length
+ test("should display error for password exceeding maximum length", async ({ page }) => {
+ const longPassword = "a".repeat(257); // Assuming max length is 256
+ await page.fill('input[name="username"]', usernameOrEmail);
+ await page.fill('input[name="password"]', longPassword);
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Password must be less than 256 characters");
+ });
+
+ // Edge Case: Login with Email Exceeding Maximum Length
+ test("should display error for username exceeding maximum length", async ({ page }) => {
+ const longEmail = "a".repeat(257) + "@gmail.com"; // Assuming max length is 256
+ await page.fill('input[name="username"]', longEmail);
+ await page.fill('input[name="password"]', password);
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Email must be less than 256 characters");
+ });
+
+ // Edge Case: Login with Password Containing Spaces at Start and End
+ test("should trim spaces in password field", async ({ page }) => {
+ await page.fill('input[name="username"]', usernameOrEmail);
+ await page.fill('input[name="password"]', " Cgmoreda@123 ");
+ await page.click('button[type="submit"]');
+ await page.waitForURL("/profile");
+ expect(page.url()).toContain("/profile");
+ });
+
+ // Edge Case: Login with 'Remember Me' Option Selected
+ test("should remember user after login with 'Remember Me' selected", async ({ page }) => {
+ await page.fill('input[name="username"]', usernameOrEmail);
+ await page.fill('input[name="password"]', password);
+ await page.check('input[name="rememberMe"]');
+ await page.click('button[type="submit"]');
+ await page.waitForURL("/profile");
+
+ // Verify that the user is remembered (e.g., check cookies or local storage)
+ const rememberMeCookie = await page.context().cookies();
+ expect(rememberMeCookie.some(cookie => cookie.name === "rememberMe")).toBeTruthy();
+ });
+
+ // Security Test: Login Attempt After Five Failed Logins
+ test("should lock account after five failed login attempts", async ({ page }) => {
+ for (let i = 0; i < 5; i++) {
+ await page.fill('input[name="username"]', usernameOrEmail);
+ await page.fill('input[name="password"]', "wrongpassword");
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Incorrect password");
+ }
+
+ // Sixth attempt should lock the account
+ await page.fill('input[name="username"]', usernameOrEmail);
+ await page.fill('input[name="password"]', password);
+ await page.click('button[type="submit"]');
+ await expect(page.locator(".error-message")).toContainText("Account locked");
+ });
+
+ */
+});
\ No newline at end of file
diff --git a/tests/register/email.spec.ts b/tests/register/email.spec.ts
new file mode 100644
index 00000000..2d10b655
--- /dev/null
+++ b/tests/register/email.spec.ts
@@ -0,0 +1,158 @@
+import {test, expect} from '@playwright/test';
+const password = "Cgmoreda@1";
+const email = "cgmoredax@gmail.com";
+const codeforcesHandle = "Elglaly";
+const confirmPassword = "Cgmoreda@1";
+const phoneNumber = "+201026386402";
+const username ="Sherif12"
+const successMessage = "Registration successful. Please check your email for verification.";
+import {
+
+ invalidEmail,
+ emailExist,
+ emailRequired,
+ emailTooLong,
+ unsupportedEmailDomain,
+
+} from "@/lib/const/error-messages";
+
+// Email Tests
+test.describe("Register Page Testing - Email Validation", () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto("http://localhost:3001/register");
+ await page.fill('input[name="username"]', username);
+ await page.fill('input[name="cfHandle"]', codeforcesHandle);
+ await page.fill('input[name="phoneNumber"]', phoneNumber);
+ await page.fill('input[name="password"]', password);
+ await page.fill('input[name="confirmPassword"]', confirmPassword);
+ await page.locator('input[type="checkbox"]').check();
+ });
+
+ test("Test Case 8 – Valid Email Format", async ({ page }) => {
+
+ // Fill out the registration form
+ await page.fill('input[name="gmail"]', email);
+ await page.click('button[type="submit"]');
+
+ // Wait for the success message to appear
+ const successMessageElement = await page.waitForSelector(`text=${successMessage}`);
+ const successMessageForm = await successMessageElement.textContent();
+
+ // Assert the success message
+ expect(successMessageForm).toBe(successMessage);
+
+ // Assert the URL after successful registration
+ await page.waitForURL("/profile");
+ expect(page.url()).toContain("/profile");
+ });
+ test("Test Case 9 – Invalid Email Format", async ({ page }) => {
+ const EmailNotValid = "cgmoredax@gmail"; // Invalid email format
+
+ // Fill out the registration form
+ await page.fill('input[name="gmail"]', EmailNotValid);
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${invalidEmail}`);
+ expect(errorMessageElement).not.toBeNull()
+ });
+
+ test("Test Case 10 – Duplicate Email", async ({ page }) => {
+ const duplicateEmail = "cgmoredax@gmail.com"; // Email already exists
+
+ // Fill out the registration form
+ await page.fill('input[name="gmail"]', duplicateEmail);
+ const [response] = await Promise.all([
+ page.waitForResponse(response => response.url().includes("/api/auth/register")),
+ page.click('button[type="submit"]'),
+ ]);
+
+ // Check the API response status
+ expect(response.status()).toBe(400); // Ensure the status code is 400 (Bad Request)
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${emailExist}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(emailExist);
+
+ // Assert that the form data persists (except passwords)
+ const persistedEmail = await page.inputValue('input[name="gmail"]');
+ expect(persistedEmail).toBe(duplicateEmail);
+ });
+
+ test("Test Case 11 – Email with Spaces", async ({ page }) => {
+ const emailWithSpaces = "cgmoredax @gmail.com"; // Email with spaces
+
+ // Fill out the registration form
+ await page.fill('input[name="gmail"]', emailWithSpaces);
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${invalidEmail}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(invalidEmail);
+
+ // Assert that the form data persists (except passwords)
+ const persistedEmail = await page.inputValue('input[name="gmail"]');
+ expect(persistedEmail).toBe(emailWithSpaces);
+ });
+
+ test("Test Case 12 – Empty Email ", async ({ page }) => {
+
+ // Fill out the registration form
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${emailRequired}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(emailRequired);
+
+ // Assert that the form data persists (except passwords)
+ const persistedEmail = await page.inputValue('input[name="gmail"]');
+ expect(persistedEmail).toBe("");
+ });
+
+ test("Test Case 13 – Email too Long", async ({ page }) => {
+ const longEmail = "cgmoredax".padEnd(100, "a")+"@gmail.com"; // Email with spaces
+
+ // Fill out the registration form
+ await page.fill('input[name="gmail"]', longEmail);
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${emailTooLong}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(emailTooLong);
+
+ // Assert that the form data persists (except passwords)
+ const persistedEmail = await page.inputValue('input[name="gmail"]');
+ expect(persistedEmail).toBe(longEmail);
+ });
+
+ test("Test Case 14 – Not Supported Email Domain", async ({ page }) => {
+ const invalidEmail = "cgmoredax@mohamed.com"; // Email with spaces
+
+ // Fill out the registration form
+ await page.fill('input[name="gmail"]', invalidEmail);
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${unsupportedEmailDomain}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(unsupportedEmailDomain);
+
+ // Assert that the form data persists (except passwords)
+ const persistedEmail = await page.inputValue('input[name="gmail"]');
+ expect(persistedEmail).toBe(invalidEmail);
+ });
+});
diff --git a/tests/register/password.spec.ts b/tests/register/password.spec.ts
new file mode 100644
index 00000000..c563a284
--- /dev/null
+++ b/tests/register/password.spec.ts
@@ -0,0 +1,144 @@
+import {test, expect} from '@playwright/test';
+const password = "CgmoDreda@1";
+const email = "cgDmoSredax@gmail.com";
+const codeforcesHandle = "ElSglaly";
+const phoneNumber = "+201028386402";
+const username ="Sherif121"
+import {
+ invalidPassword,
+ passwordRequired,
+ passwordMustMatch,
+ passwordExceedsMaxLength,
+ passwordContainsUsername,
+ passwordContainsEmail,
+ successMessage
+
+} from "@/lib/const/error-messages";
+
+test.describe("Register Page Testing For Password", () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto("http://localhost:3001/register");
+ await page.fill('input[name="username"]', username);
+ await page.fill('input[name="cfHandle"]', codeforcesHandle);
+ await page.fill('input[name="gmail"]', email);
+ await page.fill('input[name="phoneNumber"]', phoneNumber);
+ await page.locator('input[type="checkbox"]').check();
+ });
+
+ test("Test Case 17 – Weak Password – Too Short", async ({ page }) => {
+ const weakPassword = "Co@1";
+ await page.fill('input[name="password"]', weakPassword);
+ await page.fill('input[name="confirmPassword"]', weakPassword);
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${invalidPassword}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+
+ test("Test Case 18 – Password Missing Uppercase", async ({ page }) => {
+ const passwordMissingUppercase = "cgmored@1";
+ await page.fill('input[name="password"]', passwordMissingUppercase);
+ await page.fill('input[name="confirmPassword"]', passwordMissingUppercase);
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${invalidPassword}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+
+ test("Test Case 19 – Password Missing Lowercase", async ({ page }) => {
+ const password = "CGMOREDA@1";
+ await page.fill('input[name="password"]', password);
+ await page.fill('input[name="confirmPassword"]', password);
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${invalidPassword}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+
+ test("Test Case 20 – Password Missing Digits", async ({ page }) => {
+ const password = "Cgmoreda@";
+ await page.fill('input[name="password"]', password);
+ await page.fill('input[name="confirmPassword"]', password);
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${invalidPassword}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+
+ test("Test Case 21 – Password Missing Special Characters", async ({ page }) => {
+ const password = "Cgmoreda1";
+ await page.fill('input[name="password"]', password);
+ await page.fill('input[name="confirmPassword"]', password);
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${invalidPassword}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+
+ test("Test Case 22 – Password Contains Username", async ({ page }) => {
+ const password = "Sherif12";
+ await page.fill('input[name="password"]', password);
+ await page.fill('input[name="confirmPassword"]', password);
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${passwordContainsUsername}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+
+ test("Test Case 23 – Password Contains Email", async ({ page }) => {
+ const password = "cgmoredax@gmail.com";
+ await page.fill('input[name="password"]', password);
+ await page.fill('input[name="confirmPassword"]', password);
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${passwordContainsEmail}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+
+ //TODO:
+ // test("Test Case 24 – Common Password", async ({ page }) => {
+ // const password = "Password123";
+ // await page.fill('input[name="password"]', password);
+ // await page.fill('input[name="confirmPassword"]', password);
+ // awgit statuait page.click('button[type="submit"]');
+ // const errorMessageElement = await page.waitForSelector(`text=${errorMessageForPassword}`);
+ // expect(errorMessageElement).not.toBeNull();
+ // });
+
+ test("Test Case 25 – Password Mismatch", async ({ page }) => {
+ await page.fill('input[name="password"]', password);
+ await page.fill('input[name="confirmPassword"]', password+"ee");
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${passwordMustMatch}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+
+ test("Test Case 26 – Password Empty", async ({ page }) => {
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${passwordRequired}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+ test("Test Case 27 – Password too long", async ({ page }) => {
+ await page.fill('input[name="password"]', "Cgmoreda@1".padEnd(110,"a"));
+ await page.fill('input[name="confirmPassword"]', "Cgmoreda@1".padEnd(110,"a"));
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${passwordExceedsMaxLength}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+
+ test("Test Case 28 – Valid Password", async ({ page }) => {
+
+ const [response] = await Promise.all([
+ page.waitForResponse(response =>
+ response.url().includes("/api/auth/register") &&
+ response.request().method() === "POST"
+ ),
+ // Fill the username and submit the form
+ await page.fill('input[name="password"]', password),
+ await page.fill('input[name="confirmPassword"]', password),
+
+ page.click('button[type="submit"]'),
+ ]);
+
+ // Check the response body
+ const responseBody = await response.json();
+ expect(responseBody.message).toBe(successMessage);
+ const errorMessageElement = await page.waitForSelector(`text=${successMessage}`);
+ expect(errorMessageElement).not.toBeNull();
+ });
+
+});
+
diff --git a/tests/register/phone-cfhandle.spec.ts b/tests/register/phone-cfhandle.spec.ts
new file mode 100644
index 00000000..5bf7ff78
--- /dev/null
+++ b/tests/register/phone-cfhandle.spec.ts
@@ -0,0 +1,175 @@
+import {test, expect} from '@playwright/test';
+const password = "Cgmoreda@1";
+const email = "cgmoredax@gmail.com";
+const codeforcesHandle = "Elglaly";
+const confirmPassword = "Cgmoreda";
+const phoneNumber = "+201026386402";
+const username ="Sherif12"
+const successMessage = "Registration successful. Please check your email for verification.";
+import {
+ invalidCodeforces,
+ invalidPhoneNumber,
+ phoneNumberRequired,
+ phoneNumberExist,
+ codeforcesHandleRequired,
+ codeforcesHandleRequiredExist,
+
+} from "@/lib/const/error-messages";
+
+// Codeforeces Tests
+test.describe("Register Page Testing - Codeforces Handle Validation", () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto("http://localhost:3001/register");
+ await page.fill('input[name="username"]', username);
+ await page.fill('input[name="gmail"]', email);
+ await page.fill('input[name="phoneNumber"]', phoneNumber);
+ await page.fill('input[name="password"]', password);
+ await page.fill('input[name="confirmPassword"]', confirmPassword);
+ });
+
+ test("Test Case 12 – Valid Codeforces Handle", async ({ page }) => {
+
+ // Fill out the registration form
+ await page.fill('input[name="cfHandle"]', codeforcesHandle);
+ await page.click('button[type="submit"]');
+
+ // Wait for the success message to appear
+ const successMessageElement = await page.waitForSelector(`text=${successMessage}`);
+ const successMessageForm = await successMessageElement.textContent();
+
+ // Assert the success message
+ expect(successMessageForm).toBe(successMessage);
+
+ // Assert the URL after successful registration
+ expect(page.url()).toContain("/profile");
+ });
+
+ test("Test Case 13 – Invalid Codeforces Handle", async ({ page }) => {
+ const invalidCodeforcesHandle = "ELglaly@!"; // Invalid handle (contains special character)
+
+ // Fill out the registration form
+ await page.fill('input[name="cfHandle"]', invalidCodeforcesHandle);
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${invalidCodeforces}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(invalidCodeforces);
+
+ // Assert that the form data persists (except passwords)
+ const persistedCodeforcesHandle = await page.inputValue('input[name="cfHandle"]');
+ expect(persistedCodeforcesHandle).toBe(invalidCodeforcesHandle);
+
+ // Assert that the form remains on the registration page
+ expect(page.url()).toContain("/register");
+ });
+
+ test("Test Case 13 – Empty Codeforces Handle", async ({ page }) => {
+
+
+ // Fill out the registration form
+ await page.fill('input[name="cfHandle"]', codeforcesHandle);
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${codeforcesHandleRequiredExist}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(codeforcesHandleRequiredExist);
+
+ // Assert that the form data persists (except passwords)
+ const persistedCodeforcesHandle = await page.inputValue('input[name="cfHandle"]');
+ expect(persistedCodeforcesHandle).toBe(codeforcesHandle);
+
+ // Assert that the form remains on the registration page
+ expect(page.url()).toContain("/register");
+ });
+});
+// PhoneNumber Tests
+test.describe("Register Page Testing For Phone Number", () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto("http://localhost:3001/register");
+ await page.fill('input[name="username"]', username);
+ await page.fill('input[name="gmail"]', email);
+ await page.fill('input[name="cfHandle"]', codeforcesHandle);
+ await page.fill('input[name="password"]', password);
+ await page.fill('input[name="confirmPassword"]', confirmPassword);
+ await page.locator('input[name="termsAndConditions"]').check();
+ });
+
+ test("Test Case 14 – Valid Phone Number", async ({ page }) => {
+ const validPhoneNumber = "1234567890"; // Valid phone number
+
+ // Fill out the registration form
+ await page.fill('input[name="phoneNumber"]', validPhoneNumber);
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${invalidPhoneNumber}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(invalidPhoneNumber);
+ expect(page.url()).toContain("/profile");
+
+ });
+
+ test("Test Case 15 – Short Phone Number", async ({ page }) => {
+ const shortPhoneNumber = "123456"; // Too short (less than 10 digits)
+
+ // Fill out the registration form
+ await page.fill('input[name="phoneNumber"]', shortPhoneNumber);
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${invalidPhoneNumber}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(invalidPhoneNumber);
+ const persistedPhone = await page.inputValue('input[name="phoneNumber"]');
+ expect(persistedPhone).toBe(shortPhoneNumber);
+ // Assert that the form remains on the registration page
+ expect(page.url()).toContain("/register");
+ });
+
+ test("Test Case 16 – Empty Phone Number", async ({ page }) => {
+ // Contains non-numeric characters
+
+ await page.fill('input[name="phoneNumber"]', "");
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${phoneNumberRequired}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(phoneNumberRequired);
+ const persistedPhone = await page.inputValue('input[name="phoneNumber"]');
+ expect(persistedPhone).toBe("");
+ // Assert that the form remains on the registration page
+ expect(page.url()).toContain("/register");
+ });
+
+ test("Test Case 14 – Exist Phone Number", async ({ page }) => {
+
+ // Fill out the registration form
+ await page.fill('input[name="phoneNumber"]', phoneNumber);
+ await page.click('button[type="submit"]');
+
+ // Wait for the error message to appear
+ const errorMessageElement = await page.waitForSelector(`text=${phoneNumberExist}`);
+ const errorMessage = await errorMessageElement.textContent();
+
+ // Assert the error message
+ expect(errorMessage).toBe(phoneNumberExist);
+ const persistedPhone = await page.inputValue('input[name="phoneNumber"]');
+ expect(persistedPhone).toBe(phoneNumber);
+ expect(page.url()).toContain("/profile");
+
+ });
+
+});
diff --git a/tests/register/username.spec.ts b/tests/register/username.spec.ts
new file mode 100644
index 00000000..6244046b
--- /dev/null
+++ b/tests/register/username.spec.ts
@@ -0,0 +1,143 @@
+import {test, expect} from '@playwright/test';
+const password = "Cgmoreda@1";
+const email = "cgmoredax@gmail.com";
+const codeforcesHandle = "Elglaly";
+const confirmPassword = "Cgmoreda@1";
+const phoneNumber = "+201026386402";
+const username ="Sherif12"
+import {
+ userExist,
+ usernameRequired,
+ usernameInvalidFormat,
+ usernameTooShort,
+ usernameTooLong,
+ successMessage
+ //TODO
+ //usernameContainsBannedWords,
+} from "@/lib/const/error-messages";
+
+//Username Tests
+test.describe("Register Page Testing For Username", () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto("http://localhost:3001/register");
+ await page.fill('input[name="gmail"]', email);
+ await page.fill('input[name="cfHandle"]', codeforcesHandle);
+ await page.fill('input[name="phoneNumber"]', phoneNumber);
+ await page.fill('input[name="password"]', password);
+ await page.fill('input[name="confirmPassword"]', confirmPassword);
+ await page.locator('input[type="checkbox"]').check();
+ });
+
+ test("Test Case 1 – Username Exists", async ({ page }) => {
+
+ await page.fill('input[name="username"]', username);
+ const [response] = await Promise.all([
+ page.waitForResponse(response => response.url().includes("/api/auth/register")),
+ page.click('button[type="submit"]'),
+ ]);
+
+ // Check the API response status
+ expect(response.status()).toBe(400); // Ensure the status code is 400 (Bad Request)
+
+ const successMessageElement = await page.waitForSelector(`text=${userExist}`, { state: "visible" });
+ expect(successMessageElement).not.toBeNull();
+ });
+
+ test("Test Case 2 – Shortest Username Registration", async ({ page }) => {
+ const shortestUsername = "Sh";
+ await page.fill('input[name="username"]', shortestUsername);
+ await page.click('button[type="submit"]');
+
+ const errorMessageElement = await page.waitForSelector(`text=${usernameTooShort}`);
+ expect(errorMessageElement).not.toBeNull();
+
+ const persistedEmail = await page.inputValue('input[name="username"]');
+ expect(persistedEmail).toBe(shortestUsername);
+ expect(page.url()).toContain("/register");
+ });
+
+ //TODO : Bad word check
+
+ // test("Test Case 2 – Shortest Username Registration", async ({ page }) => {
+ // const shortestUsername = "fuckbitches";
+ // await page.fill('input[name="username"]', shortestUsername);
+ // await page.click('button[type="submit"]');
+ // const errorMessageElement = await page.waitForSelector(`text=${invalidUsername}`);
+ // const errorMessage = await errorMessageElement.textContent();
+ // expect(errorMessage).toBe(invalidUsername);
+ //
+ // const persistedEmail = await page.inputValue('input[name="username"]');
+ // expect(persistedEmail).toBe(shortestUsername);
+ // expect(page.url()).toContain("/register");
+ // });
+
+ test("Test Case 3 – Longest Username Registration", async ({ page }) => {
+ const longestUsername = "Sherif"+"A".padEnd(20, "A");
+ await page.fill('input[name="username"]', longestUsername);
+ await page.click('button[type="submit"]');
+
+ const errorMessageElement = await page.waitForSelector(`text=${usernameTooLong}`);
+ expect(errorMessageElement).not.toBeNull();
+ const persistedEmail = await page.inputValue('input[name="username"]');
+ expect(persistedEmail).toBe(longestUsername);
+ expect(page.url()).toContain("/register");
+ });
+
+ test("Test Case 4 – Username with Spaces", async ({ page }) => {
+ // TODO : check that the username is trimmed in Database
+ const usernameWithSpaces = " Sherif12 ";
+ await page.fill('input[name="username"]', usernameWithSpaces);
+ await page.click('button[type="submit"]');
+
+ const errorMessageElement = await page.waitForSelector(`text=${successMessage}`);
+ expect(errorMessageElement).not.toBeNull();
+ expect(page.url()).toContain("/register");
+ });
+
+ test("Test Case 5 – Username with Special Characters", async ({ page }) => {
+ const usernameWithSpecialChars = "Sherif_12!@";
+ await page.fill('input[name="username"]', usernameWithSpecialChars);
+ await page.click('button[type="submit"]');
+
+ const errorMessageElement = await page.waitForSelector(`text=${usernameInvalidFormat}`);
+ expect(errorMessageElement).not.toBeNull();
+ const persistedEmail = await page.inputValue('input[name="username"]');
+ expect(persistedEmail).toBe(usernameWithSpecialChars);
+ expect(page.url()).toContain("/register");
+ });
+
+ test("Test Case 6 – Mixed Case Username", async ({ page }) => {
+ const mixedCaseUsername = "ShErIf12";
+ await page.fill('input[name="username"]', mixedCaseUsername);
+ await page.click('button[type="submit"]');
+ const errorMessageElement = await page.waitForSelector(`text=${successMessage}`);
+ expect(errorMessageElement).not.toBeNull();
+ expect(page.url()).toContain("/profile");
+ });
+
+ test("Test Case 7 – Valid Username", async ({ page }) => {
+ await page.fill('input[name="username"]', username);
+ const [response] = await Promise.all([
+ page.waitForResponse(response => response.url().includes("/api/auth/register")),
+ page.click('button[type="submit"]'),
+ ]);
+ expect(response.status()).toBe(200)
+
+ const errorMessageElement = await page.waitForSelector(`text=${userExist}`);
+ expect(errorMessageElement).not.toBeNull();
+ const persistedEmail = await page.inputValue('input[name="username"]');
+ expect(persistedEmail).toBe(username);
+ expect(page.url()).toContain("/register");
+ });
+ test("Test Case 8 – Empty Username", async ({ page }) => {
+
+ page.click('button[type="submit"]')
+ const errorMessageElement = await page.waitForSelector(`text=${usernameRequired}`);
+ expect(errorMessageElement).not.toBeNull();
+ const persistedEmail = await page.inputValue('input[name="username"]');
+ expect(persistedEmail).toBe('');
+ expect(page.url()).toContain("/register");
+ });
+
+
+});
\ No newline at end of file
diff --git a/todo.md b/todo.md
index 35b4fea6..d7aa17ab 100644
--- a/todo.md
+++ b/todo.md
@@ -1,5 +1 @@
- [ ] zod social validation
-
-
-
-
diff --git a/tsconfig.json b/tsconfig.json
index 07fd58ea..7b05b57a 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "ES2017",
+ "target": "ES2020",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,