├── .gitignore
├── ui
└── freight
│ ├── src
│ ├── vite-env.d.ts
│ ├── main.tsx
│ ├── App.css
│ ├── index.css
│ ├── App.tsx
│ └── assets
│ │ └── react.svg
│ ├── tsconfig.json
│ ├── vite.config.ts
│ ├── .gitignore
│ ├── index.html
│ ├── tsconfig.node.json
│ ├── tsconfig.app.json
│ ├── package.json
│ ├── eslint.config.js
│ ├── public
│ └── vite.svg
│ ├── README.md
│ └── package-lock.json
├── internal
├── models
│ ├── output.go
│ ├── check.go
│ └── submission.go
├── handlers
│ ├── home.go
│ ├── submission.go
│ ├── check.go
│ └── output.go
├── middlewares
│ ├── logger.go
│ └── cors.go
├── db
│ └── db.go
├── jobs
│ ├── submission.go
│ └── process.go
└── orchestrator
│ └── orchestrator.go
├── Dockerfile.service
├── Dockerfile.backend
├── cmd
├── service
│ └── main.go
└── backend
│ └── main.go
├── README.md
├── .github
└── workflows
│ └── build_and_push.yml
├── go.mod
├── install.yml
└── go.sum
/.gitignore:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui/freight/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/internal/models/output.go:
--------------------------------------------------------------------------------
1 | package models
2 |
3 | type OutputRequest struct {
4 | JobID string `json:"job_id"`
5 | Output string `json:"output"`
6 | }
7 |
--------------------------------------------------------------------------------
/ui/freight/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | { "path": "./tsconfig.app.json" },
5 | { "path": "./tsconfig.node.json" }
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/internal/models/check.go:
--------------------------------------------------------------------------------
1 | package models
2 |
3 | type CheckRequest struct {
4 | JobID string `json:"job_id"`
5 | }
6 |
7 | type CheckResponse struct {
8 | State string `json:"state"`
9 | Output string `json:"output"`
10 | }
11 |
--------------------------------------------------------------------------------
/ui/freight/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vite.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | server: {
8 | port: 3000
9 | }
10 | })
11 |
--------------------------------------------------------------------------------
/ui/freight/src/main.tsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react'
2 | import { createRoot } from 'react-dom/client'
3 | import './index.css'
4 | import App from './App.tsx'
5 |
6 | createRoot(document.getElementById('root')!).render(
7 |
8 |
9 | ,
10 | )
11 |
--------------------------------------------------------------------------------
/internal/models/submission.go:
--------------------------------------------------------------------------------
1 | package models
2 |
3 | type SubmissionRequest struct {
4 | Code string `json:"code"`
5 | Language string `json:"lang"`
6 | JobID string `json:"job_id"`
7 | }
8 |
9 | type SubmissionResponse struct {
10 | JobID string `json:"job_id"`
11 | Output string `json:"output"`
12 | }
13 |
--------------------------------------------------------------------------------
/Dockerfile.service:
--------------------------------------------------------------------------------
1 | # stage 1
2 | FROM golang:1.22 AS builder
3 |
4 | WORKDIR /app
5 |
6 | COPY . .
7 |
8 | RUN go mod download
9 |
10 |
11 | RUN CGO_ENABLED=0 go build cmd/service/main.go
12 |
13 |
14 | # stage 2
15 | FROM gcr.io/distroless/static:nonroot
16 |
17 | WORKDIR /
18 |
19 | COPY --from=builder /app/main .
20 |
21 | USER 65532:65532
22 |
23 | ENTRYPOINT ["/main"]
--------------------------------------------------------------------------------
/ui/freight/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/Dockerfile.backend:
--------------------------------------------------------------------------------
1 | # stage 1
2 | FROM golang:1.22 AS builder
3 |
4 | WORKDIR /app
5 |
6 | COPY . .
7 |
8 | RUN go mod download
9 |
10 |
11 | RUN CGO_ENABLED=0 go build cmd/backend/main.go
12 |
13 |
14 | # stage 2
15 | FROM gcr.io/distroless/static:nonroot
16 |
17 | WORKDIR /
18 |
19 | COPY --from=builder /app/main .
20 |
21 | USER 65532:65532
22 |
23 | EXPOSE 8080
24 |
25 | ENTRYPOINT ["/main"]
--------------------------------------------------------------------------------
/ui/freight/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | brrrr
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/internal/handlers/home.go:
--------------------------------------------------------------------------------
1 | package handlers
2 |
3 | import (
4 | "encoding/json"
5 | "net/http"
6 | )
7 |
8 | func HomeHandler(w http.ResponseWriter, r *http.Request) {
9 | resp := map[string]string{"msg": "Hello from freight!"}
10 |
11 | w.Header().Set("Content-Type", "application/json")
12 | w.WriteHeader(http.StatusOK)
13 |
14 | jsonEncoder := json.NewEncoder(w)
15 |
16 | err := jsonEncoder.Encode(resp)
17 |
18 | if err != nil {
19 | http.Error(w, err.Error(), http.StatusInternalServerError)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/internal/middlewares/logger.go:
--------------------------------------------------------------------------------
1 | package middlewares
2 |
3 | import (
4 | "log"
5 | "net/http"
6 | "time"
7 | )
8 |
9 | // Logger middleware
10 | type Logger struct {
11 | handler http.Handler
12 | }
13 |
14 | func (l *Logger) ServeHTTP(w http.ResponseWriter, r *http.Request) {
15 | startTime := time.Now()
16 | l.handler.ServeHTTP(w, r)
17 | log.Printf("%s %s %s", r.Method, r.URL.Path, time.Since(startTime).String())
18 | }
19 |
20 | func NewLogger(handler http.Handler) *Logger {
21 | return &Logger{handler: handler}
22 | }
23 |
--------------------------------------------------------------------------------
/ui/freight/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4 | "target": "ES2022",
5 | "lib": ["ES2023"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "Bundler",
11 | "allowImportingTsExtensions": true,
12 | "isolatedModules": true,
13 | "moduleDetection": "force",
14 | "noEmit": true,
15 |
16 | /* Linting */
17 | "strict": true,
18 | "noUnusedLocals": true,
19 | "noUnusedParameters": true,
20 | "noFallthroughCasesInSwitch": true,
21 | "noUncheckedSideEffectImports": true
22 | },
23 | "include": ["vite.config.ts"]
24 | }
25 |
--------------------------------------------------------------------------------
/cmd/service/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "log"
5 | "time"
6 |
7 | "github.com/0jk6/freight/internal/db"
8 | "github.com/0jk6/freight/internal/jobs"
9 | "github.com/0jk6/freight/internal/orchestrator"
10 | )
11 |
12 | //this is another microservice that will run the jobs on kubernetes
13 |
14 | func main() {
15 | //start processing the jobs in the queue
16 | log.Println("Starting job processor")
17 |
18 | db.SetupConnectionPool()
19 |
20 | namespace := "freight-ns"
21 |
22 | //check pod logs every 10 seconds
23 | go func() {
24 | for {
25 | orchestrator.ListJobs(namespace)
26 | time.Sleep(5 * time.Second)
27 | }
28 | }()
29 |
30 | jobs.ProcessSubmissions()
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Freight
2 |
3 | Allows you to run code on Kubernetes using k8s jobs, just like leetcode, codeforces and other online judges
4 |
5 |
6 | Build docker images for the backend, service and the ui and push them to the dockerhub
7 |
8 | - `docker build -t YOUR-DOCKERHUB-USERNAME/freight-backend:0.0.1 -f Dockerfile.backend .`
9 | - `docker build -t YOUR-DOCKERHUB-USERNAME/freight-service:0.0.1 -f Dockerfile.service .`
10 |
11 | - `docker push YOUR-DOCKERHUB-USERNAME/freight-backend:0.0.1`
12 | - `docker push YOUR-DOCKERHUB-USERNAME/freight-service:0.0.1`
13 |
14 | Make sure that you edit the images in the install.yml file to match the above pushed images.
15 |
16 | - `kubectl apply -f install.yml`
17 |
18 | To run the UI
19 |
20 | - `cd ui/freight`
21 | - `npm run dev`
--------------------------------------------------------------------------------
/internal/middlewares/cors.go:
--------------------------------------------------------------------------------
1 | package middlewares
2 |
3 | import (
4 | "net/http"
5 | )
6 |
7 | // Logger middleware
8 | type Cors struct {
9 | handler http.Handler
10 | }
11 |
12 | func (c *Cors) ServeHTTP(w http.ResponseWriter, r *http.Request) {
13 | // Add CORS headers
14 | w.Header().Set("Access-Control-Allow-Origin", "*")
15 | w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
16 | w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
17 |
18 | // Handle preflight request
19 | if r.Method == "OPTIONS" {
20 | w.WriteHeader(http.StatusOK)
21 | return
22 | }
23 |
24 | // Handle actual request
25 | c.handler.ServeHTTP(w, r)
26 | }
27 |
28 | func NewCors(handler http.Handler) *Cors {
29 | return &Cors{handler: handler}
30 | }
31 |
--------------------------------------------------------------------------------
/ui/freight/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4 | "target": "ES2020",
5 | "useDefineForClassFields": true,
6 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 | "module": "ESNext",
8 | "skipLibCheck": true,
9 |
10 | /* Bundler mode */
11 | "moduleResolution": "Bundler",
12 | "allowImportingTsExtensions": true,
13 | "isolatedModules": true,
14 | "moduleDetection": "force",
15 | "noEmit": true,
16 | "jsx": "react-jsx",
17 |
18 | /* Linting */
19 | "strict": true,
20 | "noUnusedLocals": true,
21 | "noUnusedParameters": true,
22 | "noFallthroughCasesInSwitch": true,
23 | "noUncheckedSideEffectImports": true
24 | },
25 | "include": ["src"]
26 | }
27 |
--------------------------------------------------------------------------------
/ui/freight/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "freight",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc -b && vite build",
9 | "lint": "eslint .",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "react": "^18.3.1",
14 | "react-dom": "^18.3.1"
15 | },
16 | "devDependencies": {
17 | "@eslint/js": "^9.13.0",
18 | "@types/react": "^18.3.12",
19 | "@types/react-dom": "^18.3.1",
20 | "@vitejs/plugin-react": "^4.3.3",
21 | "eslint": "^9.13.0",
22 | "eslint-plugin-react-hooks": "^5.0.0",
23 | "eslint-plugin-react-refresh": "^0.4.14",
24 | "globals": "^15.11.0",
25 | "typescript": "~5.6.2",
26 | "typescript-eslint": "^8.11.0",
27 | "vite": "^5.4.10"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/cmd/backend/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "log"
5 | "net/http"
6 |
7 | "github.com/0jk6/freight/internal/db"
8 | "github.com/0jk6/freight/internal/handlers"
9 | "github.com/0jk6/freight/internal/middlewares"
10 | )
11 |
12 | func main() {
13 | mux := http.NewServeMux()
14 |
15 | mux.HandleFunc("GET /", handlers.HomeHandler)
16 | mux.HandleFunc("POST /submission", handlers.SubmissionHandler)
17 | mux.HandleFunc("POST /output", handlers.OutputHandler)
18 | mux.HandleFunc("GET /check", handlers.CheckHandler)
19 | wrappedMux := middlewares.NewLogger(middlewares.NewCors(mux))
20 |
21 | //setup the database connection pool
22 | log.Println("Setting up database connection pool")
23 | db.SetupConnectionPool()
24 |
25 | log.Println("Listening on port 8080")
26 | log.Fatal(http.ListenAndServe(":8080", wrappedMux))
27 | }
28 |
--------------------------------------------------------------------------------
/ui/freight/eslint.config.js:
--------------------------------------------------------------------------------
1 | import js from '@eslint/js'
2 | import globals from 'globals'
3 | import reactHooks from 'eslint-plugin-react-hooks'
4 | import reactRefresh from 'eslint-plugin-react-refresh'
5 | import tseslint from 'typescript-eslint'
6 |
7 | export default tseslint.config(
8 | { ignores: ['dist'] },
9 | {
10 | extends: [js.configs.recommended, ...tseslint.configs.recommended],
11 | files: ['**/*.{ts,tsx}'],
12 | languageOptions: {
13 | ecmaVersion: 2020,
14 | globals: globals.browser,
15 | },
16 | plugins: {
17 | 'react-hooks': reactHooks,
18 | 'react-refresh': reactRefresh,
19 | },
20 | rules: {
21 | ...reactHooks.configs.recommended.rules,
22 | 'react-refresh/only-export-components': [
23 | 'warn',
24 | { allowConstantExport: true },
25 | ],
26 | },
27 | },
28 | )
29 |
--------------------------------------------------------------------------------
/.github/workflows/build_and_push.yml:
--------------------------------------------------------------------------------
1 | name: Build and Push Docker Images
2 |
3 | # on:
4 | # push:
5 | # branches:
6 | # - main # or any branch you want to trigger the action
7 |
8 | on:
9 | workflow_dispatch:
10 |
11 | jobs:
12 | build-and-push:
13 | runs-on: ubuntu-latest
14 |
15 | steps:
16 | - name: Checkout repository
17 | uses: actions/checkout@v3
18 |
19 | - name: Set up Docker Buildx
20 | uses: docker/setup-buildx-action@v2
21 |
22 | - name: Log in to Docker Hub
23 | uses: docker/login-action@v2
24 | with:
25 | username: ${{ secrets.DOCKER_USERNAME }}
26 | password: ${{ secrets.DOCKER_PASSWORD }}
27 |
28 | - name: Build and push freight-backend image
29 | run: |
30 | docker build -t 0jk6/freight-backend:0.0.2 -f Dockerfile.backend .
31 | docker push 0jk6/freight-backend:0.0.2
32 |
33 | - name: Build and push freight-service image
34 | run: |
35 | docker build -t 0jk6/freight-service:0.0.2 -f Dockerfile.service .
36 | docker push 0jk6/freight-service:0.0.2
37 |
--------------------------------------------------------------------------------
/internal/handlers/submission.go:
--------------------------------------------------------------------------------
1 | package handlers
2 |
3 | import (
4 | "encoding/json"
5 | "net/http"
6 |
7 | "github.com/0jk6/freight/internal/jobs"
8 | "github.com/0jk6/freight/internal/models"
9 | )
10 |
11 | // submission handler
12 | // users submit the code, language
13 | // this will push those to the queue
14 | func SubmissionHandler(w http.ResponseWriter, r *http.Request) {
15 | resp := map[string]string{}
16 | w.Header().Set("Content-Type", "application/json")
17 | w.WriteHeader(http.StatusOK)
18 |
19 | //pull data from request body
20 | defer r.Body.Close()
21 | submissionRequest := models.SubmissionRequest{}
22 |
23 | decoder := json.NewDecoder(r.Body)
24 | err := decoder.Decode(&submissionRequest)
25 |
26 | if err != nil {
27 | http.Error(w, err.Error(), http.StatusBadRequest)
28 | return
29 | }
30 |
31 | //we got the request, now push it to the queue
32 | //we will return the job_id to the user
33 | resp["job_id"] = jobs.Push(submissionRequest)
34 |
35 | jsonEncoder := json.NewEncoder(w)
36 | err = jsonEncoder.Encode(resp)
37 |
38 | if err != nil {
39 | http.Error(w, err.Error(), http.StatusInternalServerError)
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/internal/handlers/check.go:
--------------------------------------------------------------------------------
1 | package handlers
2 |
3 | import (
4 | "context"
5 | "encoding/json"
6 | "net/http"
7 |
8 | "github.com/0jk6/freight/internal/db"
9 | "github.com/0jk6/freight/internal/models"
10 | )
11 |
12 | func CheckHandler(w http.ResponseWriter, r *http.Request) {
13 | w.Header().Set("Content-Type", "application/json")
14 | w.WriteHeader(http.StatusOK)
15 |
16 | //pull data from request body
17 | jobID := r.URL.Query().Get("job_id")
18 | if jobID == "" {
19 | http.Error(w, "job_id is required", http.StatusBadRequest)
20 | return
21 | }
22 |
23 | //we got the output request, push this output into the database
24 | pool := db.GetConnectionPool()
25 | row := pool.QueryRow(context.Background(), "SELECT output FROM submissions WHERE job_id = $1", jobID)
26 | var output string
27 | row.Scan(&output)
28 |
29 | checkResponse := models.CheckResponse{}
30 |
31 | checkResponse.Output = output
32 | if output == "" {
33 | checkResponse.State = "PENDING"
34 | } else {
35 | checkResponse.State = "SUCCESS"
36 | }
37 |
38 | jsonEncoder := json.NewEncoder(w)
39 | err := jsonEncoder.Encode(checkResponse)
40 |
41 | if err != nil {
42 | http.Error(w, err.Error(), http.StatusInternalServerError)
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/internal/handlers/output.go:
--------------------------------------------------------------------------------
1 | package handlers
2 |
3 | import (
4 | "context"
5 | "encoding/json"
6 | "net/http"
7 |
8 | "github.com/0jk6/freight/internal/db"
9 | "github.com/0jk6/freight/internal/models"
10 | )
11 |
12 | // container will post to this
13 | func OutputHandler(w http.ResponseWriter, r *http.Request) {
14 | resp := map[string]string{}
15 | w.Header().Set("Content-Type", "application/json")
16 | w.WriteHeader(http.StatusOK)
17 |
18 | //pull data from request body
19 | defer r.Body.Close()
20 | outputRequest := models.OutputRequest{}
21 |
22 | decoder := json.NewDecoder(r.Body)
23 | err := decoder.Decode(&outputRequest)
24 |
25 | if err != nil {
26 | http.Error(w, err.Error(), http.StatusBadRequest)
27 | return
28 | }
29 |
30 | //we got the output request, push this output into the database
31 | pool := db.GetConnectionPool()
32 | _, err = pool.Exec(context.Background(), "UPDATE submissions SET output = $1 WHERE job_id = $2", outputRequest.Output, outputRequest.JobID)
33 |
34 | if err != nil {
35 | http.Error(w, err.Error(), http.StatusInternalServerError)
36 | }
37 |
38 | jsonEncoder := json.NewEncoder(w)
39 | resp["msg"] = "success"
40 | err = jsonEncoder.Encode(resp)
41 |
42 | if err != nil {
43 | http.Error(w, err.Error(), http.StatusInternalServerError)
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/ui/freight/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ui/freight/src/App.css:
--------------------------------------------------------------------------------
1 | /* Ensure the body takes the full viewport height and removes margins */
2 | body, html, #root {
3 | margin: 0;
4 | padding: 0;
5 | height: 100%;
6 | display: flex;
7 | align-items: center;
8 | justify-content: center;
9 | }
10 |
11 | /* Card container centered within the screen */
12 | .card {
13 | display: flex;
14 | flex-direction: column;
15 | align-items: center;
16 | width: 100vw;
17 | height: 100vh;
18 | padding: 20px;
19 | box-sizing: border-box;
20 | }
21 |
22 | /* Input container with full height and flex layout */
23 | .input-container {
24 | display: flex;
25 | width: 100%;
26 | height: 50vh;
27 | }
28 |
29 | /* Styles for the main input */
30 | .main-input {
31 | width: 1200px;
32 | height: 100%;
33 | padding: 10px;
34 | font-size: 16px;
35 | border: 1px solid #ccc;
36 | }
37 |
38 | /* Styles for the side input */
39 | .side-input {
40 | width: 30%;
41 | height: 100%;
42 | padding: 10px;
43 | font-size: 16px;
44 | border: 1px solid #ccc;
45 | margin-left: 10px;
46 | }
47 |
48 | /* Rotation animation */
49 | @keyframes rotate360 {
50 | from {
51 | transform: rotate(0deg);
52 | }
53 | to {
54 | transform: rotate(360deg);
55 | }
56 | }
57 |
58 | /* Apply animation to the submit button */
59 | .rotate-button {
60 | margin-top: 20px;
61 | padding: 10px 20px;
62 | font-size: 16px;
63 | cursor: pointer;
64 | animation: rotate360 1s linear infinite; /* Rotate 360 degrees every 2 seconds */
65 | }
--------------------------------------------------------------------------------
/internal/db/db.go:
--------------------------------------------------------------------------------
1 | package db
2 |
3 | import (
4 | "context"
5 | "fmt"
6 | "log"
7 | "os"
8 | "sync"
9 |
10 | "github.com/jackc/pgx/v5/pgxpool"
11 | )
12 |
13 | var (
14 | pool *pgxpool.Pool
15 | once sync.Once
16 | )
17 |
18 | func SetupConnectionPool() {
19 | var err error
20 |
21 | postgresHost := os.Getenv("POSTGRES_HOST")
22 |
23 | if postgresHost == "" {
24 | postgresHost = "localhost" // Fallback to localhost if the environment variable is not set
25 | }
26 |
27 | log.Printf("POSTGRES HOST: %s", postgresHost)
28 |
29 | user := "postgres" // your database user
30 | password := "password" // your database password
31 | dbname := "freight" // your database name
32 | port := "5432" // your database port
33 |
34 | connStr := fmt.Sprintf("postgres://%s:%s@%s:%s/%s", user, password, postgresHost, port, dbname)
35 |
36 | once.Do(func() {
37 | pool, err = pgxpool.New(context.Background(), connStr)
38 |
39 | if err != nil {
40 | log.Fatal(err)
41 | }
42 |
43 | err = pool.Ping(context.Background())
44 | if err != nil {
45 | log.Fatal(err)
46 | }
47 |
48 | // Setup the primary table
49 | createTableQuery := `
50 | CREATE TABLE IF NOT EXISTS submissions (
51 | id SERIAL PRIMARY KEY,
52 | language VARCHAR(50) NOT NULL,
53 | code TEXT NOT NULL,
54 | job_id UUID NOT NULL,
55 | output TEXT
56 | );
57 | `
58 |
59 | log.Println("Setting up the database table")
60 | _, err = pool.Exec(context.Background(), createTableQuery)
61 |
62 | if err != nil {
63 | log.Fatal(err)
64 | }
65 | })
66 | }
67 |
68 | func GetConnectionPool() *pgxpool.Pool {
69 | return pool
70 | }
71 |
--------------------------------------------------------------------------------
/ui/freight/README.md:
--------------------------------------------------------------------------------
1 | # React + TypeScript + Vite
2 |
3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4 |
5 | Currently, two official plugins are available:
6 |
7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9 |
10 | ## Expanding the ESLint configuration
11 |
12 | If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:
13 |
14 | - Configure the top-level `parserOptions` property like this:
15 |
16 | ```js
17 | export default tseslint.config({
18 | languageOptions: {
19 | // other options...
20 | parserOptions: {
21 | project: ['./tsconfig.node.json', './tsconfig.app.json'],
22 | tsconfigRootDir: import.meta.dirname,
23 | },
24 | },
25 | })
26 | ```
27 |
28 | - Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked`
29 | - Optionally add `...tseslint.configs.stylisticTypeChecked`
30 | - Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config:
31 |
32 | ```js
33 | // eslint.config.js
34 | import react from 'eslint-plugin-react'
35 |
36 | export default tseslint.config({
37 | // Set the react version
38 | settings: { react: { version: '18.3' } },
39 | plugins: {
40 | // Add the react plugin
41 | react,
42 | },
43 | rules: {
44 | // other rules...
45 | // Enable its recommended rules
46 | ...react.configs.recommended.rules,
47 | ...react.configs['jsx-runtime'].rules,
48 | },
49 | })
50 | ```
51 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/0jk6/freight
2 |
3 | go 1.22.0
4 |
5 | toolchain go1.22.5
6 |
7 | require (
8 | github.com/google/uuid v1.6.0
9 | github.com/jackc/pgx/v5 v5.6.0
10 | github.com/rabbitmq/amqp091-go v1.10.0
11 | k8s.io/api v0.30.3
12 | k8s.io/apimachinery v0.30.3
13 | k8s.io/client-go v0.30.3
14 | )
15 |
16 | require (
17 | github.com/davecgh/go-spew v1.1.1 // indirect
18 | github.com/emicklei/go-restful/v3 v3.11.0 // indirect
19 | github.com/go-logr/logr v1.4.1 // indirect
20 | github.com/go-openapi/jsonpointer v0.19.6 // indirect
21 | github.com/go-openapi/jsonreference v0.20.2 // indirect
22 | github.com/go-openapi/swag v0.22.3 // indirect
23 | github.com/gogo/protobuf v1.3.2 // indirect
24 | github.com/golang/protobuf v1.5.4 // indirect
25 | github.com/google/gnostic-models v0.6.8 // indirect
26 | github.com/google/gofuzz v1.2.0 // indirect
27 | github.com/imdario/mergo v0.3.6 // indirect
28 | github.com/jackc/pgpassfile v1.0.0 // indirect
29 | github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
30 | github.com/jackc/puddle/v2 v2.2.1 // indirect
31 | github.com/josharian/intern v1.0.0 // indirect
32 | github.com/json-iterator/go v1.1.12 // indirect
33 | github.com/mailru/easyjson v0.7.7 // indirect
34 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
35 | github.com/modern-go/reflect2 v1.0.2 // indirect
36 | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
37 | github.com/spf13/pflag v1.0.5 // indirect
38 | golang.org/x/crypto v0.21.0 // indirect
39 | golang.org/x/net v0.23.0 // indirect
40 | golang.org/x/oauth2 v0.10.0 // indirect
41 | golang.org/x/sync v0.1.0 // indirect
42 | golang.org/x/sys v0.18.0 // indirect
43 | golang.org/x/term v0.18.0 // indirect
44 | golang.org/x/text v0.14.0 // indirect
45 | golang.org/x/time v0.3.0 // indirect
46 | google.golang.org/appengine v1.6.7 // indirect
47 | google.golang.org/protobuf v1.33.0 // indirect
48 | gopkg.in/inf.v0 v0.9.1 // indirect
49 | gopkg.in/yaml.v2 v2.4.0 // indirect
50 | gopkg.in/yaml.v3 v3.0.1 // indirect
51 | k8s.io/klog/v2 v2.120.1 // indirect
52 | k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
53 | k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
54 | sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
55 | sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
56 | sigs.k8s.io/yaml v1.3.0 // indirect
57 | )
58 |
--------------------------------------------------------------------------------
/internal/jobs/submission.go:
--------------------------------------------------------------------------------
1 | package jobs
2 |
3 | import (
4 | "context"
5 | "encoding/json"
6 | "fmt"
7 | "log"
8 | "os"
9 | "time"
10 |
11 | "github.com/0jk6/freight/internal/db"
12 | "github.com/0jk6/freight/internal/models"
13 | "github.com/google/uuid"
14 | amqp "github.com/rabbitmq/amqp091-go"
15 | )
16 |
17 | // submit a job and store it in a queue and return the job id
18 | func Push(submission models.SubmissionRequest) string {
19 | //connect to rabbitmq and push the submission to the queue
20 | rabbitHost := os.Getenv("RABBITMQ_HOST")
21 |
22 | if rabbitHost == "" {
23 | rabbitHost = "localhost" // Fallback to localhost if the environment variable is not set
24 | }
25 |
26 | rabbitUser := "guest"
27 | rabbitPassword := "guest"
28 | rabbitPort := "5672"
29 |
30 | rabbitConnStr := fmt.Sprintf("amqp://%s:%s@%s:%s/", rabbitUser, rabbitPassword, rabbitHost, rabbitPort)
31 |
32 | conn, err := amqp.Dial(rabbitConnStr)
33 | if err != nil {
34 | log.Fatal(err)
35 | }
36 |
37 | defer conn.Close()
38 |
39 | ch, err := conn.Channel()
40 | if err != nil {
41 | log.Println("Error while creating channel.")
42 | return ""
43 | }
44 | defer ch.Close()
45 |
46 | //publish the submission to the queue
47 | q, err := ch.QueueDeclare("jobs_queue", true, false, false, false, nil)
48 | if err != nil {
49 | log.Println("Error while declaring queue.")
50 | log.Println(err)
51 | return ""
52 | }
53 |
54 | ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
55 | defer cancel()
56 |
57 | //generate a unique id for the job
58 | submission.JobID = generateUUID()
59 |
60 | msg, err := json.Marshal(submission)
61 | if err != nil {
62 | log.Println("Cannot encode message")
63 | return ""
64 | }
65 |
66 | err = ch.PublishWithContext(ctx, "", q.Name, false, false, amqp.Publishing{ContentType: "text/plain", Body: msg})
67 |
68 | if err != nil {
69 | log.Println("Error while publishing message.")
70 | return ""
71 | }
72 |
73 | //store it in the db
74 | err = storeJob(submission)
75 | if err != nil {
76 | log.Println(err)
77 | return submission.JobID
78 | }
79 |
80 | return submission.JobID
81 | }
82 |
83 | func generateUUID() string {
84 | return uuid.New().String()
85 | }
86 |
87 | func storeJob(submission models.SubmissionRequest) error {
88 | pool := db.GetConnectionPool()
89 | _, err := pool.Exec(context.Background(), "INSERT INTO submissions (language, code, job_id, output) VALUES ($1, $2, $3, $4)", submission.Language, submission.Code, submission.JobID, "")
90 |
91 | return err
92 | }
93 |
--------------------------------------------------------------------------------
/ui/freight/src/index.css:
--------------------------------------------------------------------------------
1 | :root {
2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
3 | line-height: 1.5;
4 | font-weight: 400;
5 |
6 | color-scheme: light dark;
7 | color: rgba(255, 255, 255, 0.87);
8 | background-color: #242424;
9 |
10 | font-synthesis: none;
11 | text-rendering: optimizeLegibility;
12 | -webkit-font-smoothing: antialiased;
13 | -moz-osx-font-smoothing: grayscale;
14 | }
15 |
16 | a {
17 | font-weight: 500;
18 | color: #646cff;
19 | text-decoration: inherit;
20 | }
21 | a:hover {
22 | color: #535bf2;
23 | }
24 |
25 | body {
26 | margin: 0;
27 | display: flex;
28 | place-items: center;
29 | min-width: 320px;
30 | min-height: 100vh;
31 | }
32 |
33 | h1 {
34 | font-size: 3.2em;
35 | line-height: 1.1;
36 | }
37 |
38 | button {
39 | border-radius: 8px;
40 | border: 1px solid transparent;
41 | padding: 0.6em 1.2em;
42 | font-size: 1em;
43 | font-weight: 500;
44 | font-family: inherit;
45 | background-color: #1a1a1a;
46 | cursor: pointer;
47 | transition: border-color 0.25s;
48 | }
49 | button:hover {
50 | border-color: #646cff;
51 | }
52 | button:focus,
53 | button:focus-visible {
54 | outline: 4px auto -webkit-focus-ring-color;
55 | }
56 |
57 | @media (prefers-color-scheme: light) {
58 | :root {
59 | color: #213547;
60 | background-color: #ffffff;
61 | }
62 | a:hover {
63 | color: #747bff;
64 | }
65 | button {
66 | background-color: #f9f9f9;
67 | }
68 | }
69 |
70 | select {
71 | border-radius: 8px;
72 | border: 1px solid transparent;
73 | padding: 0.6em 1.2em;
74 | font-size: 1em;
75 | font-weight: 500;
76 | font-family: inherit;
77 | background-color: #1a1a1a;
78 | color: rgba(255, 255, 255, 0.87);
79 | cursor: pointer;
80 | transition: border-color 0.25s, background-color 0.25s;
81 | margin-bottom: 1em; /* Adds space between select and button */
82 | }
83 |
84 | select:hover {
85 | border-color: #646cff;
86 | }
87 |
88 | select:focus,
89 | select:focus-visible {
90 | outline: 4px auto -webkit-focus-ring-color;
91 | }
92 |
93 | @media (prefers-color-scheme: light) {
94 | select {
95 | background-color: #f9f9f9;
96 | color: #213547;
97 | border-color: #ccc;
98 | }
99 |
100 | select:hover {
101 | border-color: #747bff;
102 | }
103 | }
104 |
105 | @keyframes colorChange {
106 | 0% { color: gold; }
107 | 25% { color: yellow; }
108 | 50% { color: white; }
109 | 65% {color: lightgreen}
110 | 75% { color: lightblue; }
111 | 100% { color: violet; }
112 | }
113 |
114 | h1 {
115 | animation: colorChange 4s infinite;
116 | }
117 |
--------------------------------------------------------------------------------
/ui/freight/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react';
2 | import './App.css';
3 |
4 | function App() {
5 | const [code, setCode] = useState("");
6 | const [loading, setLoading] = useState(false);
7 | const [jobId, setJobId] = useState("");
8 | const [output, setOutput] = useState("");
9 | const [language, setLanguage] = useState("py"); // Default language
10 |
11 |
12 | function handleSubmit() {
13 | setLoading(true);
14 | setOutput("...")
15 |
16 | fetch("http://localhost:30000/submission", {
17 | method: "POST",
18 | headers: {
19 | "Content-Type": "application/json",
20 | },
21 | body: JSON.stringify({
22 | lang: language,
23 | code: code,
24 | job_id: "",
25 | }),
26 | })
27 | .then((response) => response.json())
28 | .then((data) => {
29 | console.log("Success:", data);
30 | setJobId(data["job_id"]);
31 | })
32 | .catch((error) => {
33 | console.error("Error:", error);
34 | });
35 | }
36 |
37 | useEffect(() => {
38 | let interval = 1000;
39 | if (jobId) {
40 | interval = setInterval(() => {
41 | fetch(`http://localhost:30000/check?job_id=${jobId}`)
42 | .then((response) => response.json())
43 | .then((data) => {
44 | if (data['state'] === "SUCCESS" || data.status === "FAILED") {
45 | setOutput(data.output);
46 | clearInterval(interval); // Stop polling
47 | setLoading(false);
48 | }
49 | })
50 | .catch((error) => console.error("Error:", error));
51 | }, 1000); // Poll every second
52 | }
53 |
54 | return () => clearInterval(interval); // Cleanup on unmount or jobId change
55 | }, [jobId]);
56 |
57 | return (
58 | <>
59 |
60 |
🍝 Spaghetti code execution engine
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
75 |
76 |
77 | {loading ? (
78 |
79 | ) : (
80 |
81 | )}
82 |
83 | >
84 | );
85 | }
86 |
87 | export default App;
88 |
--------------------------------------------------------------------------------
/internal/jobs/process.go:
--------------------------------------------------------------------------------
1 | package jobs
2 |
3 | import (
4 | "encoding/json"
5 | "fmt"
6 | "log"
7 | "os"
8 |
9 | "github.com/0jk6/freight/internal/models"
10 | "github.com/0jk6/freight/internal/orchestrator"
11 | amqp "github.com/rabbitmq/amqp091-go"
12 | )
13 |
14 | type ContainerInfo struct {
15 | image string
16 | command []string
17 | namespace string
18 | }
19 |
20 | func ProcessSubmissions() {
21 | rabbitHost := os.Getenv("RABBITMQ_HOST")
22 |
23 | if rabbitHost == "" {
24 | rabbitHost = "localhost" // Fallback to localhost if the environment variable is not set
25 | }
26 |
27 | rabbitUser := "guest"
28 | rabbitPassword := "guest"
29 | rabbitPort := "5672"
30 |
31 | rabbitConnStr := fmt.Sprintf("amqp://%s:%s@%s:%s/", rabbitUser, rabbitPassword, rabbitHost, rabbitPort)
32 |
33 | conn, err := amqp.Dial(rabbitConnStr)
34 | if err != nil {
35 | log.Fatal(err)
36 |
37 | }
38 |
39 | defer conn.Close()
40 |
41 | ch, err := conn.Channel()
42 | if err != nil {
43 | log.Println("Error while creating channel.")
44 | }
45 |
46 | defer ch.Close()
47 |
48 | q, err := ch.QueueDeclare("jobs_queue", true, false, false, false, nil)
49 | if err != nil {
50 | log.Fatal(err)
51 | }
52 |
53 | //consume messages
54 |
55 | msgs, err := ch.Consume(
56 | q.Name,
57 | "",
58 | true,
59 | false,
60 | false,
61 | false,
62 | nil,
63 | )
64 |
65 | if err != nil {
66 | log.Println("Failed to register a consumer")
67 | }
68 |
69 | //use the channel to run a goroutine
70 | var loop chan struct{}
71 |
72 | go func() {
73 | for d := range msgs {
74 | //spin up a container
75 | submission := models.SubmissionRequest{}
76 | json.Unmarshal(d.Body, &submission)
77 | spinUpJob(submission)
78 | }
79 | }()
80 |
81 | <-loop
82 | }
83 |
84 | // spin up a job on k8s
85 | func spinUpJob(submission models.SubmissionRequest) {
86 | log.Printf("spinning up job for %s", submission.JobID)
87 |
88 | // //decode base64 data
89 | // base64Code, err := base64.StdEncoding.DecodeString(submission.Code)
90 | // if err != nil {
91 | // log.Println("Error decoding code")
92 | // return
93 | // }
94 | // submission.Code = string(base64Code)
95 |
96 | // log.Println(submission.Code)
97 | namespace := "freight-ns"
98 |
99 | containerInfo := createContainerInfo(submission)
100 | orchestrator.RunJob(namespace, submission.JobID, containerInfo.image, submission.Code, containerInfo.command)
101 | }
102 |
103 | func createContainerInfo(submission models.SubmissionRequest) ContainerInfo {
104 | containerInfo := ContainerInfo{}
105 |
106 | if submission.Language == "py" {
107 | containerInfo.image = "python:3.9.7"
108 | containerInfo.command = []string{"python", "-c", submission.Code}
109 | } else if submission.Language == "c" {
110 | containerInfo.image = "gcc:12.4.0"
111 | containerInfo.command = []string{
112 | "/bin/sh",
113 | "-c",
114 | fmt.Sprintf("echo '%s' > main.c && gcc main.c -o a.out && ./a.out", submission.Code),
115 | }
116 | } else if submission.Language == "cpp" {
117 | containerInfo.image = "gcc:12.4.0"
118 | containerInfo.command = []string{
119 | "/bin/sh",
120 | "-c",
121 | fmt.Sprintf("echo '%s' > main.cpp && g++ main.cpp -o a.out && ./a.out", submission.Code),
122 | }
123 | } else if submission.Language == "js" {
124 | containerInfo.image = "node:22-alpine3.19"
125 | containerInfo.command = []string{"node", "-e", submission.Code}
126 | } else if submission.Language == "go" {
127 | containerInfo.image = "golang:1.22.0"
128 | containerInfo.command = []string{
129 | "/bin/sh",
130 | "-c",
131 | fmt.Sprintf("echo '%s' > main.go && go build main.go && chmod +x main && ./main", submission.Code)}
132 | } else {
133 | containerInfo.image = ""
134 | }
135 |
136 | return containerInfo
137 | }
138 |
--------------------------------------------------------------------------------
/ui/freight/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/install.yml:
--------------------------------------------------------------------------------
1 | # create a namespace
2 | apiVersion: v1
3 | kind: Namespace
4 | metadata:
5 | name: freight-ns
6 |
7 | ---
8 | # create a service account
9 | apiVersion: v1
10 | kind: ServiceAccount
11 | metadata:
12 | name: freight-sa
13 | namespace: freight-ns
14 |
15 | ---
16 | # create rbac
17 | apiVersion: rbac.authorization.k8s.io/v1
18 | kind: Role
19 | metadata:
20 | name: freight-role
21 | namespace: freight-ns
22 | rules:
23 | - apiGroups: [""]
24 | resources: ["pods"]
25 | verbs: ["list", "get", "create", "delete"]
26 | - apiGroups: ["batch"]
27 | resources: ["jobs"]
28 | verbs: ["list", "get", "create", "delete"]
29 | - apiGroups: [""]
30 | resources: ["pods/log"]
31 | verbs: ["list", "get"]
32 |
33 | ---
34 | # create rolebinding to bind the service account to the role
35 | apiVersion: rbac.authorization.k8s.io/v1
36 | kind: RoleBinding
37 | metadata:
38 | name: freight-rolebinding
39 | namespace: freight-ns
40 | subjects:
41 | - kind: ServiceAccount
42 | name: freight-sa
43 | namespace: freight-ns
44 | roleRef:
45 | kind: Role
46 | name: freight-role
47 | apiGroup: rbac.authorization.k8s.io
48 |
49 | ---
50 | # create rabbitmq deployment
51 | apiVersion: apps/v1
52 | kind: Deployment
53 | metadata:
54 | name: rabbitmq
55 | namespace: freight-ns
56 | spec:
57 | replicas: 1
58 | selector:
59 | matchLabels:
60 | app: rabbitmq
61 | template:
62 | metadata:
63 | labels:
64 | app: rabbitmq
65 | spec:
66 | containers:
67 | - name: rabbitmq
68 | image: rabbitmq:3-management
69 | ports:
70 | - containerPort: 5672
71 |
72 | ---
73 | # create a rabbitmq service
74 | apiVersion: v1
75 | kind: Service
76 | metadata:
77 | name: rabbitmq
78 | namespace: freight-ns
79 | spec:
80 | selector:
81 | app: rabbitmq
82 | ports:
83 | - protocol: TCP
84 | port: 5672
85 | targetPort: 5672
86 |
87 | ---
88 | # create postgres deployment
89 | apiVersion: apps/v1
90 | kind: Deployment
91 | metadata:
92 | name: postgres
93 | namespace: freight-ns
94 | spec:
95 | replicas: 1
96 | selector:
97 | matchLabels:
98 | app: postgres
99 | template:
100 | metadata:
101 | labels:
102 | app: postgres
103 | spec:
104 | containers:
105 | - name: postgres
106 | image: postgres:12.5-alpine
107 | ports:
108 | - containerPort: 5432
109 | env:
110 | - name: POSTGRES_USER
111 | value: "postgres"
112 | - name: POSTGRES_PASSWORD
113 | value: "password"
114 | - name: POSTGRES_DB
115 | value: "freight"
116 |
117 | ---
118 | # create a postgres service
119 | apiVersion: v1
120 | kind: Service
121 | metadata:
122 | name: postgres
123 | namespace: freight-ns
124 | spec:
125 | selector:
126 | app: postgres
127 | ports:
128 | - protocol: TCP
129 | port: 5432
130 | targetPort: 5432
131 |
132 | ---
133 | # create a freight-backend deployment
134 | apiVersion: apps/v1
135 | kind: Deployment
136 | metadata:
137 | name: freight-backend
138 | namespace: freight-ns
139 | spec:
140 | replicas: 1
141 | selector:
142 | matchLabels:
143 | app: freight-backend
144 | template:
145 | metadata:
146 | labels:
147 | app: freight-backend
148 | spec:
149 | serviceAccountName: freight-sa
150 | containers:
151 | - name: freight-backend
152 | image: 0jk6/freight-backend:0.0.2
153 | imagePullPolicy: Always
154 | ports:
155 | - containerPort: 8080
156 | env:
157 | - name: POSTGRES_HOST
158 | value: "postgres"
159 | - name: RABBITMQ_HOST
160 | value: "rabbitmq"
161 |
162 | ---
163 | # create a freight-backend service
164 | apiVersion: v1
165 | kind: Service
166 | metadata:
167 | name: freight-backend
168 | namespace: freight-ns
169 | spec:
170 | type: NodePort
171 | selector:
172 | app: freight-backend
173 | ports:
174 | - protocol: TCP
175 | port: 8080
176 | targetPort: 8080
177 | nodePort: 30000
178 |
179 | ---
180 | #create freight-service deployment
181 | apiVersion: apps/v1
182 | kind: Deployment
183 | metadata:
184 | name: freight-service
185 | namespace: freight-ns
186 | spec:
187 | replicas: 1
188 | selector:
189 | matchLabels:
190 | app: freight-service
191 | template:
192 | metadata:
193 | labels:
194 | app: freight-service
195 | spec:
196 | serviceAccountName: freight-sa
197 | containers:
198 | - name: freight-service
199 | image: 0jk6/freight-service:0.0.2
200 | imagePullPolicy: Always
201 | env:
202 | - name: POSTGRES_HOST
203 | value: "postgres"
204 | - name: RABBITMQ_HOST
205 | value: "rabbitmq"
206 |
--------------------------------------------------------------------------------
/internal/orchestrator/orchestrator.go:
--------------------------------------------------------------------------------
1 | package orchestrator
2 |
3 | import (
4 | "bytes"
5 | "context"
6 | "fmt"
7 | "log"
8 | "os"
9 |
10 | "github.com/0jk6/freight/internal/db"
11 | batchv1 "k8s.io/api/batch/v1"
12 | corev1 "k8s.io/api/core/v1"
13 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14 | "k8s.io/client-go/kubernetes"
15 | "k8s.io/client-go/rest"
16 | "k8s.io/client-go/tools/clientcmd"
17 | )
18 |
19 | // spin up a job in k8s
20 | func getK8sClient() *kubernetes.Clientset {
21 |
22 | config, err := rest.InClusterConfig()
23 |
24 | if err != nil {
25 | //dont panic, check if the env var is dev
26 | if os.Getenv("ENV") == "dev" {
27 | kubeconfigPath := "/Users/user1/.kube/config"
28 | config, err = clientcmd.BuildConfigFromFlags("", kubeconfigPath)
29 | if err != nil {
30 | panic(err)
31 | }
32 | } else {
33 | panic(err)
34 | }
35 | }
36 |
37 | clientset, err := kubernetes.NewForConfig(config)
38 | if err != nil {
39 | panic(err)
40 | }
41 |
42 | return clientset
43 | }
44 |
45 | func RunJob(namespace, jobName, image, code string, command []string) {
46 | clientset := getK8sClient()
47 |
48 | jobsClient := clientset.BatchV1().Jobs(namespace)
49 |
50 | backoffLimit := int32(0) // number of retries
51 | activeDeadlineSeconds := int64(100) // time limit for the job
52 |
53 | job := &batchv1.Job{
54 | ObjectMeta: metav1.ObjectMeta{
55 | Name: jobName,
56 | Namespace: namespace,
57 | },
58 | Spec: batchv1.JobSpec{
59 | BackoffLimit: &backoffLimit,
60 | ActiveDeadlineSeconds: &activeDeadlineSeconds,
61 | Template: corev1.PodTemplateSpec{
62 | Spec: corev1.PodSpec{
63 | Containers: []corev1.Container{
64 | {
65 | Name: jobName,
66 | Image: image,
67 | Command: command,
68 | Resources: corev1.ResourceRequirements{
69 | Limits: corev1.ResourceList{
70 | // corev1.ResourceCPU: resource.MustParse("250m"),
71 | // corev1.ResourceMemory: resource.MustParse("256Mi"),
72 | },
73 | },
74 | },
75 | },
76 | RestartPolicy: corev1.RestartPolicyNever,
77 | },
78 | },
79 | },
80 | }
81 |
82 | _, err := jobsClient.Create(context.Background(), job, metav1.CreateOptions{})
83 |
84 | if err != nil {
85 | panic(err)
86 | }
87 | }
88 |
89 | func ListJobs(namespace string) {
90 | // log.Println("processing jobs")
91 | clientset := getK8sClient()
92 | jobsClient := clientset.BatchV1().Jobs(namespace)
93 |
94 | jobs, err := jobsClient.List(context.Background(), metav1.ListOptions{})
95 |
96 | if err != nil {
97 | panic(err)
98 | }
99 |
100 | for _, job := range jobs.Items {
101 | go func() {
102 | log.Printf("job name: %s\n", job.Name)
103 | log.Printf("completions: %d\n", *job.Spec.Completions)
104 | log.Printf("succeeded: %d\n", job.Status.Succeeded)
105 | log.Printf("failed: %d\n", job.Status.Failed)
106 | log.Println("------------")
107 |
108 | if *job.Spec.Completions == 1 || job.Status.Succeeded == 1 || job.Status.Failed == 1 {
109 | logs, err := getLogs(job.Name, namespace)
110 | if err != nil {
111 | log.Println(err)
112 | } else {
113 | if logs == "" {
114 | logs = "No logs found, process might've ran for more than 10 seconds."
115 | }
116 | // log.Printf("logs: %s\n", logs)
117 | log.Println("job completed, deleting job")
118 | pool := db.GetConnectionPool()
119 | pool.Exec(context.Background(), "UPDATE submissions SET output = $1 WHERE job_id = $2", logs, job.Name)
120 | deleteJob(namespace, job)
121 | }
122 | }
123 | }()
124 | }
125 | }
126 |
127 | func getLogs(jobName, namespace string) (string, error) {
128 | clientset := getK8sClient()
129 |
130 | podList, err := clientset.CoreV1().Pods(namespace).List(context.Background(), metav1.ListOptions{
131 | LabelSelector: fmt.Sprintf("job-name=%s", jobName),
132 | })
133 |
134 | if err != nil {
135 | panic(err)
136 | }
137 |
138 | if len(podList.Items) == 0 {
139 | log.Println("No pods found for the job")
140 | return "", nil
141 | }
142 |
143 | podName := podList.Items[0].Name
144 | log.Println("pod name:", podName)
145 |
146 | // Get the logs of the pod
147 | logs, err := clientset.CoreV1().Pods(namespace).GetLogs(podName, &corev1.PodLogOptions{}).Stream(context.Background())
148 | if err != nil {
149 | return "", err
150 | }
151 | defer logs.Close()
152 |
153 | // Print the logs
154 | buf := new(bytes.Buffer)
155 | _, err = buf.ReadFrom(logs)
156 | if err != nil {
157 | return "", nil
158 | }
159 |
160 | return buf.String(), nil
161 | }
162 |
163 | func deleteJob(namespace string, job batchv1.Job) {
164 | clientset := getK8sClient()
165 | jobsClient := clientset.BatchV1().Jobs(namespace)
166 |
167 | backgroundDeletion := metav1.DeletePropagationBackground
168 |
169 | err := jobsClient.Delete(context.Background(), job.Name, metav1.DeleteOptions{
170 | PropagationPolicy: &backgroundDeletion,
171 | })
172 |
173 | if err != nil {
174 | panic(err)
175 | }
176 | }
177 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
2 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5 | github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
6 | github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
7 | github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
8 | github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
9 | github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
10 | github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
11 | github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
12 | github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
13 | github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
14 | github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
15 | github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
16 | github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
17 | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
18 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
19 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
20 | github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
21 | github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
22 | github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
23 | github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
24 | github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
25 | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
26 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
27 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
28 | github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
29 | github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
30 | github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
31 | github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
32 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
33 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
34 | github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28=
35 | github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
36 | github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
37 | github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
38 | github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
39 | github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
40 | github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY=
41 | github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw=
42 | github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
43 | github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
44 | github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
45 | github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
46 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
47 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
48 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
49 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
50 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
51 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
52 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
53 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
54 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
55 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
56 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
57 | github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
58 | github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
59 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
60 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
61 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
62 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
63 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
64 | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
65 | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
66 | github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY=
67 | github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM=
68 | github.com/onsi/gomega v1.31.0 h1:54UJxxj6cPInHS3a35wm6BK/F9nHYueZ1NVujHDrnXE=
69 | github.com/onsi/gomega v1.31.0/go.mod h1:DW9aCi7U6Yi40wNVAvT6kzFnEVEI5n3DloYBiKiT6zk=
70 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
71 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
72 | github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
73 | github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
74 | github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
75 | github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
76 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
77 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
78 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
79 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
80 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
81 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
82 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
83 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
84 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
85 | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
86 | github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
87 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
88 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
89 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
90 | go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
91 | go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
92 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
93 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
94 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
95 | golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
96 | golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
97 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
98 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
99 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
100 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
101 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
102 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
103 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
104 | golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
105 | golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
106 | golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=
107 | golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
108 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
109 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
110 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
111 | golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
112 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
113 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
114 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
115 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
116 | golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
117 | golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
118 | golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
119 | golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
120 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
121 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
122 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
123 | golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
124 | golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
125 | golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
126 | golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
127 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
128 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
129 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
130 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
131 | golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
132 | golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg=
133 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
134 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
135 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
136 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
137 | google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
138 | google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
139 | google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
140 | google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
141 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
142 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
143 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
144 | gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
145 | gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
146 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
147 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
148 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
149 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
150 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
151 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
152 | k8s.io/api v0.30.3 h1:ImHwK9DCsPA9uoU3rVh4QHAHHK5dTSv1nxJUapx8hoQ=
153 | k8s.io/api v0.30.3/go.mod h1:GPc8jlzoe5JG3pb0KJCSLX5oAFIW3/qNJITlDj8BH04=
154 | k8s.io/apimachinery v0.30.3 h1:q1laaWCmrszyQuSQCfNB8cFgCuDAoPszKY4ucAjDwHc=
155 | k8s.io/apimachinery v0.30.3/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc=
156 | k8s.io/client-go v0.30.3 h1:bHrJu3xQZNXIi8/MoxYtZBBWQQXwy16zqJwloXXfD3k=
157 | k8s.io/client-go v0.30.3/go.mod h1:8d4pf8vYu665/kUbsxWAQ/JDBNWqfFeZnvFiVdmx89U=
158 | k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
159 | k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
160 | k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag=
161 | k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
162 | k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
163 | k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
164 | sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
165 | sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
166 | sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
167 | sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
168 | sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
169 | sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
170 |
--------------------------------------------------------------------------------
/ui/freight/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "freight",
3 | "version": "0.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "freight",
9 | "version": "0.0.0",
10 | "dependencies": {
11 | "react": "^18.3.1",
12 | "react-dom": "^18.3.1"
13 | },
14 | "devDependencies": {
15 | "@eslint/js": "^9.13.0",
16 | "@types/react": "^18.3.12",
17 | "@types/react-dom": "^18.3.1",
18 | "@vitejs/plugin-react": "^4.3.3",
19 | "eslint": "^9.13.0",
20 | "eslint-plugin-react-hooks": "^5.0.0",
21 | "eslint-plugin-react-refresh": "^0.4.14",
22 | "globals": "^15.11.0",
23 | "typescript": "~5.6.2",
24 | "typescript-eslint": "^8.11.0",
25 | "vite": "^5.4.10"
26 | }
27 | },
28 | "node_modules/@ampproject/remapping": {
29 | "version": "2.3.0",
30 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
31 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
32 | "dev": true,
33 | "license": "Apache-2.0",
34 | "dependencies": {
35 | "@jridgewell/gen-mapping": "^0.3.5",
36 | "@jridgewell/trace-mapping": "^0.3.24"
37 | },
38 | "engines": {
39 | "node": ">=6.0.0"
40 | }
41 | },
42 | "node_modules/@babel/code-frame": {
43 | "version": "7.26.2",
44 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
45 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
46 | "dev": true,
47 | "license": "MIT",
48 | "dependencies": {
49 | "@babel/helper-validator-identifier": "^7.25.9",
50 | "js-tokens": "^4.0.0",
51 | "picocolors": "^1.0.0"
52 | },
53 | "engines": {
54 | "node": ">=6.9.0"
55 | }
56 | },
57 | "node_modules/@babel/compat-data": {
58 | "version": "7.26.2",
59 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
60 | "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
61 | "dev": true,
62 | "license": "MIT",
63 | "engines": {
64 | "node": ">=6.9.0"
65 | }
66 | },
67 | "node_modules/@babel/core": {
68 | "version": "7.26.0",
69 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
70 | "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
71 | "dev": true,
72 | "license": "MIT",
73 | "dependencies": {
74 | "@ampproject/remapping": "^2.2.0",
75 | "@babel/code-frame": "^7.26.0",
76 | "@babel/generator": "^7.26.0",
77 | "@babel/helper-compilation-targets": "^7.25.9",
78 | "@babel/helper-module-transforms": "^7.26.0",
79 | "@babel/helpers": "^7.26.0",
80 | "@babel/parser": "^7.26.0",
81 | "@babel/template": "^7.25.9",
82 | "@babel/traverse": "^7.25.9",
83 | "@babel/types": "^7.26.0",
84 | "convert-source-map": "^2.0.0",
85 | "debug": "^4.1.0",
86 | "gensync": "^1.0.0-beta.2",
87 | "json5": "^2.2.3",
88 | "semver": "^6.3.1"
89 | },
90 | "engines": {
91 | "node": ">=6.9.0"
92 | },
93 | "funding": {
94 | "type": "opencollective",
95 | "url": "https://opencollective.com/babel"
96 | }
97 | },
98 | "node_modules/@babel/generator": {
99 | "version": "7.26.2",
100 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
101 | "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
102 | "dev": true,
103 | "license": "MIT",
104 | "dependencies": {
105 | "@babel/parser": "^7.26.2",
106 | "@babel/types": "^7.26.0",
107 | "@jridgewell/gen-mapping": "^0.3.5",
108 | "@jridgewell/trace-mapping": "^0.3.25",
109 | "jsesc": "^3.0.2"
110 | },
111 | "engines": {
112 | "node": ">=6.9.0"
113 | }
114 | },
115 | "node_modules/@babel/helper-compilation-targets": {
116 | "version": "7.25.9",
117 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
118 | "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
119 | "dev": true,
120 | "license": "MIT",
121 | "dependencies": {
122 | "@babel/compat-data": "^7.25.9",
123 | "@babel/helper-validator-option": "^7.25.9",
124 | "browserslist": "^4.24.0",
125 | "lru-cache": "^5.1.1",
126 | "semver": "^6.3.1"
127 | },
128 | "engines": {
129 | "node": ">=6.9.0"
130 | }
131 | },
132 | "node_modules/@babel/helper-module-imports": {
133 | "version": "7.25.9",
134 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
135 | "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
136 | "dev": true,
137 | "license": "MIT",
138 | "dependencies": {
139 | "@babel/traverse": "^7.25.9",
140 | "@babel/types": "^7.25.9"
141 | },
142 | "engines": {
143 | "node": ">=6.9.0"
144 | }
145 | },
146 | "node_modules/@babel/helper-module-transforms": {
147 | "version": "7.26.0",
148 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
149 | "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
150 | "dev": true,
151 | "license": "MIT",
152 | "dependencies": {
153 | "@babel/helper-module-imports": "^7.25.9",
154 | "@babel/helper-validator-identifier": "^7.25.9",
155 | "@babel/traverse": "^7.25.9"
156 | },
157 | "engines": {
158 | "node": ">=6.9.0"
159 | },
160 | "peerDependencies": {
161 | "@babel/core": "^7.0.0"
162 | }
163 | },
164 | "node_modules/@babel/helper-plugin-utils": {
165 | "version": "7.25.9",
166 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
167 | "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
168 | "dev": true,
169 | "license": "MIT",
170 | "engines": {
171 | "node": ">=6.9.0"
172 | }
173 | },
174 | "node_modules/@babel/helper-string-parser": {
175 | "version": "7.25.9",
176 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
177 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
178 | "dev": true,
179 | "license": "MIT",
180 | "engines": {
181 | "node": ">=6.9.0"
182 | }
183 | },
184 | "node_modules/@babel/helper-validator-identifier": {
185 | "version": "7.25.9",
186 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
187 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
188 | "dev": true,
189 | "license": "MIT",
190 | "engines": {
191 | "node": ">=6.9.0"
192 | }
193 | },
194 | "node_modules/@babel/helper-validator-option": {
195 | "version": "7.25.9",
196 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
197 | "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
198 | "dev": true,
199 | "license": "MIT",
200 | "engines": {
201 | "node": ">=6.9.0"
202 | }
203 | },
204 | "node_modules/@babel/helpers": {
205 | "version": "7.26.0",
206 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
207 | "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
208 | "dev": true,
209 | "license": "MIT",
210 | "dependencies": {
211 | "@babel/template": "^7.25.9",
212 | "@babel/types": "^7.26.0"
213 | },
214 | "engines": {
215 | "node": ">=6.9.0"
216 | }
217 | },
218 | "node_modules/@babel/parser": {
219 | "version": "7.26.2",
220 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
221 | "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
222 | "dev": true,
223 | "license": "MIT",
224 | "dependencies": {
225 | "@babel/types": "^7.26.0"
226 | },
227 | "bin": {
228 | "parser": "bin/babel-parser.js"
229 | },
230 | "engines": {
231 | "node": ">=6.0.0"
232 | }
233 | },
234 | "node_modules/@babel/plugin-transform-react-jsx-self": {
235 | "version": "7.25.9",
236 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
237 | "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
238 | "dev": true,
239 | "license": "MIT",
240 | "dependencies": {
241 | "@babel/helper-plugin-utils": "^7.25.9"
242 | },
243 | "engines": {
244 | "node": ">=6.9.0"
245 | },
246 | "peerDependencies": {
247 | "@babel/core": "^7.0.0-0"
248 | }
249 | },
250 | "node_modules/@babel/plugin-transform-react-jsx-source": {
251 | "version": "7.25.9",
252 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
253 | "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
254 | "dev": true,
255 | "license": "MIT",
256 | "dependencies": {
257 | "@babel/helper-plugin-utils": "^7.25.9"
258 | },
259 | "engines": {
260 | "node": ">=6.9.0"
261 | },
262 | "peerDependencies": {
263 | "@babel/core": "^7.0.0-0"
264 | }
265 | },
266 | "node_modules/@babel/template": {
267 | "version": "7.25.9",
268 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
269 | "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
270 | "dev": true,
271 | "license": "MIT",
272 | "dependencies": {
273 | "@babel/code-frame": "^7.25.9",
274 | "@babel/parser": "^7.25.9",
275 | "@babel/types": "^7.25.9"
276 | },
277 | "engines": {
278 | "node": ">=6.9.0"
279 | }
280 | },
281 | "node_modules/@babel/traverse": {
282 | "version": "7.25.9",
283 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
284 | "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
285 | "dev": true,
286 | "license": "MIT",
287 | "dependencies": {
288 | "@babel/code-frame": "^7.25.9",
289 | "@babel/generator": "^7.25.9",
290 | "@babel/parser": "^7.25.9",
291 | "@babel/template": "^7.25.9",
292 | "@babel/types": "^7.25.9",
293 | "debug": "^4.3.1",
294 | "globals": "^11.1.0"
295 | },
296 | "engines": {
297 | "node": ">=6.9.0"
298 | }
299 | },
300 | "node_modules/@babel/traverse/node_modules/globals": {
301 | "version": "11.12.0",
302 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
303 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
304 | "dev": true,
305 | "license": "MIT",
306 | "engines": {
307 | "node": ">=4"
308 | }
309 | },
310 | "node_modules/@babel/types": {
311 | "version": "7.26.0",
312 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
313 | "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
314 | "dev": true,
315 | "license": "MIT",
316 | "dependencies": {
317 | "@babel/helper-string-parser": "^7.25.9",
318 | "@babel/helper-validator-identifier": "^7.25.9"
319 | },
320 | "engines": {
321 | "node": ">=6.9.0"
322 | }
323 | },
324 | "node_modules/@esbuild/aix-ppc64": {
325 | "version": "0.21.5",
326 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
327 | "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
328 | "cpu": [
329 | "ppc64"
330 | ],
331 | "dev": true,
332 | "license": "MIT",
333 | "optional": true,
334 | "os": [
335 | "aix"
336 | ],
337 | "engines": {
338 | "node": ">=12"
339 | }
340 | },
341 | "node_modules/@esbuild/android-arm": {
342 | "version": "0.21.5",
343 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
344 | "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
345 | "cpu": [
346 | "arm"
347 | ],
348 | "dev": true,
349 | "license": "MIT",
350 | "optional": true,
351 | "os": [
352 | "android"
353 | ],
354 | "engines": {
355 | "node": ">=12"
356 | }
357 | },
358 | "node_modules/@esbuild/android-arm64": {
359 | "version": "0.21.5",
360 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
361 | "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
362 | "cpu": [
363 | "arm64"
364 | ],
365 | "dev": true,
366 | "license": "MIT",
367 | "optional": true,
368 | "os": [
369 | "android"
370 | ],
371 | "engines": {
372 | "node": ">=12"
373 | }
374 | },
375 | "node_modules/@esbuild/android-x64": {
376 | "version": "0.21.5",
377 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
378 | "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
379 | "cpu": [
380 | "x64"
381 | ],
382 | "dev": true,
383 | "license": "MIT",
384 | "optional": true,
385 | "os": [
386 | "android"
387 | ],
388 | "engines": {
389 | "node": ">=12"
390 | }
391 | },
392 | "node_modules/@esbuild/darwin-arm64": {
393 | "version": "0.21.5",
394 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
395 | "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
396 | "cpu": [
397 | "arm64"
398 | ],
399 | "dev": true,
400 | "license": "MIT",
401 | "optional": true,
402 | "os": [
403 | "darwin"
404 | ],
405 | "engines": {
406 | "node": ">=12"
407 | }
408 | },
409 | "node_modules/@esbuild/darwin-x64": {
410 | "version": "0.21.5",
411 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
412 | "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
413 | "cpu": [
414 | "x64"
415 | ],
416 | "dev": true,
417 | "license": "MIT",
418 | "optional": true,
419 | "os": [
420 | "darwin"
421 | ],
422 | "engines": {
423 | "node": ">=12"
424 | }
425 | },
426 | "node_modules/@esbuild/freebsd-arm64": {
427 | "version": "0.21.5",
428 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
429 | "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
430 | "cpu": [
431 | "arm64"
432 | ],
433 | "dev": true,
434 | "license": "MIT",
435 | "optional": true,
436 | "os": [
437 | "freebsd"
438 | ],
439 | "engines": {
440 | "node": ">=12"
441 | }
442 | },
443 | "node_modules/@esbuild/freebsd-x64": {
444 | "version": "0.21.5",
445 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
446 | "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
447 | "cpu": [
448 | "x64"
449 | ],
450 | "dev": true,
451 | "license": "MIT",
452 | "optional": true,
453 | "os": [
454 | "freebsd"
455 | ],
456 | "engines": {
457 | "node": ">=12"
458 | }
459 | },
460 | "node_modules/@esbuild/linux-arm": {
461 | "version": "0.21.5",
462 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
463 | "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
464 | "cpu": [
465 | "arm"
466 | ],
467 | "dev": true,
468 | "license": "MIT",
469 | "optional": true,
470 | "os": [
471 | "linux"
472 | ],
473 | "engines": {
474 | "node": ">=12"
475 | }
476 | },
477 | "node_modules/@esbuild/linux-arm64": {
478 | "version": "0.21.5",
479 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
480 | "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
481 | "cpu": [
482 | "arm64"
483 | ],
484 | "dev": true,
485 | "license": "MIT",
486 | "optional": true,
487 | "os": [
488 | "linux"
489 | ],
490 | "engines": {
491 | "node": ">=12"
492 | }
493 | },
494 | "node_modules/@esbuild/linux-ia32": {
495 | "version": "0.21.5",
496 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
497 | "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
498 | "cpu": [
499 | "ia32"
500 | ],
501 | "dev": true,
502 | "license": "MIT",
503 | "optional": true,
504 | "os": [
505 | "linux"
506 | ],
507 | "engines": {
508 | "node": ">=12"
509 | }
510 | },
511 | "node_modules/@esbuild/linux-loong64": {
512 | "version": "0.21.5",
513 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
514 | "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
515 | "cpu": [
516 | "loong64"
517 | ],
518 | "dev": true,
519 | "license": "MIT",
520 | "optional": true,
521 | "os": [
522 | "linux"
523 | ],
524 | "engines": {
525 | "node": ">=12"
526 | }
527 | },
528 | "node_modules/@esbuild/linux-mips64el": {
529 | "version": "0.21.5",
530 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
531 | "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
532 | "cpu": [
533 | "mips64el"
534 | ],
535 | "dev": true,
536 | "license": "MIT",
537 | "optional": true,
538 | "os": [
539 | "linux"
540 | ],
541 | "engines": {
542 | "node": ">=12"
543 | }
544 | },
545 | "node_modules/@esbuild/linux-ppc64": {
546 | "version": "0.21.5",
547 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
548 | "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
549 | "cpu": [
550 | "ppc64"
551 | ],
552 | "dev": true,
553 | "license": "MIT",
554 | "optional": true,
555 | "os": [
556 | "linux"
557 | ],
558 | "engines": {
559 | "node": ">=12"
560 | }
561 | },
562 | "node_modules/@esbuild/linux-riscv64": {
563 | "version": "0.21.5",
564 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
565 | "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
566 | "cpu": [
567 | "riscv64"
568 | ],
569 | "dev": true,
570 | "license": "MIT",
571 | "optional": true,
572 | "os": [
573 | "linux"
574 | ],
575 | "engines": {
576 | "node": ">=12"
577 | }
578 | },
579 | "node_modules/@esbuild/linux-s390x": {
580 | "version": "0.21.5",
581 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
582 | "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
583 | "cpu": [
584 | "s390x"
585 | ],
586 | "dev": true,
587 | "license": "MIT",
588 | "optional": true,
589 | "os": [
590 | "linux"
591 | ],
592 | "engines": {
593 | "node": ">=12"
594 | }
595 | },
596 | "node_modules/@esbuild/linux-x64": {
597 | "version": "0.21.5",
598 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
599 | "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
600 | "cpu": [
601 | "x64"
602 | ],
603 | "dev": true,
604 | "license": "MIT",
605 | "optional": true,
606 | "os": [
607 | "linux"
608 | ],
609 | "engines": {
610 | "node": ">=12"
611 | }
612 | },
613 | "node_modules/@esbuild/netbsd-x64": {
614 | "version": "0.21.5",
615 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
616 | "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
617 | "cpu": [
618 | "x64"
619 | ],
620 | "dev": true,
621 | "license": "MIT",
622 | "optional": true,
623 | "os": [
624 | "netbsd"
625 | ],
626 | "engines": {
627 | "node": ">=12"
628 | }
629 | },
630 | "node_modules/@esbuild/openbsd-x64": {
631 | "version": "0.21.5",
632 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
633 | "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
634 | "cpu": [
635 | "x64"
636 | ],
637 | "dev": true,
638 | "license": "MIT",
639 | "optional": true,
640 | "os": [
641 | "openbsd"
642 | ],
643 | "engines": {
644 | "node": ">=12"
645 | }
646 | },
647 | "node_modules/@esbuild/sunos-x64": {
648 | "version": "0.21.5",
649 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
650 | "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
651 | "cpu": [
652 | "x64"
653 | ],
654 | "dev": true,
655 | "license": "MIT",
656 | "optional": true,
657 | "os": [
658 | "sunos"
659 | ],
660 | "engines": {
661 | "node": ">=12"
662 | }
663 | },
664 | "node_modules/@esbuild/win32-arm64": {
665 | "version": "0.21.5",
666 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
667 | "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
668 | "cpu": [
669 | "arm64"
670 | ],
671 | "dev": true,
672 | "license": "MIT",
673 | "optional": true,
674 | "os": [
675 | "win32"
676 | ],
677 | "engines": {
678 | "node": ">=12"
679 | }
680 | },
681 | "node_modules/@esbuild/win32-ia32": {
682 | "version": "0.21.5",
683 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
684 | "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
685 | "cpu": [
686 | "ia32"
687 | ],
688 | "dev": true,
689 | "license": "MIT",
690 | "optional": true,
691 | "os": [
692 | "win32"
693 | ],
694 | "engines": {
695 | "node": ">=12"
696 | }
697 | },
698 | "node_modules/@esbuild/win32-x64": {
699 | "version": "0.21.5",
700 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
701 | "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
702 | "cpu": [
703 | "x64"
704 | ],
705 | "dev": true,
706 | "license": "MIT",
707 | "optional": true,
708 | "os": [
709 | "win32"
710 | ],
711 | "engines": {
712 | "node": ">=12"
713 | }
714 | },
715 | "node_modules/@eslint-community/eslint-utils": {
716 | "version": "4.4.1",
717 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
718 | "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
719 | "dev": true,
720 | "license": "MIT",
721 | "dependencies": {
722 | "eslint-visitor-keys": "^3.4.3"
723 | },
724 | "engines": {
725 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
726 | },
727 | "funding": {
728 | "url": "https://opencollective.com/eslint"
729 | },
730 | "peerDependencies": {
731 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
732 | }
733 | },
734 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
735 | "version": "3.4.3",
736 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
737 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
738 | "dev": true,
739 | "license": "Apache-2.0",
740 | "engines": {
741 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
742 | },
743 | "funding": {
744 | "url": "https://opencollective.com/eslint"
745 | }
746 | },
747 | "node_modules/@eslint-community/regexpp": {
748 | "version": "4.12.1",
749 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
750 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
751 | "dev": true,
752 | "license": "MIT",
753 | "engines": {
754 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
755 | }
756 | },
757 | "node_modules/@eslint/config-array": {
758 | "version": "0.18.0",
759 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
760 | "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
761 | "dev": true,
762 | "license": "Apache-2.0",
763 | "dependencies": {
764 | "@eslint/object-schema": "^2.1.4",
765 | "debug": "^4.3.1",
766 | "minimatch": "^3.1.2"
767 | },
768 | "engines": {
769 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
770 | }
771 | },
772 | "node_modules/@eslint/core": {
773 | "version": "0.7.0",
774 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz",
775 | "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==",
776 | "dev": true,
777 | "license": "Apache-2.0",
778 | "engines": {
779 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
780 | }
781 | },
782 | "node_modules/@eslint/eslintrc": {
783 | "version": "3.1.0",
784 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
785 | "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
786 | "dev": true,
787 | "license": "MIT",
788 | "dependencies": {
789 | "ajv": "^6.12.4",
790 | "debug": "^4.3.2",
791 | "espree": "^10.0.1",
792 | "globals": "^14.0.0",
793 | "ignore": "^5.2.0",
794 | "import-fresh": "^3.2.1",
795 | "js-yaml": "^4.1.0",
796 | "minimatch": "^3.1.2",
797 | "strip-json-comments": "^3.1.1"
798 | },
799 | "engines": {
800 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
801 | },
802 | "funding": {
803 | "url": "https://opencollective.com/eslint"
804 | }
805 | },
806 | "node_modules/@eslint/eslintrc/node_modules/globals": {
807 | "version": "14.0.0",
808 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
809 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
810 | "dev": true,
811 | "license": "MIT",
812 | "engines": {
813 | "node": ">=18"
814 | },
815 | "funding": {
816 | "url": "https://github.com/sponsors/sindresorhus"
817 | }
818 | },
819 | "node_modules/@eslint/js": {
820 | "version": "9.14.0",
821 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz",
822 | "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==",
823 | "dev": true,
824 | "license": "MIT",
825 | "engines": {
826 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
827 | }
828 | },
829 | "node_modules/@eslint/object-schema": {
830 | "version": "2.1.4",
831 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
832 | "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
833 | "dev": true,
834 | "license": "Apache-2.0",
835 | "engines": {
836 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
837 | }
838 | },
839 | "node_modules/@eslint/plugin-kit": {
840 | "version": "0.2.2",
841 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz",
842 | "integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==",
843 | "dev": true,
844 | "license": "Apache-2.0",
845 | "dependencies": {
846 | "levn": "^0.4.1"
847 | },
848 | "engines": {
849 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
850 | }
851 | },
852 | "node_modules/@humanfs/core": {
853 | "version": "0.19.1",
854 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
855 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
856 | "dev": true,
857 | "license": "Apache-2.0",
858 | "engines": {
859 | "node": ">=18.18.0"
860 | }
861 | },
862 | "node_modules/@humanfs/node": {
863 | "version": "0.16.6",
864 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
865 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
866 | "dev": true,
867 | "license": "Apache-2.0",
868 | "dependencies": {
869 | "@humanfs/core": "^0.19.1",
870 | "@humanwhocodes/retry": "^0.3.0"
871 | },
872 | "engines": {
873 | "node": ">=18.18.0"
874 | }
875 | },
876 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
877 | "version": "0.3.1",
878 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
879 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
880 | "dev": true,
881 | "license": "Apache-2.0",
882 | "engines": {
883 | "node": ">=18.18"
884 | },
885 | "funding": {
886 | "type": "github",
887 | "url": "https://github.com/sponsors/nzakas"
888 | }
889 | },
890 | "node_modules/@humanwhocodes/module-importer": {
891 | "version": "1.0.1",
892 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
893 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
894 | "dev": true,
895 | "license": "Apache-2.0",
896 | "engines": {
897 | "node": ">=12.22"
898 | },
899 | "funding": {
900 | "type": "github",
901 | "url": "https://github.com/sponsors/nzakas"
902 | }
903 | },
904 | "node_modules/@humanwhocodes/retry": {
905 | "version": "0.4.1",
906 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
907 | "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
908 | "dev": true,
909 | "license": "Apache-2.0",
910 | "engines": {
911 | "node": ">=18.18"
912 | },
913 | "funding": {
914 | "type": "github",
915 | "url": "https://github.com/sponsors/nzakas"
916 | }
917 | },
918 | "node_modules/@jridgewell/gen-mapping": {
919 | "version": "0.3.5",
920 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
921 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
922 | "dev": true,
923 | "license": "MIT",
924 | "dependencies": {
925 | "@jridgewell/set-array": "^1.2.1",
926 | "@jridgewell/sourcemap-codec": "^1.4.10",
927 | "@jridgewell/trace-mapping": "^0.3.24"
928 | },
929 | "engines": {
930 | "node": ">=6.0.0"
931 | }
932 | },
933 | "node_modules/@jridgewell/resolve-uri": {
934 | "version": "3.1.2",
935 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
936 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
937 | "dev": true,
938 | "license": "MIT",
939 | "engines": {
940 | "node": ">=6.0.0"
941 | }
942 | },
943 | "node_modules/@jridgewell/set-array": {
944 | "version": "1.2.1",
945 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
946 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
947 | "dev": true,
948 | "license": "MIT",
949 | "engines": {
950 | "node": ">=6.0.0"
951 | }
952 | },
953 | "node_modules/@jridgewell/sourcemap-codec": {
954 | "version": "1.5.0",
955 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
956 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
957 | "dev": true,
958 | "license": "MIT"
959 | },
960 | "node_modules/@jridgewell/trace-mapping": {
961 | "version": "0.3.25",
962 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
963 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
964 | "dev": true,
965 | "license": "MIT",
966 | "dependencies": {
967 | "@jridgewell/resolve-uri": "^3.1.0",
968 | "@jridgewell/sourcemap-codec": "^1.4.14"
969 | }
970 | },
971 | "node_modules/@nodelib/fs.scandir": {
972 | "version": "2.1.5",
973 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
974 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
975 | "dev": true,
976 | "license": "MIT",
977 | "dependencies": {
978 | "@nodelib/fs.stat": "2.0.5",
979 | "run-parallel": "^1.1.9"
980 | },
981 | "engines": {
982 | "node": ">= 8"
983 | }
984 | },
985 | "node_modules/@nodelib/fs.stat": {
986 | "version": "2.0.5",
987 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
988 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
989 | "dev": true,
990 | "license": "MIT",
991 | "engines": {
992 | "node": ">= 8"
993 | }
994 | },
995 | "node_modules/@nodelib/fs.walk": {
996 | "version": "1.2.8",
997 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
998 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
999 | "dev": true,
1000 | "license": "MIT",
1001 | "dependencies": {
1002 | "@nodelib/fs.scandir": "2.1.5",
1003 | "fastq": "^1.6.0"
1004 | },
1005 | "engines": {
1006 | "node": ">= 8"
1007 | }
1008 | },
1009 | "node_modules/@rollup/rollup-android-arm-eabi": {
1010 | "version": "4.24.4",
1011 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz",
1012 | "integrity": "sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==",
1013 | "cpu": [
1014 | "arm"
1015 | ],
1016 | "dev": true,
1017 | "license": "MIT",
1018 | "optional": true,
1019 | "os": [
1020 | "android"
1021 | ]
1022 | },
1023 | "node_modules/@rollup/rollup-android-arm64": {
1024 | "version": "4.24.4",
1025 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz",
1026 | "integrity": "sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==",
1027 | "cpu": [
1028 | "arm64"
1029 | ],
1030 | "dev": true,
1031 | "license": "MIT",
1032 | "optional": true,
1033 | "os": [
1034 | "android"
1035 | ]
1036 | },
1037 | "node_modules/@rollup/rollup-darwin-arm64": {
1038 | "version": "4.24.4",
1039 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz",
1040 | "integrity": "sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==",
1041 | "cpu": [
1042 | "arm64"
1043 | ],
1044 | "dev": true,
1045 | "license": "MIT",
1046 | "optional": true,
1047 | "os": [
1048 | "darwin"
1049 | ]
1050 | },
1051 | "node_modules/@rollup/rollup-darwin-x64": {
1052 | "version": "4.24.4",
1053 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz",
1054 | "integrity": "sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==",
1055 | "cpu": [
1056 | "x64"
1057 | ],
1058 | "dev": true,
1059 | "license": "MIT",
1060 | "optional": true,
1061 | "os": [
1062 | "darwin"
1063 | ]
1064 | },
1065 | "node_modules/@rollup/rollup-freebsd-arm64": {
1066 | "version": "4.24.4",
1067 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz",
1068 | "integrity": "sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==",
1069 | "cpu": [
1070 | "arm64"
1071 | ],
1072 | "dev": true,
1073 | "license": "MIT",
1074 | "optional": true,
1075 | "os": [
1076 | "freebsd"
1077 | ]
1078 | },
1079 | "node_modules/@rollup/rollup-freebsd-x64": {
1080 | "version": "4.24.4",
1081 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz",
1082 | "integrity": "sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==",
1083 | "cpu": [
1084 | "x64"
1085 | ],
1086 | "dev": true,
1087 | "license": "MIT",
1088 | "optional": true,
1089 | "os": [
1090 | "freebsd"
1091 | ]
1092 | },
1093 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
1094 | "version": "4.24.4",
1095 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz",
1096 | "integrity": "sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==",
1097 | "cpu": [
1098 | "arm"
1099 | ],
1100 | "dev": true,
1101 | "license": "MIT",
1102 | "optional": true,
1103 | "os": [
1104 | "linux"
1105 | ]
1106 | },
1107 | "node_modules/@rollup/rollup-linux-arm-musleabihf": {
1108 | "version": "4.24.4",
1109 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz",
1110 | "integrity": "sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==",
1111 | "cpu": [
1112 | "arm"
1113 | ],
1114 | "dev": true,
1115 | "license": "MIT",
1116 | "optional": true,
1117 | "os": [
1118 | "linux"
1119 | ]
1120 | },
1121 | "node_modules/@rollup/rollup-linux-arm64-gnu": {
1122 | "version": "4.24.4",
1123 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz",
1124 | "integrity": "sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==",
1125 | "cpu": [
1126 | "arm64"
1127 | ],
1128 | "dev": true,
1129 | "license": "MIT",
1130 | "optional": true,
1131 | "os": [
1132 | "linux"
1133 | ]
1134 | },
1135 | "node_modules/@rollup/rollup-linux-arm64-musl": {
1136 | "version": "4.24.4",
1137 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz",
1138 | "integrity": "sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==",
1139 | "cpu": [
1140 | "arm64"
1141 | ],
1142 | "dev": true,
1143 | "license": "MIT",
1144 | "optional": true,
1145 | "os": [
1146 | "linux"
1147 | ]
1148 | },
1149 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
1150 | "version": "4.24.4",
1151 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz",
1152 | "integrity": "sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==",
1153 | "cpu": [
1154 | "ppc64"
1155 | ],
1156 | "dev": true,
1157 | "license": "MIT",
1158 | "optional": true,
1159 | "os": [
1160 | "linux"
1161 | ]
1162 | },
1163 | "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1164 | "version": "4.24.4",
1165 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz",
1166 | "integrity": "sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==",
1167 | "cpu": [
1168 | "riscv64"
1169 | ],
1170 | "dev": true,
1171 | "license": "MIT",
1172 | "optional": true,
1173 | "os": [
1174 | "linux"
1175 | ]
1176 | },
1177 | "node_modules/@rollup/rollup-linux-s390x-gnu": {
1178 | "version": "4.24.4",
1179 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz",
1180 | "integrity": "sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==",
1181 | "cpu": [
1182 | "s390x"
1183 | ],
1184 | "dev": true,
1185 | "license": "MIT",
1186 | "optional": true,
1187 | "os": [
1188 | "linux"
1189 | ]
1190 | },
1191 | "node_modules/@rollup/rollup-linux-x64-gnu": {
1192 | "version": "4.24.4",
1193 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz",
1194 | "integrity": "sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==",
1195 | "cpu": [
1196 | "x64"
1197 | ],
1198 | "dev": true,
1199 | "license": "MIT",
1200 | "optional": true,
1201 | "os": [
1202 | "linux"
1203 | ]
1204 | },
1205 | "node_modules/@rollup/rollup-linux-x64-musl": {
1206 | "version": "4.24.4",
1207 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz",
1208 | "integrity": "sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==",
1209 | "cpu": [
1210 | "x64"
1211 | ],
1212 | "dev": true,
1213 | "license": "MIT",
1214 | "optional": true,
1215 | "os": [
1216 | "linux"
1217 | ]
1218 | },
1219 | "node_modules/@rollup/rollup-win32-arm64-msvc": {
1220 | "version": "4.24.4",
1221 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz",
1222 | "integrity": "sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==",
1223 | "cpu": [
1224 | "arm64"
1225 | ],
1226 | "dev": true,
1227 | "license": "MIT",
1228 | "optional": true,
1229 | "os": [
1230 | "win32"
1231 | ]
1232 | },
1233 | "node_modules/@rollup/rollup-win32-ia32-msvc": {
1234 | "version": "4.24.4",
1235 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz",
1236 | "integrity": "sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==",
1237 | "cpu": [
1238 | "ia32"
1239 | ],
1240 | "dev": true,
1241 | "license": "MIT",
1242 | "optional": true,
1243 | "os": [
1244 | "win32"
1245 | ]
1246 | },
1247 | "node_modules/@rollup/rollup-win32-x64-msvc": {
1248 | "version": "4.24.4",
1249 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz",
1250 | "integrity": "sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==",
1251 | "cpu": [
1252 | "x64"
1253 | ],
1254 | "dev": true,
1255 | "license": "MIT",
1256 | "optional": true,
1257 | "os": [
1258 | "win32"
1259 | ]
1260 | },
1261 | "node_modules/@types/babel__core": {
1262 | "version": "7.20.5",
1263 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1264 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1265 | "dev": true,
1266 | "license": "MIT",
1267 | "dependencies": {
1268 | "@babel/parser": "^7.20.7",
1269 | "@babel/types": "^7.20.7",
1270 | "@types/babel__generator": "*",
1271 | "@types/babel__template": "*",
1272 | "@types/babel__traverse": "*"
1273 | }
1274 | },
1275 | "node_modules/@types/babel__generator": {
1276 | "version": "7.6.8",
1277 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
1278 | "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
1279 | "dev": true,
1280 | "license": "MIT",
1281 | "dependencies": {
1282 | "@babel/types": "^7.0.0"
1283 | }
1284 | },
1285 | "node_modules/@types/babel__template": {
1286 | "version": "7.4.4",
1287 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1288 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1289 | "dev": true,
1290 | "license": "MIT",
1291 | "dependencies": {
1292 | "@babel/parser": "^7.1.0",
1293 | "@babel/types": "^7.0.0"
1294 | }
1295 | },
1296 | "node_modules/@types/babel__traverse": {
1297 | "version": "7.20.6",
1298 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
1299 | "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
1300 | "dev": true,
1301 | "license": "MIT",
1302 | "dependencies": {
1303 | "@babel/types": "^7.20.7"
1304 | }
1305 | },
1306 | "node_modules/@types/estree": {
1307 | "version": "1.0.6",
1308 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
1309 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
1310 | "dev": true,
1311 | "license": "MIT"
1312 | },
1313 | "node_modules/@types/json-schema": {
1314 | "version": "7.0.15",
1315 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
1316 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
1317 | "dev": true,
1318 | "license": "MIT"
1319 | },
1320 | "node_modules/@types/prop-types": {
1321 | "version": "15.7.13",
1322 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz",
1323 | "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==",
1324 | "dev": true,
1325 | "license": "MIT"
1326 | },
1327 | "node_modules/@types/react": {
1328 | "version": "18.3.12",
1329 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz",
1330 | "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==",
1331 | "dev": true,
1332 | "license": "MIT",
1333 | "dependencies": {
1334 | "@types/prop-types": "*",
1335 | "csstype": "^3.0.2"
1336 | }
1337 | },
1338 | "node_modules/@types/react-dom": {
1339 | "version": "18.3.1",
1340 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz",
1341 | "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==",
1342 | "dev": true,
1343 | "license": "MIT",
1344 | "dependencies": {
1345 | "@types/react": "*"
1346 | }
1347 | },
1348 | "node_modules/@typescript-eslint/eslint-plugin": {
1349 | "version": "8.13.0",
1350 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.13.0.tgz",
1351 | "integrity": "sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==",
1352 | "dev": true,
1353 | "license": "MIT",
1354 | "dependencies": {
1355 | "@eslint-community/regexpp": "^4.10.0",
1356 | "@typescript-eslint/scope-manager": "8.13.0",
1357 | "@typescript-eslint/type-utils": "8.13.0",
1358 | "@typescript-eslint/utils": "8.13.0",
1359 | "@typescript-eslint/visitor-keys": "8.13.0",
1360 | "graphemer": "^1.4.0",
1361 | "ignore": "^5.3.1",
1362 | "natural-compare": "^1.4.0",
1363 | "ts-api-utils": "^1.3.0"
1364 | },
1365 | "engines": {
1366 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1367 | },
1368 | "funding": {
1369 | "type": "opencollective",
1370 | "url": "https://opencollective.com/typescript-eslint"
1371 | },
1372 | "peerDependencies": {
1373 | "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
1374 | "eslint": "^8.57.0 || ^9.0.0"
1375 | },
1376 | "peerDependenciesMeta": {
1377 | "typescript": {
1378 | "optional": true
1379 | }
1380 | }
1381 | },
1382 | "node_modules/@typescript-eslint/parser": {
1383 | "version": "8.13.0",
1384 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.13.0.tgz",
1385 | "integrity": "sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==",
1386 | "dev": true,
1387 | "license": "BSD-2-Clause",
1388 | "dependencies": {
1389 | "@typescript-eslint/scope-manager": "8.13.0",
1390 | "@typescript-eslint/types": "8.13.0",
1391 | "@typescript-eslint/typescript-estree": "8.13.0",
1392 | "@typescript-eslint/visitor-keys": "8.13.0",
1393 | "debug": "^4.3.4"
1394 | },
1395 | "engines": {
1396 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1397 | },
1398 | "funding": {
1399 | "type": "opencollective",
1400 | "url": "https://opencollective.com/typescript-eslint"
1401 | },
1402 | "peerDependencies": {
1403 | "eslint": "^8.57.0 || ^9.0.0"
1404 | },
1405 | "peerDependenciesMeta": {
1406 | "typescript": {
1407 | "optional": true
1408 | }
1409 | }
1410 | },
1411 | "node_modules/@typescript-eslint/scope-manager": {
1412 | "version": "8.13.0",
1413 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz",
1414 | "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==",
1415 | "dev": true,
1416 | "license": "MIT",
1417 | "dependencies": {
1418 | "@typescript-eslint/types": "8.13.0",
1419 | "@typescript-eslint/visitor-keys": "8.13.0"
1420 | },
1421 | "engines": {
1422 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1423 | },
1424 | "funding": {
1425 | "type": "opencollective",
1426 | "url": "https://opencollective.com/typescript-eslint"
1427 | }
1428 | },
1429 | "node_modules/@typescript-eslint/type-utils": {
1430 | "version": "8.13.0",
1431 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz",
1432 | "integrity": "sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==",
1433 | "dev": true,
1434 | "license": "MIT",
1435 | "dependencies": {
1436 | "@typescript-eslint/typescript-estree": "8.13.0",
1437 | "@typescript-eslint/utils": "8.13.0",
1438 | "debug": "^4.3.4",
1439 | "ts-api-utils": "^1.3.0"
1440 | },
1441 | "engines": {
1442 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1443 | },
1444 | "funding": {
1445 | "type": "opencollective",
1446 | "url": "https://opencollective.com/typescript-eslint"
1447 | },
1448 | "peerDependenciesMeta": {
1449 | "typescript": {
1450 | "optional": true
1451 | }
1452 | }
1453 | },
1454 | "node_modules/@typescript-eslint/types": {
1455 | "version": "8.13.0",
1456 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz",
1457 | "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==",
1458 | "dev": true,
1459 | "license": "MIT",
1460 | "engines": {
1461 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1462 | },
1463 | "funding": {
1464 | "type": "opencollective",
1465 | "url": "https://opencollective.com/typescript-eslint"
1466 | }
1467 | },
1468 | "node_modules/@typescript-eslint/typescript-estree": {
1469 | "version": "8.13.0",
1470 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz",
1471 | "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==",
1472 | "dev": true,
1473 | "license": "BSD-2-Clause",
1474 | "dependencies": {
1475 | "@typescript-eslint/types": "8.13.0",
1476 | "@typescript-eslint/visitor-keys": "8.13.0",
1477 | "debug": "^4.3.4",
1478 | "fast-glob": "^3.3.2",
1479 | "is-glob": "^4.0.3",
1480 | "minimatch": "^9.0.4",
1481 | "semver": "^7.6.0",
1482 | "ts-api-utils": "^1.3.0"
1483 | },
1484 | "engines": {
1485 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1486 | },
1487 | "funding": {
1488 | "type": "opencollective",
1489 | "url": "https://opencollective.com/typescript-eslint"
1490 | },
1491 | "peerDependenciesMeta": {
1492 | "typescript": {
1493 | "optional": true
1494 | }
1495 | }
1496 | },
1497 | "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
1498 | "version": "2.0.1",
1499 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
1500 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
1501 | "dev": true,
1502 | "license": "MIT",
1503 | "dependencies": {
1504 | "balanced-match": "^1.0.0"
1505 | }
1506 | },
1507 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
1508 | "version": "9.0.5",
1509 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
1510 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
1511 | "dev": true,
1512 | "license": "ISC",
1513 | "dependencies": {
1514 | "brace-expansion": "^2.0.1"
1515 | },
1516 | "engines": {
1517 | "node": ">=16 || 14 >=14.17"
1518 | },
1519 | "funding": {
1520 | "url": "https://github.com/sponsors/isaacs"
1521 | }
1522 | },
1523 | "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
1524 | "version": "7.6.3",
1525 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
1526 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
1527 | "dev": true,
1528 | "license": "ISC",
1529 | "bin": {
1530 | "semver": "bin/semver.js"
1531 | },
1532 | "engines": {
1533 | "node": ">=10"
1534 | }
1535 | },
1536 | "node_modules/@typescript-eslint/utils": {
1537 | "version": "8.13.0",
1538 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.13.0.tgz",
1539 | "integrity": "sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==",
1540 | "dev": true,
1541 | "license": "MIT",
1542 | "dependencies": {
1543 | "@eslint-community/eslint-utils": "^4.4.0",
1544 | "@typescript-eslint/scope-manager": "8.13.0",
1545 | "@typescript-eslint/types": "8.13.0",
1546 | "@typescript-eslint/typescript-estree": "8.13.0"
1547 | },
1548 | "engines": {
1549 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1550 | },
1551 | "funding": {
1552 | "type": "opencollective",
1553 | "url": "https://opencollective.com/typescript-eslint"
1554 | },
1555 | "peerDependencies": {
1556 | "eslint": "^8.57.0 || ^9.0.0"
1557 | }
1558 | },
1559 | "node_modules/@typescript-eslint/visitor-keys": {
1560 | "version": "8.13.0",
1561 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz",
1562 | "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==",
1563 | "dev": true,
1564 | "license": "MIT",
1565 | "dependencies": {
1566 | "@typescript-eslint/types": "8.13.0",
1567 | "eslint-visitor-keys": "^3.4.3"
1568 | },
1569 | "engines": {
1570 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1571 | },
1572 | "funding": {
1573 | "type": "opencollective",
1574 | "url": "https://opencollective.com/typescript-eslint"
1575 | }
1576 | },
1577 | "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
1578 | "version": "3.4.3",
1579 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
1580 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
1581 | "dev": true,
1582 | "license": "Apache-2.0",
1583 | "engines": {
1584 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1585 | },
1586 | "funding": {
1587 | "url": "https://opencollective.com/eslint"
1588 | }
1589 | },
1590 | "node_modules/@vitejs/plugin-react": {
1591 | "version": "4.3.3",
1592 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.3.tgz",
1593 | "integrity": "sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==",
1594 | "dev": true,
1595 | "license": "MIT",
1596 | "dependencies": {
1597 | "@babel/core": "^7.25.2",
1598 | "@babel/plugin-transform-react-jsx-self": "^7.24.7",
1599 | "@babel/plugin-transform-react-jsx-source": "^7.24.7",
1600 | "@types/babel__core": "^7.20.5",
1601 | "react-refresh": "^0.14.2"
1602 | },
1603 | "engines": {
1604 | "node": "^14.18.0 || >=16.0.0"
1605 | },
1606 | "peerDependencies": {
1607 | "vite": "^4.2.0 || ^5.0.0"
1608 | }
1609 | },
1610 | "node_modules/acorn": {
1611 | "version": "8.14.0",
1612 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
1613 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
1614 | "dev": true,
1615 | "license": "MIT",
1616 | "bin": {
1617 | "acorn": "bin/acorn"
1618 | },
1619 | "engines": {
1620 | "node": ">=0.4.0"
1621 | }
1622 | },
1623 | "node_modules/acorn-jsx": {
1624 | "version": "5.3.2",
1625 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
1626 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
1627 | "dev": true,
1628 | "license": "MIT",
1629 | "peerDependencies": {
1630 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
1631 | }
1632 | },
1633 | "node_modules/ajv": {
1634 | "version": "6.12.6",
1635 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1636 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1637 | "dev": true,
1638 | "license": "MIT",
1639 | "dependencies": {
1640 | "fast-deep-equal": "^3.1.1",
1641 | "fast-json-stable-stringify": "^2.0.0",
1642 | "json-schema-traverse": "^0.4.1",
1643 | "uri-js": "^4.2.2"
1644 | },
1645 | "funding": {
1646 | "type": "github",
1647 | "url": "https://github.com/sponsors/epoberezkin"
1648 | }
1649 | },
1650 | "node_modules/ansi-styles": {
1651 | "version": "4.3.0",
1652 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1653 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1654 | "dev": true,
1655 | "license": "MIT",
1656 | "dependencies": {
1657 | "color-convert": "^2.0.1"
1658 | },
1659 | "engines": {
1660 | "node": ">=8"
1661 | },
1662 | "funding": {
1663 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1664 | }
1665 | },
1666 | "node_modules/argparse": {
1667 | "version": "2.0.1",
1668 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1669 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
1670 | "dev": true,
1671 | "license": "Python-2.0"
1672 | },
1673 | "node_modules/balanced-match": {
1674 | "version": "1.0.2",
1675 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1676 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1677 | "dev": true,
1678 | "license": "MIT"
1679 | },
1680 | "node_modules/brace-expansion": {
1681 | "version": "1.1.11",
1682 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1683 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1684 | "dev": true,
1685 | "license": "MIT",
1686 | "dependencies": {
1687 | "balanced-match": "^1.0.0",
1688 | "concat-map": "0.0.1"
1689 | }
1690 | },
1691 | "node_modules/braces": {
1692 | "version": "3.0.3",
1693 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
1694 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
1695 | "dev": true,
1696 | "license": "MIT",
1697 | "dependencies": {
1698 | "fill-range": "^7.1.1"
1699 | },
1700 | "engines": {
1701 | "node": ">=8"
1702 | }
1703 | },
1704 | "node_modules/browserslist": {
1705 | "version": "4.24.2",
1706 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
1707 | "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
1708 | "dev": true,
1709 | "funding": [
1710 | {
1711 | "type": "opencollective",
1712 | "url": "https://opencollective.com/browserslist"
1713 | },
1714 | {
1715 | "type": "tidelift",
1716 | "url": "https://tidelift.com/funding/github/npm/browserslist"
1717 | },
1718 | {
1719 | "type": "github",
1720 | "url": "https://github.com/sponsors/ai"
1721 | }
1722 | ],
1723 | "license": "MIT",
1724 | "dependencies": {
1725 | "caniuse-lite": "^1.0.30001669",
1726 | "electron-to-chromium": "^1.5.41",
1727 | "node-releases": "^2.0.18",
1728 | "update-browserslist-db": "^1.1.1"
1729 | },
1730 | "bin": {
1731 | "browserslist": "cli.js"
1732 | },
1733 | "engines": {
1734 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1735 | }
1736 | },
1737 | "node_modules/callsites": {
1738 | "version": "3.1.0",
1739 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
1740 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
1741 | "dev": true,
1742 | "license": "MIT",
1743 | "engines": {
1744 | "node": ">=6"
1745 | }
1746 | },
1747 | "node_modules/caniuse-lite": {
1748 | "version": "1.0.30001679",
1749 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001679.tgz",
1750 | "integrity": "sha512-j2YqID/YwpLnKzCmBOS4tlZdWprXm3ZmQLBH9ZBXFOhoxLA46fwyBvx6toCBWBmnuwUY/qB3kEU6gFx8qgCroA==",
1751 | "dev": true,
1752 | "funding": [
1753 | {
1754 | "type": "opencollective",
1755 | "url": "https://opencollective.com/browserslist"
1756 | },
1757 | {
1758 | "type": "tidelift",
1759 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1760 | },
1761 | {
1762 | "type": "github",
1763 | "url": "https://github.com/sponsors/ai"
1764 | }
1765 | ],
1766 | "license": "CC-BY-4.0"
1767 | },
1768 | "node_modules/chalk": {
1769 | "version": "4.1.2",
1770 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
1771 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
1772 | "dev": true,
1773 | "license": "MIT",
1774 | "dependencies": {
1775 | "ansi-styles": "^4.1.0",
1776 | "supports-color": "^7.1.0"
1777 | },
1778 | "engines": {
1779 | "node": ">=10"
1780 | },
1781 | "funding": {
1782 | "url": "https://github.com/chalk/chalk?sponsor=1"
1783 | }
1784 | },
1785 | "node_modules/color-convert": {
1786 | "version": "2.0.1",
1787 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1788 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1789 | "dev": true,
1790 | "license": "MIT",
1791 | "dependencies": {
1792 | "color-name": "~1.1.4"
1793 | },
1794 | "engines": {
1795 | "node": ">=7.0.0"
1796 | }
1797 | },
1798 | "node_modules/color-name": {
1799 | "version": "1.1.4",
1800 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1801 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1802 | "dev": true,
1803 | "license": "MIT"
1804 | },
1805 | "node_modules/concat-map": {
1806 | "version": "0.0.1",
1807 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1808 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1809 | "dev": true,
1810 | "license": "MIT"
1811 | },
1812 | "node_modules/convert-source-map": {
1813 | "version": "2.0.0",
1814 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1815 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1816 | "dev": true,
1817 | "license": "MIT"
1818 | },
1819 | "node_modules/cross-spawn": {
1820 | "version": "7.0.5",
1821 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
1822 | "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
1823 | "dev": true,
1824 | "license": "MIT",
1825 | "dependencies": {
1826 | "path-key": "^3.1.0",
1827 | "shebang-command": "^2.0.0",
1828 | "which": "^2.0.1"
1829 | },
1830 | "engines": {
1831 | "node": ">= 8"
1832 | }
1833 | },
1834 | "node_modules/csstype": {
1835 | "version": "3.1.3",
1836 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1837 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
1838 | "dev": true,
1839 | "license": "MIT"
1840 | },
1841 | "node_modules/debug": {
1842 | "version": "4.3.7",
1843 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
1844 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
1845 | "dev": true,
1846 | "license": "MIT",
1847 | "dependencies": {
1848 | "ms": "^2.1.3"
1849 | },
1850 | "engines": {
1851 | "node": ">=6.0"
1852 | },
1853 | "peerDependenciesMeta": {
1854 | "supports-color": {
1855 | "optional": true
1856 | }
1857 | }
1858 | },
1859 | "node_modules/deep-is": {
1860 | "version": "0.1.4",
1861 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
1862 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
1863 | "dev": true,
1864 | "license": "MIT"
1865 | },
1866 | "node_modules/electron-to-chromium": {
1867 | "version": "1.5.55",
1868 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.55.tgz",
1869 | "integrity": "sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==",
1870 | "dev": true,
1871 | "license": "ISC"
1872 | },
1873 | "node_modules/esbuild": {
1874 | "version": "0.21.5",
1875 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
1876 | "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
1877 | "dev": true,
1878 | "hasInstallScript": true,
1879 | "license": "MIT",
1880 | "bin": {
1881 | "esbuild": "bin/esbuild"
1882 | },
1883 | "engines": {
1884 | "node": ">=12"
1885 | },
1886 | "optionalDependencies": {
1887 | "@esbuild/aix-ppc64": "0.21.5",
1888 | "@esbuild/android-arm": "0.21.5",
1889 | "@esbuild/android-arm64": "0.21.5",
1890 | "@esbuild/android-x64": "0.21.5",
1891 | "@esbuild/darwin-arm64": "0.21.5",
1892 | "@esbuild/darwin-x64": "0.21.5",
1893 | "@esbuild/freebsd-arm64": "0.21.5",
1894 | "@esbuild/freebsd-x64": "0.21.5",
1895 | "@esbuild/linux-arm": "0.21.5",
1896 | "@esbuild/linux-arm64": "0.21.5",
1897 | "@esbuild/linux-ia32": "0.21.5",
1898 | "@esbuild/linux-loong64": "0.21.5",
1899 | "@esbuild/linux-mips64el": "0.21.5",
1900 | "@esbuild/linux-ppc64": "0.21.5",
1901 | "@esbuild/linux-riscv64": "0.21.5",
1902 | "@esbuild/linux-s390x": "0.21.5",
1903 | "@esbuild/linux-x64": "0.21.5",
1904 | "@esbuild/netbsd-x64": "0.21.5",
1905 | "@esbuild/openbsd-x64": "0.21.5",
1906 | "@esbuild/sunos-x64": "0.21.5",
1907 | "@esbuild/win32-arm64": "0.21.5",
1908 | "@esbuild/win32-ia32": "0.21.5",
1909 | "@esbuild/win32-x64": "0.21.5"
1910 | }
1911 | },
1912 | "node_modules/escalade": {
1913 | "version": "3.2.0",
1914 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1915 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1916 | "dev": true,
1917 | "license": "MIT",
1918 | "engines": {
1919 | "node": ">=6"
1920 | }
1921 | },
1922 | "node_modules/escape-string-regexp": {
1923 | "version": "4.0.0",
1924 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1925 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1926 | "dev": true,
1927 | "license": "MIT",
1928 | "engines": {
1929 | "node": ">=10"
1930 | },
1931 | "funding": {
1932 | "url": "https://github.com/sponsors/sindresorhus"
1933 | }
1934 | },
1935 | "node_modules/eslint": {
1936 | "version": "9.14.0",
1937 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz",
1938 | "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==",
1939 | "dev": true,
1940 | "license": "MIT",
1941 | "dependencies": {
1942 | "@eslint-community/eslint-utils": "^4.2.0",
1943 | "@eslint-community/regexpp": "^4.12.1",
1944 | "@eslint/config-array": "^0.18.0",
1945 | "@eslint/core": "^0.7.0",
1946 | "@eslint/eslintrc": "^3.1.0",
1947 | "@eslint/js": "9.14.0",
1948 | "@eslint/plugin-kit": "^0.2.0",
1949 | "@humanfs/node": "^0.16.6",
1950 | "@humanwhocodes/module-importer": "^1.0.1",
1951 | "@humanwhocodes/retry": "^0.4.0",
1952 | "@types/estree": "^1.0.6",
1953 | "@types/json-schema": "^7.0.15",
1954 | "ajv": "^6.12.4",
1955 | "chalk": "^4.0.0",
1956 | "cross-spawn": "^7.0.2",
1957 | "debug": "^4.3.2",
1958 | "escape-string-regexp": "^4.0.0",
1959 | "eslint-scope": "^8.2.0",
1960 | "eslint-visitor-keys": "^4.2.0",
1961 | "espree": "^10.3.0",
1962 | "esquery": "^1.5.0",
1963 | "esutils": "^2.0.2",
1964 | "fast-deep-equal": "^3.1.3",
1965 | "file-entry-cache": "^8.0.0",
1966 | "find-up": "^5.0.0",
1967 | "glob-parent": "^6.0.2",
1968 | "ignore": "^5.2.0",
1969 | "imurmurhash": "^0.1.4",
1970 | "is-glob": "^4.0.0",
1971 | "json-stable-stringify-without-jsonify": "^1.0.1",
1972 | "lodash.merge": "^4.6.2",
1973 | "minimatch": "^3.1.2",
1974 | "natural-compare": "^1.4.0",
1975 | "optionator": "^0.9.3",
1976 | "text-table": "^0.2.0"
1977 | },
1978 | "bin": {
1979 | "eslint": "bin/eslint.js"
1980 | },
1981 | "engines": {
1982 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1983 | },
1984 | "funding": {
1985 | "url": "https://eslint.org/donate"
1986 | },
1987 | "peerDependencies": {
1988 | "jiti": "*"
1989 | },
1990 | "peerDependenciesMeta": {
1991 | "jiti": {
1992 | "optional": true
1993 | }
1994 | }
1995 | },
1996 | "node_modules/eslint-plugin-react-hooks": {
1997 | "version": "5.0.0",
1998 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz",
1999 | "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==",
2000 | "dev": true,
2001 | "license": "MIT",
2002 | "engines": {
2003 | "node": ">=10"
2004 | },
2005 | "peerDependencies": {
2006 | "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
2007 | }
2008 | },
2009 | "node_modules/eslint-plugin-react-refresh": {
2010 | "version": "0.4.14",
2011 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.14.tgz",
2012 | "integrity": "sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA==",
2013 | "dev": true,
2014 | "license": "MIT",
2015 | "peerDependencies": {
2016 | "eslint": ">=7"
2017 | }
2018 | },
2019 | "node_modules/eslint-scope": {
2020 | "version": "8.2.0",
2021 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
2022 | "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
2023 | "dev": true,
2024 | "license": "BSD-2-Clause",
2025 | "dependencies": {
2026 | "esrecurse": "^4.3.0",
2027 | "estraverse": "^5.2.0"
2028 | },
2029 | "engines": {
2030 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2031 | },
2032 | "funding": {
2033 | "url": "https://opencollective.com/eslint"
2034 | }
2035 | },
2036 | "node_modules/eslint-visitor-keys": {
2037 | "version": "4.2.0",
2038 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
2039 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
2040 | "dev": true,
2041 | "license": "Apache-2.0",
2042 | "engines": {
2043 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2044 | },
2045 | "funding": {
2046 | "url": "https://opencollective.com/eslint"
2047 | }
2048 | },
2049 | "node_modules/espree": {
2050 | "version": "10.3.0",
2051 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
2052 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
2053 | "dev": true,
2054 | "license": "BSD-2-Clause",
2055 | "dependencies": {
2056 | "acorn": "^8.14.0",
2057 | "acorn-jsx": "^5.3.2",
2058 | "eslint-visitor-keys": "^4.2.0"
2059 | },
2060 | "engines": {
2061 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2062 | },
2063 | "funding": {
2064 | "url": "https://opencollective.com/eslint"
2065 | }
2066 | },
2067 | "node_modules/esquery": {
2068 | "version": "1.6.0",
2069 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
2070 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
2071 | "dev": true,
2072 | "license": "BSD-3-Clause",
2073 | "dependencies": {
2074 | "estraverse": "^5.1.0"
2075 | },
2076 | "engines": {
2077 | "node": ">=0.10"
2078 | }
2079 | },
2080 | "node_modules/esrecurse": {
2081 | "version": "4.3.0",
2082 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
2083 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
2084 | "dev": true,
2085 | "license": "BSD-2-Clause",
2086 | "dependencies": {
2087 | "estraverse": "^5.2.0"
2088 | },
2089 | "engines": {
2090 | "node": ">=4.0"
2091 | }
2092 | },
2093 | "node_modules/estraverse": {
2094 | "version": "5.3.0",
2095 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
2096 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
2097 | "dev": true,
2098 | "license": "BSD-2-Clause",
2099 | "engines": {
2100 | "node": ">=4.0"
2101 | }
2102 | },
2103 | "node_modules/esutils": {
2104 | "version": "2.0.3",
2105 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
2106 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
2107 | "dev": true,
2108 | "license": "BSD-2-Clause",
2109 | "engines": {
2110 | "node": ">=0.10.0"
2111 | }
2112 | },
2113 | "node_modules/fast-deep-equal": {
2114 | "version": "3.1.3",
2115 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
2116 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
2117 | "dev": true,
2118 | "license": "MIT"
2119 | },
2120 | "node_modules/fast-glob": {
2121 | "version": "3.3.2",
2122 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
2123 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
2124 | "dev": true,
2125 | "license": "MIT",
2126 | "dependencies": {
2127 | "@nodelib/fs.stat": "^2.0.2",
2128 | "@nodelib/fs.walk": "^1.2.3",
2129 | "glob-parent": "^5.1.2",
2130 | "merge2": "^1.3.0",
2131 | "micromatch": "^4.0.4"
2132 | },
2133 | "engines": {
2134 | "node": ">=8.6.0"
2135 | }
2136 | },
2137 | "node_modules/fast-glob/node_modules/glob-parent": {
2138 | "version": "5.1.2",
2139 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
2140 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
2141 | "dev": true,
2142 | "license": "ISC",
2143 | "dependencies": {
2144 | "is-glob": "^4.0.1"
2145 | },
2146 | "engines": {
2147 | "node": ">= 6"
2148 | }
2149 | },
2150 | "node_modules/fast-json-stable-stringify": {
2151 | "version": "2.1.0",
2152 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
2153 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
2154 | "dev": true,
2155 | "license": "MIT"
2156 | },
2157 | "node_modules/fast-levenshtein": {
2158 | "version": "2.0.6",
2159 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
2160 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
2161 | "dev": true,
2162 | "license": "MIT"
2163 | },
2164 | "node_modules/fastq": {
2165 | "version": "1.17.1",
2166 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
2167 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
2168 | "dev": true,
2169 | "license": "ISC",
2170 | "dependencies": {
2171 | "reusify": "^1.0.4"
2172 | }
2173 | },
2174 | "node_modules/file-entry-cache": {
2175 | "version": "8.0.0",
2176 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
2177 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
2178 | "dev": true,
2179 | "license": "MIT",
2180 | "dependencies": {
2181 | "flat-cache": "^4.0.0"
2182 | },
2183 | "engines": {
2184 | "node": ">=16.0.0"
2185 | }
2186 | },
2187 | "node_modules/fill-range": {
2188 | "version": "7.1.1",
2189 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
2190 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
2191 | "dev": true,
2192 | "license": "MIT",
2193 | "dependencies": {
2194 | "to-regex-range": "^5.0.1"
2195 | },
2196 | "engines": {
2197 | "node": ">=8"
2198 | }
2199 | },
2200 | "node_modules/find-up": {
2201 | "version": "5.0.0",
2202 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
2203 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
2204 | "dev": true,
2205 | "license": "MIT",
2206 | "dependencies": {
2207 | "locate-path": "^6.0.0",
2208 | "path-exists": "^4.0.0"
2209 | },
2210 | "engines": {
2211 | "node": ">=10"
2212 | },
2213 | "funding": {
2214 | "url": "https://github.com/sponsors/sindresorhus"
2215 | }
2216 | },
2217 | "node_modules/flat-cache": {
2218 | "version": "4.0.1",
2219 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
2220 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
2221 | "dev": true,
2222 | "license": "MIT",
2223 | "dependencies": {
2224 | "flatted": "^3.2.9",
2225 | "keyv": "^4.5.4"
2226 | },
2227 | "engines": {
2228 | "node": ">=16"
2229 | }
2230 | },
2231 | "node_modules/flatted": {
2232 | "version": "3.3.1",
2233 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
2234 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
2235 | "dev": true,
2236 | "license": "ISC"
2237 | },
2238 | "node_modules/fsevents": {
2239 | "version": "2.3.3",
2240 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
2241 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
2242 | "dev": true,
2243 | "hasInstallScript": true,
2244 | "license": "MIT",
2245 | "optional": true,
2246 | "os": [
2247 | "darwin"
2248 | ],
2249 | "engines": {
2250 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
2251 | }
2252 | },
2253 | "node_modules/gensync": {
2254 | "version": "1.0.0-beta.2",
2255 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
2256 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
2257 | "dev": true,
2258 | "license": "MIT",
2259 | "engines": {
2260 | "node": ">=6.9.0"
2261 | }
2262 | },
2263 | "node_modules/glob-parent": {
2264 | "version": "6.0.2",
2265 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
2266 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
2267 | "dev": true,
2268 | "license": "ISC",
2269 | "dependencies": {
2270 | "is-glob": "^4.0.3"
2271 | },
2272 | "engines": {
2273 | "node": ">=10.13.0"
2274 | }
2275 | },
2276 | "node_modules/globals": {
2277 | "version": "15.12.0",
2278 | "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz",
2279 | "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==",
2280 | "dev": true,
2281 | "license": "MIT",
2282 | "engines": {
2283 | "node": ">=18"
2284 | },
2285 | "funding": {
2286 | "url": "https://github.com/sponsors/sindresorhus"
2287 | }
2288 | },
2289 | "node_modules/graphemer": {
2290 | "version": "1.4.0",
2291 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
2292 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
2293 | "dev": true,
2294 | "license": "MIT"
2295 | },
2296 | "node_modules/has-flag": {
2297 | "version": "4.0.0",
2298 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2299 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2300 | "dev": true,
2301 | "license": "MIT",
2302 | "engines": {
2303 | "node": ">=8"
2304 | }
2305 | },
2306 | "node_modules/ignore": {
2307 | "version": "5.3.2",
2308 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
2309 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
2310 | "dev": true,
2311 | "license": "MIT",
2312 | "engines": {
2313 | "node": ">= 4"
2314 | }
2315 | },
2316 | "node_modules/import-fresh": {
2317 | "version": "3.3.0",
2318 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
2319 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
2320 | "dev": true,
2321 | "license": "MIT",
2322 | "dependencies": {
2323 | "parent-module": "^1.0.0",
2324 | "resolve-from": "^4.0.0"
2325 | },
2326 | "engines": {
2327 | "node": ">=6"
2328 | },
2329 | "funding": {
2330 | "url": "https://github.com/sponsors/sindresorhus"
2331 | }
2332 | },
2333 | "node_modules/imurmurhash": {
2334 | "version": "0.1.4",
2335 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2336 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
2337 | "dev": true,
2338 | "license": "MIT",
2339 | "engines": {
2340 | "node": ">=0.8.19"
2341 | }
2342 | },
2343 | "node_modules/is-extglob": {
2344 | "version": "2.1.1",
2345 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
2346 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
2347 | "dev": true,
2348 | "license": "MIT",
2349 | "engines": {
2350 | "node": ">=0.10.0"
2351 | }
2352 | },
2353 | "node_modules/is-glob": {
2354 | "version": "4.0.3",
2355 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
2356 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
2357 | "dev": true,
2358 | "license": "MIT",
2359 | "dependencies": {
2360 | "is-extglob": "^2.1.1"
2361 | },
2362 | "engines": {
2363 | "node": ">=0.10.0"
2364 | }
2365 | },
2366 | "node_modules/is-number": {
2367 | "version": "7.0.0",
2368 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
2369 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
2370 | "dev": true,
2371 | "license": "MIT",
2372 | "engines": {
2373 | "node": ">=0.12.0"
2374 | }
2375 | },
2376 | "node_modules/isexe": {
2377 | "version": "2.0.0",
2378 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2379 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
2380 | "dev": true,
2381 | "license": "ISC"
2382 | },
2383 | "node_modules/js-tokens": {
2384 | "version": "4.0.0",
2385 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
2386 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
2387 | "license": "MIT"
2388 | },
2389 | "node_modules/js-yaml": {
2390 | "version": "4.1.0",
2391 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
2392 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
2393 | "dev": true,
2394 | "license": "MIT",
2395 | "dependencies": {
2396 | "argparse": "^2.0.1"
2397 | },
2398 | "bin": {
2399 | "js-yaml": "bin/js-yaml.js"
2400 | }
2401 | },
2402 | "node_modules/jsesc": {
2403 | "version": "3.0.2",
2404 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
2405 | "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
2406 | "dev": true,
2407 | "license": "MIT",
2408 | "bin": {
2409 | "jsesc": "bin/jsesc"
2410 | },
2411 | "engines": {
2412 | "node": ">=6"
2413 | }
2414 | },
2415 | "node_modules/json-buffer": {
2416 | "version": "3.0.1",
2417 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
2418 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
2419 | "dev": true,
2420 | "license": "MIT"
2421 | },
2422 | "node_modules/json-schema-traverse": {
2423 | "version": "0.4.1",
2424 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2425 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2426 | "dev": true,
2427 | "license": "MIT"
2428 | },
2429 | "node_modules/json-stable-stringify-without-jsonify": {
2430 | "version": "1.0.1",
2431 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
2432 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
2433 | "dev": true,
2434 | "license": "MIT"
2435 | },
2436 | "node_modules/json5": {
2437 | "version": "2.2.3",
2438 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
2439 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
2440 | "dev": true,
2441 | "license": "MIT",
2442 | "bin": {
2443 | "json5": "lib/cli.js"
2444 | },
2445 | "engines": {
2446 | "node": ">=6"
2447 | }
2448 | },
2449 | "node_modules/keyv": {
2450 | "version": "4.5.4",
2451 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
2452 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
2453 | "dev": true,
2454 | "license": "MIT",
2455 | "dependencies": {
2456 | "json-buffer": "3.0.1"
2457 | }
2458 | },
2459 | "node_modules/levn": {
2460 | "version": "0.4.1",
2461 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
2462 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
2463 | "dev": true,
2464 | "license": "MIT",
2465 | "dependencies": {
2466 | "prelude-ls": "^1.2.1",
2467 | "type-check": "~0.4.0"
2468 | },
2469 | "engines": {
2470 | "node": ">= 0.8.0"
2471 | }
2472 | },
2473 | "node_modules/locate-path": {
2474 | "version": "6.0.0",
2475 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
2476 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
2477 | "dev": true,
2478 | "license": "MIT",
2479 | "dependencies": {
2480 | "p-locate": "^5.0.0"
2481 | },
2482 | "engines": {
2483 | "node": ">=10"
2484 | },
2485 | "funding": {
2486 | "url": "https://github.com/sponsors/sindresorhus"
2487 | }
2488 | },
2489 | "node_modules/lodash.merge": {
2490 | "version": "4.6.2",
2491 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
2492 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
2493 | "dev": true,
2494 | "license": "MIT"
2495 | },
2496 | "node_modules/loose-envify": {
2497 | "version": "1.4.0",
2498 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
2499 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
2500 | "license": "MIT",
2501 | "dependencies": {
2502 | "js-tokens": "^3.0.0 || ^4.0.0"
2503 | },
2504 | "bin": {
2505 | "loose-envify": "cli.js"
2506 | }
2507 | },
2508 | "node_modules/lru-cache": {
2509 | "version": "5.1.1",
2510 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
2511 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
2512 | "dev": true,
2513 | "license": "ISC",
2514 | "dependencies": {
2515 | "yallist": "^3.0.2"
2516 | }
2517 | },
2518 | "node_modules/merge2": {
2519 | "version": "1.4.1",
2520 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
2521 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
2522 | "dev": true,
2523 | "license": "MIT",
2524 | "engines": {
2525 | "node": ">= 8"
2526 | }
2527 | },
2528 | "node_modules/micromatch": {
2529 | "version": "4.0.8",
2530 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
2531 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
2532 | "dev": true,
2533 | "license": "MIT",
2534 | "dependencies": {
2535 | "braces": "^3.0.3",
2536 | "picomatch": "^2.3.1"
2537 | },
2538 | "engines": {
2539 | "node": ">=8.6"
2540 | }
2541 | },
2542 | "node_modules/minimatch": {
2543 | "version": "3.1.2",
2544 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
2545 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
2546 | "dev": true,
2547 | "license": "ISC",
2548 | "dependencies": {
2549 | "brace-expansion": "^1.1.7"
2550 | },
2551 | "engines": {
2552 | "node": "*"
2553 | }
2554 | },
2555 | "node_modules/ms": {
2556 | "version": "2.1.3",
2557 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2558 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2559 | "dev": true,
2560 | "license": "MIT"
2561 | },
2562 | "node_modules/nanoid": {
2563 | "version": "3.3.7",
2564 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
2565 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
2566 | "dev": true,
2567 | "funding": [
2568 | {
2569 | "type": "github",
2570 | "url": "https://github.com/sponsors/ai"
2571 | }
2572 | ],
2573 | "license": "MIT",
2574 | "bin": {
2575 | "nanoid": "bin/nanoid.cjs"
2576 | },
2577 | "engines": {
2578 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2579 | }
2580 | },
2581 | "node_modules/natural-compare": {
2582 | "version": "1.4.0",
2583 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2584 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
2585 | "dev": true,
2586 | "license": "MIT"
2587 | },
2588 | "node_modules/node-releases": {
2589 | "version": "2.0.18",
2590 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
2591 | "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
2592 | "dev": true,
2593 | "license": "MIT"
2594 | },
2595 | "node_modules/optionator": {
2596 | "version": "0.9.4",
2597 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
2598 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
2599 | "dev": true,
2600 | "license": "MIT",
2601 | "dependencies": {
2602 | "deep-is": "^0.1.3",
2603 | "fast-levenshtein": "^2.0.6",
2604 | "levn": "^0.4.1",
2605 | "prelude-ls": "^1.2.1",
2606 | "type-check": "^0.4.0",
2607 | "word-wrap": "^1.2.5"
2608 | },
2609 | "engines": {
2610 | "node": ">= 0.8.0"
2611 | }
2612 | },
2613 | "node_modules/p-limit": {
2614 | "version": "3.1.0",
2615 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
2616 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
2617 | "dev": true,
2618 | "license": "MIT",
2619 | "dependencies": {
2620 | "yocto-queue": "^0.1.0"
2621 | },
2622 | "engines": {
2623 | "node": ">=10"
2624 | },
2625 | "funding": {
2626 | "url": "https://github.com/sponsors/sindresorhus"
2627 | }
2628 | },
2629 | "node_modules/p-locate": {
2630 | "version": "5.0.0",
2631 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
2632 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
2633 | "dev": true,
2634 | "license": "MIT",
2635 | "dependencies": {
2636 | "p-limit": "^3.0.2"
2637 | },
2638 | "engines": {
2639 | "node": ">=10"
2640 | },
2641 | "funding": {
2642 | "url": "https://github.com/sponsors/sindresorhus"
2643 | }
2644 | },
2645 | "node_modules/parent-module": {
2646 | "version": "1.0.1",
2647 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2648 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2649 | "dev": true,
2650 | "license": "MIT",
2651 | "dependencies": {
2652 | "callsites": "^3.0.0"
2653 | },
2654 | "engines": {
2655 | "node": ">=6"
2656 | }
2657 | },
2658 | "node_modules/path-exists": {
2659 | "version": "4.0.0",
2660 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2661 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2662 | "dev": true,
2663 | "license": "MIT",
2664 | "engines": {
2665 | "node": ">=8"
2666 | }
2667 | },
2668 | "node_modules/path-key": {
2669 | "version": "3.1.1",
2670 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2671 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2672 | "dev": true,
2673 | "license": "MIT",
2674 | "engines": {
2675 | "node": ">=8"
2676 | }
2677 | },
2678 | "node_modules/picocolors": {
2679 | "version": "1.1.1",
2680 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2681 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2682 | "dev": true,
2683 | "license": "ISC"
2684 | },
2685 | "node_modules/picomatch": {
2686 | "version": "2.3.1",
2687 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2688 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2689 | "dev": true,
2690 | "license": "MIT",
2691 | "engines": {
2692 | "node": ">=8.6"
2693 | },
2694 | "funding": {
2695 | "url": "https://github.com/sponsors/jonschlinkert"
2696 | }
2697 | },
2698 | "node_modules/postcss": {
2699 | "version": "8.4.47",
2700 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
2701 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
2702 | "dev": true,
2703 | "funding": [
2704 | {
2705 | "type": "opencollective",
2706 | "url": "https://opencollective.com/postcss/"
2707 | },
2708 | {
2709 | "type": "tidelift",
2710 | "url": "https://tidelift.com/funding/github/npm/postcss"
2711 | },
2712 | {
2713 | "type": "github",
2714 | "url": "https://github.com/sponsors/ai"
2715 | }
2716 | ],
2717 | "license": "MIT",
2718 | "dependencies": {
2719 | "nanoid": "^3.3.7",
2720 | "picocolors": "^1.1.0",
2721 | "source-map-js": "^1.2.1"
2722 | },
2723 | "engines": {
2724 | "node": "^10 || ^12 || >=14"
2725 | }
2726 | },
2727 | "node_modules/prelude-ls": {
2728 | "version": "1.2.1",
2729 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
2730 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
2731 | "dev": true,
2732 | "license": "MIT",
2733 | "engines": {
2734 | "node": ">= 0.8.0"
2735 | }
2736 | },
2737 | "node_modules/punycode": {
2738 | "version": "2.3.1",
2739 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
2740 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
2741 | "dev": true,
2742 | "license": "MIT",
2743 | "engines": {
2744 | "node": ">=6"
2745 | }
2746 | },
2747 | "node_modules/queue-microtask": {
2748 | "version": "1.2.3",
2749 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2750 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2751 | "dev": true,
2752 | "funding": [
2753 | {
2754 | "type": "github",
2755 | "url": "https://github.com/sponsors/feross"
2756 | },
2757 | {
2758 | "type": "patreon",
2759 | "url": "https://www.patreon.com/feross"
2760 | },
2761 | {
2762 | "type": "consulting",
2763 | "url": "https://feross.org/support"
2764 | }
2765 | ],
2766 | "license": "MIT"
2767 | },
2768 | "node_modules/react": {
2769 | "version": "18.3.1",
2770 | "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
2771 | "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
2772 | "license": "MIT",
2773 | "dependencies": {
2774 | "loose-envify": "^1.1.0"
2775 | },
2776 | "engines": {
2777 | "node": ">=0.10.0"
2778 | }
2779 | },
2780 | "node_modules/react-dom": {
2781 | "version": "18.3.1",
2782 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
2783 | "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
2784 | "license": "MIT",
2785 | "dependencies": {
2786 | "loose-envify": "^1.1.0",
2787 | "scheduler": "^0.23.2"
2788 | },
2789 | "peerDependencies": {
2790 | "react": "^18.3.1"
2791 | }
2792 | },
2793 | "node_modules/react-refresh": {
2794 | "version": "0.14.2",
2795 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
2796 | "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
2797 | "dev": true,
2798 | "license": "MIT",
2799 | "engines": {
2800 | "node": ">=0.10.0"
2801 | }
2802 | },
2803 | "node_modules/resolve-from": {
2804 | "version": "4.0.0",
2805 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2806 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2807 | "dev": true,
2808 | "license": "MIT",
2809 | "engines": {
2810 | "node": ">=4"
2811 | }
2812 | },
2813 | "node_modules/reusify": {
2814 | "version": "1.0.4",
2815 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
2816 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
2817 | "dev": true,
2818 | "license": "MIT",
2819 | "engines": {
2820 | "iojs": ">=1.0.0",
2821 | "node": ">=0.10.0"
2822 | }
2823 | },
2824 | "node_modules/rollup": {
2825 | "version": "4.24.4",
2826 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.4.tgz",
2827 | "integrity": "sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==",
2828 | "dev": true,
2829 | "license": "MIT",
2830 | "dependencies": {
2831 | "@types/estree": "1.0.6"
2832 | },
2833 | "bin": {
2834 | "rollup": "dist/bin/rollup"
2835 | },
2836 | "engines": {
2837 | "node": ">=18.0.0",
2838 | "npm": ">=8.0.0"
2839 | },
2840 | "optionalDependencies": {
2841 | "@rollup/rollup-android-arm-eabi": "4.24.4",
2842 | "@rollup/rollup-android-arm64": "4.24.4",
2843 | "@rollup/rollup-darwin-arm64": "4.24.4",
2844 | "@rollup/rollup-darwin-x64": "4.24.4",
2845 | "@rollup/rollup-freebsd-arm64": "4.24.4",
2846 | "@rollup/rollup-freebsd-x64": "4.24.4",
2847 | "@rollup/rollup-linux-arm-gnueabihf": "4.24.4",
2848 | "@rollup/rollup-linux-arm-musleabihf": "4.24.4",
2849 | "@rollup/rollup-linux-arm64-gnu": "4.24.4",
2850 | "@rollup/rollup-linux-arm64-musl": "4.24.4",
2851 | "@rollup/rollup-linux-powerpc64le-gnu": "4.24.4",
2852 | "@rollup/rollup-linux-riscv64-gnu": "4.24.4",
2853 | "@rollup/rollup-linux-s390x-gnu": "4.24.4",
2854 | "@rollup/rollup-linux-x64-gnu": "4.24.4",
2855 | "@rollup/rollup-linux-x64-musl": "4.24.4",
2856 | "@rollup/rollup-win32-arm64-msvc": "4.24.4",
2857 | "@rollup/rollup-win32-ia32-msvc": "4.24.4",
2858 | "@rollup/rollup-win32-x64-msvc": "4.24.4",
2859 | "fsevents": "~2.3.2"
2860 | }
2861 | },
2862 | "node_modules/run-parallel": {
2863 | "version": "1.2.0",
2864 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2865 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2866 | "dev": true,
2867 | "funding": [
2868 | {
2869 | "type": "github",
2870 | "url": "https://github.com/sponsors/feross"
2871 | },
2872 | {
2873 | "type": "patreon",
2874 | "url": "https://www.patreon.com/feross"
2875 | },
2876 | {
2877 | "type": "consulting",
2878 | "url": "https://feross.org/support"
2879 | }
2880 | ],
2881 | "license": "MIT",
2882 | "dependencies": {
2883 | "queue-microtask": "^1.2.2"
2884 | }
2885 | },
2886 | "node_modules/scheduler": {
2887 | "version": "0.23.2",
2888 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
2889 | "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
2890 | "license": "MIT",
2891 | "dependencies": {
2892 | "loose-envify": "^1.1.0"
2893 | }
2894 | },
2895 | "node_modules/semver": {
2896 | "version": "6.3.1",
2897 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
2898 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
2899 | "dev": true,
2900 | "license": "ISC",
2901 | "bin": {
2902 | "semver": "bin/semver.js"
2903 | }
2904 | },
2905 | "node_modules/shebang-command": {
2906 | "version": "2.0.0",
2907 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2908 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2909 | "dev": true,
2910 | "license": "MIT",
2911 | "dependencies": {
2912 | "shebang-regex": "^3.0.0"
2913 | },
2914 | "engines": {
2915 | "node": ">=8"
2916 | }
2917 | },
2918 | "node_modules/shebang-regex": {
2919 | "version": "3.0.0",
2920 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2921 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2922 | "dev": true,
2923 | "license": "MIT",
2924 | "engines": {
2925 | "node": ">=8"
2926 | }
2927 | },
2928 | "node_modules/source-map-js": {
2929 | "version": "1.2.1",
2930 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2931 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2932 | "dev": true,
2933 | "license": "BSD-3-Clause",
2934 | "engines": {
2935 | "node": ">=0.10.0"
2936 | }
2937 | },
2938 | "node_modules/strip-json-comments": {
2939 | "version": "3.1.1",
2940 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2941 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2942 | "dev": true,
2943 | "license": "MIT",
2944 | "engines": {
2945 | "node": ">=8"
2946 | },
2947 | "funding": {
2948 | "url": "https://github.com/sponsors/sindresorhus"
2949 | }
2950 | },
2951 | "node_modules/supports-color": {
2952 | "version": "7.2.0",
2953 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2954 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2955 | "dev": true,
2956 | "license": "MIT",
2957 | "dependencies": {
2958 | "has-flag": "^4.0.0"
2959 | },
2960 | "engines": {
2961 | "node": ">=8"
2962 | }
2963 | },
2964 | "node_modules/text-table": {
2965 | "version": "0.2.0",
2966 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2967 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
2968 | "dev": true,
2969 | "license": "MIT"
2970 | },
2971 | "node_modules/to-regex-range": {
2972 | "version": "5.0.1",
2973 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2974 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2975 | "dev": true,
2976 | "license": "MIT",
2977 | "dependencies": {
2978 | "is-number": "^7.0.0"
2979 | },
2980 | "engines": {
2981 | "node": ">=8.0"
2982 | }
2983 | },
2984 | "node_modules/ts-api-utils": {
2985 | "version": "1.4.0",
2986 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz",
2987 | "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==",
2988 | "dev": true,
2989 | "license": "MIT",
2990 | "engines": {
2991 | "node": ">=16"
2992 | },
2993 | "peerDependencies": {
2994 | "typescript": ">=4.2.0"
2995 | }
2996 | },
2997 | "node_modules/type-check": {
2998 | "version": "0.4.0",
2999 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
3000 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
3001 | "dev": true,
3002 | "license": "MIT",
3003 | "dependencies": {
3004 | "prelude-ls": "^1.2.1"
3005 | },
3006 | "engines": {
3007 | "node": ">= 0.8.0"
3008 | }
3009 | },
3010 | "node_modules/typescript": {
3011 | "version": "5.6.3",
3012 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
3013 | "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
3014 | "dev": true,
3015 | "license": "Apache-2.0",
3016 | "bin": {
3017 | "tsc": "bin/tsc",
3018 | "tsserver": "bin/tsserver"
3019 | },
3020 | "engines": {
3021 | "node": ">=14.17"
3022 | }
3023 | },
3024 | "node_modules/typescript-eslint": {
3025 | "version": "8.13.0",
3026 | "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.13.0.tgz",
3027 | "integrity": "sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==",
3028 | "dev": true,
3029 | "license": "MIT",
3030 | "dependencies": {
3031 | "@typescript-eslint/eslint-plugin": "8.13.0",
3032 | "@typescript-eslint/parser": "8.13.0",
3033 | "@typescript-eslint/utils": "8.13.0"
3034 | },
3035 | "engines": {
3036 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
3037 | },
3038 | "funding": {
3039 | "type": "opencollective",
3040 | "url": "https://opencollective.com/typescript-eslint"
3041 | },
3042 | "peerDependenciesMeta": {
3043 | "typescript": {
3044 | "optional": true
3045 | }
3046 | }
3047 | },
3048 | "node_modules/update-browserslist-db": {
3049 | "version": "1.1.1",
3050 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
3051 | "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
3052 | "dev": true,
3053 | "funding": [
3054 | {
3055 | "type": "opencollective",
3056 | "url": "https://opencollective.com/browserslist"
3057 | },
3058 | {
3059 | "type": "tidelift",
3060 | "url": "https://tidelift.com/funding/github/npm/browserslist"
3061 | },
3062 | {
3063 | "type": "github",
3064 | "url": "https://github.com/sponsors/ai"
3065 | }
3066 | ],
3067 | "license": "MIT",
3068 | "dependencies": {
3069 | "escalade": "^3.2.0",
3070 | "picocolors": "^1.1.0"
3071 | },
3072 | "bin": {
3073 | "update-browserslist-db": "cli.js"
3074 | },
3075 | "peerDependencies": {
3076 | "browserslist": ">= 4.21.0"
3077 | }
3078 | },
3079 | "node_modules/uri-js": {
3080 | "version": "4.4.1",
3081 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
3082 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
3083 | "dev": true,
3084 | "license": "BSD-2-Clause",
3085 | "dependencies": {
3086 | "punycode": "^2.1.0"
3087 | }
3088 | },
3089 | "node_modules/vite": {
3090 | "version": "5.4.10",
3091 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz",
3092 | "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==",
3093 | "dev": true,
3094 | "license": "MIT",
3095 | "dependencies": {
3096 | "esbuild": "^0.21.3",
3097 | "postcss": "^8.4.43",
3098 | "rollup": "^4.20.0"
3099 | },
3100 | "bin": {
3101 | "vite": "bin/vite.js"
3102 | },
3103 | "engines": {
3104 | "node": "^18.0.0 || >=20.0.0"
3105 | },
3106 | "funding": {
3107 | "url": "https://github.com/vitejs/vite?sponsor=1"
3108 | },
3109 | "optionalDependencies": {
3110 | "fsevents": "~2.3.3"
3111 | },
3112 | "peerDependencies": {
3113 | "@types/node": "^18.0.0 || >=20.0.0",
3114 | "less": "*",
3115 | "lightningcss": "^1.21.0",
3116 | "sass": "*",
3117 | "sass-embedded": "*",
3118 | "stylus": "*",
3119 | "sugarss": "*",
3120 | "terser": "^5.4.0"
3121 | },
3122 | "peerDependenciesMeta": {
3123 | "@types/node": {
3124 | "optional": true
3125 | },
3126 | "less": {
3127 | "optional": true
3128 | },
3129 | "lightningcss": {
3130 | "optional": true
3131 | },
3132 | "sass": {
3133 | "optional": true
3134 | },
3135 | "sass-embedded": {
3136 | "optional": true
3137 | },
3138 | "stylus": {
3139 | "optional": true
3140 | },
3141 | "sugarss": {
3142 | "optional": true
3143 | },
3144 | "terser": {
3145 | "optional": true
3146 | }
3147 | }
3148 | },
3149 | "node_modules/which": {
3150 | "version": "2.0.2",
3151 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3152 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3153 | "dev": true,
3154 | "license": "ISC",
3155 | "dependencies": {
3156 | "isexe": "^2.0.0"
3157 | },
3158 | "bin": {
3159 | "node-which": "bin/node-which"
3160 | },
3161 | "engines": {
3162 | "node": ">= 8"
3163 | }
3164 | },
3165 | "node_modules/word-wrap": {
3166 | "version": "1.2.5",
3167 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
3168 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
3169 | "dev": true,
3170 | "license": "MIT",
3171 | "engines": {
3172 | "node": ">=0.10.0"
3173 | }
3174 | },
3175 | "node_modules/yallist": {
3176 | "version": "3.1.1",
3177 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
3178 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
3179 | "dev": true,
3180 | "license": "ISC"
3181 | },
3182 | "node_modules/yocto-queue": {
3183 | "version": "0.1.0",
3184 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
3185 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
3186 | "dev": true,
3187 | "license": "MIT",
3188 | "engines": {
3189 | "node": ">=10"
3190 | },
3191 | "funding": {
3192 | "url": "https://github.com/sponsors/sindresorhus"
3193 | }
3194 | }
3195 | }
3196 | }
3197 |
--------------------------------------------------------------------------------