├── frontend
├── prettier.config.js
├── public
│ ├── _redirects
│ └── chat.png
├── src
│ ├── vite-env.d.ts
│ ├── App.vue
│ ├── vue-shim.d.ts
│ ├── types.ts
│ ├── main.ts
│ ├── style.css
│ ├── components
│ │ ├── Message.vue
│ │ └── Navbar.vue
│ └── pages
│ │ ├── Index.vue
│ │ └── Chat.vue
├── postcss.config.js
├── Makefile
├── vite.config.ts
├── tsconfig.node.json
├── tailwind.config.js
├── .gitignore
├── index.html
├── package.json
├── tsconfig.json
└── package-lock.json
├── .dockerignore
├── Makefile
├── assets
└── screenshot.png
├── backend
├── Makefile
├── cmd
│ └── main.go
├── pkg
│ ├── metrics
│ │ ├── metrics_test.go
│ │ └── metrics.go
│ └── chat
│ │ ├── client.go
│ │ ├── hub_test.go
│ │ ├── message.go
│ │ ├── server.go
│ │ ├── hub.go
│ │ └── server_test.go
├── go.mod
└── go.sum
├── Dockerfile
├── .gitignore
├── fly.toml
├── LICENSE
└── README.md
/frontend/prettier.config.js:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | gochat
2 | *_test.go
3 |
--------------------------------------------------------------------------------
/frontend/public/_redirects:
--------------------------------------------------------------------------------
1 | /* / 200
2 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | deploy:
2 | flyctl deploy
3 |
4 | .PHONY: deploy
5 |
--------------------------------------------------------------------------------
/frontend/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/frontend/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/assets/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/olzhasar/gochat/HEAD/assets/screenshot.png
--------------------------------------------------------------------------------
/frontend/public/chat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/olzhasar/gochat/HEAD/frontend/public/chat.png
--------------------------------------------------------------------------------
/frontend/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/backend/Makefile:
--------------------------------------------------------------------------------
1 | run:
2 | go run ./cmd/
3 |
4 | build:
5 | go build -o gochat ./cmd/
6 |
7 | test:
8 | go test -v ./...
9 |
10 | .PHONY: run build test
11 |
--------------------------------------------------------------------------------
/frontend/Makefile:
--------------------------------------------------------------------------------
1 | run:
2 | npm run dev
3 |
4 | build:
5 | npm run build
6 |
7 | deploy: build
8 | netlify deploy --prod --dir=dist
9 |
10 | .PHONY: deploy build run
11 |
--------------------------------------------------------------------------------
/frontend/src/vue-shim.d.ts:
--------------------------------------------------------------------------------
1 | declare module "*.vue" {
2 | import type { DefineComponent } from "vue";
3 | const component: DefineComponent<{}, {}, any>;
4 | export default component;
5 | }
6 |
--------------------------------------------------------------------------------
/frontend/src/types.ts:
--------------------------------------------------------------------------------
1 | export enum MessageType {
2 | TEXT = 1,
3 | NAME = 2,
4 | LEAVE = 3,
5 | TYPING = 4,
6 | STOP_TYPING = 5,
7 | }
8 |
9 | export interface Message {
10 | msgType: number;
11 | content: string;
12 | author: string | null;
13 | }
14 |
--------------------------------------------------------------------------------
/frontend/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import vue from "@vitejs/plugin-vue";
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [vue()],
7 | resolve: {
8 | alias: {
9 | "@": "/src",
10 | },
11 | },
12 | });
13 |
--------------------------------------------------------------------------------
/frontend/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "skipLibCheck": true,
5 | "module": "ESNext",
6 | "moduleResolution": "bundler",
7 | "allowSyntheticDefaultImports": true,
8 | "strict": true
9 | },
10 | "include": ["vite.config.ts"]
11 | }
12 |
--------------------------------------------------------------------------------
/frontend/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: [
4 | "./index.html",
5 | "./src/**/*.{js,ts,jsx,tsx,vue}",
6 | ],
7 | theme: {
8 | extend: {},
9 | },
10 | plugins: [require("daisyui")],
11 | daisyui: {
12 | themes: ["emerald"],
13 | },
14 | }
15 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | ARG GO_VERSION=1
2 | FROM golang:${GO_VERSION}-alpine as builder
3 |
4 | WORKDIR /usr/src/app
5 | COPY ./backend/go.mod ./backend/go.sum ./
6 | RUN go mod download && go mod verify
7 | COPY backend .
8 | RUN go build -v -o /run-app ./cmd/
9 |
10 |
11 | FROM alpine:latest
12 |
13 | COPY --from=builder /run-app /usr/local/bin/
14 | CMD ["run-app"]
15 |
--------------------------------------------------------------------------------
/frontend/.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 |
26 | .env*
27 |
--------------------------------------------------------------------------------
/backend/cmd/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "github.com/olzhasar/gochat/pkg/chat"
5 | "github.com/olzhasar/gochat/pkg/metrics"
6 | "os"
7 | )
8 |
9 | func main() {
10 | port := os.Getenv("PORT")
11 | if port == "" {
12 | port = "8080"
13 | }
14 |
15 | metricsServer := metrics.NewServer("2112")
16 | metricsServer.Run()
17 |
18 | hub := chat.NewHub()
19 | hub.Run()
20 |
21 | server := chat.NewServer(hub)
22 | server.Run(port)
23 | }
24 |
--------------------------------------------------------------------------------
/frontend/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 | Super secret chat
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/backend/pkg/metrics/metrics_test.go:
--------------------------------------------------------------------------------
1 | package metrics
2 |
3 | import (
4 | "net/http"
5 | "net/http/httptest"
6 | "testing"
7 | )
8 |
9 | func TestServer(t *testing.T) {
10 | server := NewServer(":2112")
11 |
12 | ts := httptest.NewServer(server)
13 | defer ts.Close()
14 |
15 | resp, err := http.Get(ts.URL + "/metrics")
16 | if err != nil {
17 | t.Fatal(err)
18 | }
19 |
20 | if resp.StatusCode != http.StatusOK {
21 | t.Fatalf("expected status code %d, got %d", http.StatusOK, resp.StatusCode)
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/frontend/src/main.ts:
--------------------------------------------------------------------------------
1 | import { createApp } from "vue";
2 | import "./style.css";
3 | import Chat from "./pages/Chat.vue";
4 | import Index from "./pages/Index.vue";
5 | import App from "./App.vue";
6 | import { createRouter, createWebHistory } from "vue-router";
7 |
8 | const routes = [
9 | { path: "/", name: "index", component: Index },
10 | { path: "/r/:roomId", name: "room", component: Chat },
11 | ];
12 |
13 | const router = createRouter({
14 | history: createWebHistory(),
15 | routes,
16 | });
17 |
18 | const app = createApp(App);
19 |
20 | app.use(router);
21 | app.mount("#app");
22 |
--------------------------------------------------------------------------------
/backend/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/olzhasar/gochat
2 |
3 | go 1.22
4 |
5 | require (
6 | github.com/beorn7/perks v1.0.1 // indirect
7 | github.com/cespare/xxhash/v2 v2.2.0 // indirect
8 | github.com/google/uuid v1.6.0
9 | github.com/gorilla/websocket v1.5.1
10 | github.com/prometheus/client_golang v1.19.0 // indirect
11 | github.com/prometheus/client_model v0.5.0 // indirect
12 | github.com/prometheus/common v0.48.0 // indirect
13 | github.com/prometheus/procfs v0.12.0 // indirect
14 | golang.org/x/net v0.20.0 // indirect
15 | golang.org/x/sys v0.16.0 // indirect
16 | google.golang.org/protobuf v1.32.0 // indirect
17 | )
18 |
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vue-tsc && vite build",
9 | "preview": "vite preview"
10 | },
11 | "dependencies": {
12 | "vue": "^3.4.19",
13 | "vue-github-button": "^3.1.0",
14 | "vue-router": "^4.3.0"
15 | },
16 | "devDependencies": {
17 | "@vitejs/plugin-vue": "^5.0.4",
18 | "autoprefixer": "^10.4.18",
19 | "daisyui": "^4.7.2",
20 | "postcss": "^8.4.35",
21 | "tailwindcss": "^3.4.1",
22 | "typescript": "^5.2.2",
23 | "vite": "^5.1.4",
24 | "vue-tsc": "^1.8.27"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/frontend/src/style.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | @layer utilities {
6 | /* Chrome, Safari and Opera */
7 | .no-scrollbar::-webkit-scrollbar {
8 | display: none;
9 | }
10 |
11 | .no-scrollbar {
12 | -ms-overflow-style: none; /* IE and Edge */
13 | scrollbar-width: none; /* Firefox */
14 | }
15 | }
16 |
17 | * {
18 | touch-action: manipulation;
19 | }
20 |
21 | html {
22 | overflow: hidden;
23 | overscroll-behavior: none;
24 | position: fixed;
25 | }
26 |
27 | body {
28 | width: 100vw;
29 | overflow: hidden;
30 | overscroll-behavior: none;
31 | touch-action: none;
32 | position: fixed;
33 | }
34 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # If you prefer the allow list template instead of the deny list, see community template:
2 | # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
3 | #
4 | # Binaries for programs and plugins
5 | *.exe
6 | *.exe~
7 | *.dll
8 | *.so
9 | *.dylib
10 |
11 | # Test binary, built with `go test -c`
12 | *.test
13 |
14 | # Output of the go coverage tool, specifically when used with LiteIDE
15 | *.out
16 |
17 | # Dependency directories (remove the comment below to include it)
18 | # vendor/
19 |
20 | # Go workspace file
21 | go.work
22 |
23 | *.db
24 | *.db-journal
25 | *.sqlite3
26 | *.sqlite3-journal
27 |
28 | gochat
29 |
30 | # Local Netlify folder
31 | .netlify
32 |
--------------------------------------------------------------------------------
/fly.toml:
--------------------------------------------------------------------------------
1 | # fly.toml app configuration file generated for olzhaschat on 2024-03-09T12:58:45+05:00
2 | #
3 | # See https://fly.io/docs/reference/configuration/ for information about how to use this file.
4 | #
5 |
6 | app = 'olzhaschat'
7 | primary_region = 'waw'
8 |
9 | [build]
10 | [build.args]
11 | GO_VERSION = '1.22'
12 |
13 | [env]
14 | PORT = '8080'
15 | CORS_ORIGIN = 'https://chat.olzhasar.com'
16 |
17 | [http_service]
18 | internal_port = 8080
19 | force_https = true
20 | auto_stop_machines = "stop"
21 | auto_start_machines = true
22 | min_machines_running = 0
23 | processes = ['app']
24 |
25 | [[vm]]
26 | size = 'shared-cpu-1x'
27 |
28 | [[ metrics ]]
29 | port = 2112
30 | path = "/"
31 |
--------------------------------------------------------------------------------
/backend/pkg/chat/client.go:
--------------------------------------------------------------------------------
1 | package chat
2 |
3 | import (
4 | "github.com/gorilla/websocket"
5 | )
6 |
7 | type Client struct {
8 | name string
9 | conn *websocket.Conn
10 | broadcastChan chan []byte
11 | }
12 |
13 | func (c *Client) write(message []byte) {
14 | c.broadcastChan <- message
15 | }
16 |
17 | func (c *Client) setName(name string) {
18 | c.name = name
19 | }
20 |
21 | func (c *Client) listen() {
22 | go func() {
23 | for msg := range c.broadcastChan {
24 | c.conn.WriteMessage(websocket.TextMessage, msg)
25 | }
26 | }()
27 | }
28 |
29 | func (c *Client) close() {
30 | close(c.broadcastChan)
31 | c.conn.Close()
32 | }
33 |
34 | func NewClient(conn *websocket.Conn) *Client {
35 | return &Client{conn: conn, broadcastChan: make(chan []byte)}
36 | }
37 |
--------------------------------------------------------------------------------
/frontend/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "module": "ESNext",
6 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 | "skipLibCheck": true,
8 | "paths": {
9 | "@/*": ["./src/*"]
10 | },
11 |
12 | /* Bundler mode */
13 | "moduleResolution": "bundler",
14 | "allowImportingTsExtensions": true,
15 | "resolveJsonModule": true,
16 | "isolatedModules": true,
17 | "noEmit": true,
18 | "jsx": "preserve",
19 |
20 | /* Linting */
21 | "strict": true,
22 | "noUnusedLocals": true,
23 | "noUnusedParameters": true,
24 | "noFallthroughCasesInSwitch": true
25 | },
26 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
27 | "references": [{ "path": "./tsconfig.node.json" }]
28 | }
29 |
--------------------------------------------------------------------------------
/backend/pkg/chat/hub_test.go:
--------------------------------------------------------------------------------
1 | package chat
2 |
3 | import "testing"
4 |
5 | func TestHubCreateRoom(t *testing.T) {
6 | hub := NewHub()
7 |
8 | room1 := hub.CreateRoom()
9 |
10 | if room1 == nil {
11 | t.Fatal("expected room to be created")
12 | }
13 |
14 | if room1.ID == "" {
15 | t.Fatal("expected room to have an ID")
16 | }
17 |
18 | if hub.GetRoom(room1.ID) != room1 {
19 | t.Fatal("expected room to be retrievable")
20 | }
21 |
22 | room2 := hub.CreateRoom()
23 |
24 | if room2.ID == room1.ID {
25 | t.Fatal("expected rooms to have unique IDs")
26 | }
27 |
28 | if hub.RoomCount() != 2 {
29 | t.Fatal("expected hub to have 2 rooms")
30 | }
31 | }
32 |
33 | func TestHubRegisterClient(t *testing.T) {
34 | hub := NewHub()
35 | hub.Run()
36 |
37 | room := hub.CreateRoom()
38 |
39 | client := NewClient(nil)
40 | hub.Register(client, room)
41 |
42 | if len(room.clients) != 1 {
43 | t.Fatal("expected client to be in room")
44 | }
45 |
46 | if room.clients[0] != client {
47 | t.Fatal("expected client to be in room")
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/frontend/src/components/Message.vue:
--------------------------------------------------------------------------------
1 |
12 |
13 |
14 |
18 |
19 |
20 | {{ msg.content }}
21 |
22 |
23 |
24 |
28 |
{{ msg.content }}
29 |
30 |
31 |
32 | {{ msg.author }} has joined the chat
33 |
34 |
35 |
36 | {{ msg.author }} has disconnected
37 |
38 |
39 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Olzhas Arystanov
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/backend/pkg/chat/message.go:
--------------------------------------------------------------------------------
1 | package chat
2 |
3 | import (
4 | "errors"
5 | "fmt"
6 | "strconv"
7 | )
8 |
9 | const MESSAGE_TYPE_TEXT = 1
10 | const MESSAGE_TYPE_NAME = 2
11 | const MESSAGE_TYPE_LEAVE = 3
12 | const MESSAGE_TYPE_TYPING = 4
13 | const MESSAGE_TYPE_STOP_TYPING = 5
14 |
15 | type Message struct {
16 | msgType int
17 | room *Room
18 | author *Client
19 | content []byte
20 | }
21 |
22 | func (m Message) Encode() []byte {
23 | var content string
24 | if m.msgType == MESSAGE_TYPE_TEXT {
25 | content = string(m.content)
26 | }
27 | output := fmt.Sprintf("%d%s|%s", m.msgType, m.author.name, content)
28 | return []byte(output)
29 | }
30 | func NewMessage(author *Client, room *Room, msgType int, content []byte) Message {
31 | return Message{author: author, room: room, msgType: msgType, content: content}
32 | }
33 |
34 | func parseMsgType(firstByte byte) (int, error) {
35 | num, err := strconv.Atoi(string(firstByte))
36 | if err != nil {
37 | return 0, err
38 | }
39 | if num < 1 || num > 6 {
40 | return 0, errors.New("Invalid message type")
41 | }
42 |
43 | return num, nil
44 | }
45 |
46 | func parseMessageData(data []byte) (int, []byte, error) {
47 | msgType, err := parseMsgType(data[0])
48 |
49 | if err != nil {
50 | return 0, nil, err
51 | }
52 |
53 | content := data[1:]
54 |
55 | return msgType, content, nil
56 | }
57 |
--------------------------------------------------------------------------------
/backend/pkg/metrics/metrics.go:
--------------------------------------------------------------------------------
1 | package metrics
2 |
3 | import (
4 | "github.com/prometheus/client_golang/prometheus"
5 | "github.com/prometheus/client_golang/prometheus/promauto"
6 | "github.com/prometheus/client_golang/prometheus/promhttp"
7 | "log"
8 | "net/http"
9 | )
10 |
11 | var (
12 | RoomCount = promauto.NewGauge(prometheus.GaugeOpts{
13 | Name: "room_count",
14 | Help: "The number of active rooms",
15 | })
16 | ClientCount = promauto.NewGauge(prometheus.GaugeOpts{
17 | Name: "client_count",
18 | Help: "The number of active clients",
19 | })
20 | MessagesReceivedCount = promauto.NewCounter(prometheus.CounterOpts{
21 | Name: "messages_received",
22 | Help: "The number of messages received from all connections",
23 | })
24 | MessagesBroadcastedCount = promauto.NewCounter(prometheus.CounterOpts{
25 | Name: "messages_broadcasted",
26 | Help: "The number of messages broadcasted to all connections",
27 | })
28 | )
29 |
30 | type Server struct {
31 | port string
32 | }
33 |
34 | func NewServer(port string) *Server {
35 | return &Server{port: port}
36 | }
37 |
38 | func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
39 | promhttp.Handler().ServeHTTP(w, r)
40 | }
41 |
42 | func (s *Server) Run() {
43 | go func() {
44 | log.Println("Starting metrics server on port", s.port)
45 | log.Fatal(http.ListenAndServe(":"+s.port, s))
46 | }()
47 | }
48 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # gochat
2 |
3 | This is a simple web messaging application built with Go and Vue.js. Users can create rooms and chat with other in real-time. The application uses WebSockets for real-time communication.
4 |
5 | Check out the [live application](https://chat.olzhasar.com/)
6 |
7 | 
8 |
9 | ## Features
10 | - Create rooms with unique URLs
11 | - Invite others by sharing the room URL
12 | - Real-time messaging
13 | - Typing indicators
14 | - Leave and join notifications
15 | - Automatic room termination after 1 minute of inactivity
16 |
17 | ## Technologies
18 | - Go
19 | - Gorilla WebSockets library
20 | - Vue.js
21 | - Vite
22 | - Tailwind CSS
23 | - DaisyUI
24 |
25 | ## Requirements
26 | - Go 1.22
27 | - Node.js
28 | - npm
29 |
30 | ## Running the application
31 | 1. Clone the repository
32 | 2. Run `make run` inside the backend directory to start the backend server
33 | 3. Navigate to the `frontend` directory and run `npm install` to install the dependencies
34 | 4. Run `make run` inside the `frontend` directory to start the frontend server
35 |
36 | ## Contributing
37 | This is a hobby project and I currently don't have any serious plans for it. However, if you find a bug or have a feature request, feel free to open an issue or submit a pull request.
38 |
39 | ## License
40 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
41 |
--------------------------------------------------------------------------------
/backend/go.sum:
--------------------------------------------------------------------------------
1 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
2 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
3 | github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
4 | github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
5 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
6 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
7 | github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
8 | github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
9 | github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
10 | github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
11 | github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=
12 | github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=
13 | github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
14 | github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
15 | github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=
16 | github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
17 | github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
18 | github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
19 | golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
20 | golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
21 | golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
22 | golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
23 | golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
24 | golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
25 | google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
26 | google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
27 |
--------------------------------------------------------------------------------
/frontend/src/pages/Index.vue:
--------------------------------------------------------------------------------
1 |
31 |
32 |
33 |
34 |
35 |
36 |
Let's chat!
37 |
38 |
39 | - Create room
40 | - Invite friends by sharing the URL
41 | - Enjoy the conversation!
42 |
43 |
44 |
45 |
46 |
49 | -
50 | The server does not store any conversations. Hence, there is no
51 | history in chat rooms.
52 |
53 | -
54 | All rooms disappear after 1 minute of inactivity when all members
55 | leave
56 |
57 | -
58 | Real-time communication is powered by encrypted
59 | Websocket
62 | connections
63 |
64 | - The project is open-source and available on GitHub
65 |
66 |
67 |
68 | Star
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 | Unexpected error occured. Please, try later
86 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/frontend/src/components/Navbar.vue:
--------------------------------------------------------------------------------
1 |
26 |
27 |
28 |
43 |
44 |
45 |
46 |
62 |
63 |
64 |
Super secret chat
65 |
66 |
67 |
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/backend/pkg/chat/server.go:
--------------------------------------------------------------------------------
1 | package chat
2 |
3 | import (
4 | "log"
5 | "net/http"
6 | "os"
7 |
8 | "github.com/gorilla/websocket"
9 | )
10 |
11 | type Server struct {
12 | mux *http.ServeMux
13 | upgrader websocket.Upgrader
14 | hub *Hub
15 | corsAllowOrigin string
16 | }
17 |
18 | func (s *Server) handleRoomCreate(w http.ResponseWriter, r *http.Request) {
19 | room := s.hub.CreateRoom()
20 |
21 | s.setCORSPolicy(w)
22 | w.Header().Set("Content-Type", "text/plain")
23 | w.WriteHeader(http.StatusCreated)
24 | w.Write([]byte(room.ID))
25 | }
26 |
27 | func (s *Server) handleRoomGet(w http.ResponseWriter, r *http.Request) {
28 | s.setCORSPolicy(w)
29 |
30 | roomID := r.PathValue("room")
31 | if roomID == "" {
32 | w.WriteHeader(http.StatusBadRequest)
33 | return
34 | }
35 |
36 | room := s.hub.GetRoom(roomID)
37 | if room == nil {
38 | w.WriteHeader(http.StatusNotFound)
39 | return
40 | }
41 |
42 | w.WriteHeader(http.StatusNoContent)
43 | }
44 |
45 | func (s *Server) handleWS(w http.ResponseWriter, r *http.Request) {
46 | roomID := r.PathValue("room")
47 | if roomID == "" {
48 | w.WriteHeader(http.StatusBadRequest)
49 | return
50 | }
51 |
52 | room := s.hub.GetRoom(roomID)
53 | if room == nil {
54 | w.WriteHeader(http.StatusNotFound)
55 | return
56 | }
57 |
58 | conn, err := s.upgrader.Upgrade(w, r, nil)
59 | if err != nil {
60 | log.Println("Failed to upgrade connection")
61 | log.Println(err)
62 | return
63 | }
64 |
65 | client := NewClient(conn)
66 | s.hub.Register(client, room)
67 |
68 | s.hub.ListenClient(client, room)
69 | }
70 |
71 | func (s *Server) setCORSPolicy(w http.ResponseWriter) {
72 | w.Header().Set("Access-Control-Allow-Origin", s.corsAllowOrigin)
73 | }
74 |
75 | func (s *Server) handleOptions(w http.ResponseWriter, r *http.Request) {
76 | s.setCORSPolicy(w)
77 | w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
78 | w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
79 | w.WriteHeader(http.StatusNoContent)
80 | }
81 |
82 | func (s *Server) configureRoutes() {
83 | s.mux.HandleFunc("OPTIONS /*", s.handleOptions)
84 | s.mux.HandleFunc("POST /room", s.handleRoomCreate)
85 | s.mux.HandleFunc("GET /room/{room}", s.handleRoomGet)
86 | s.mux.HandleFunc("GET /ws/{room}", s.handleWS)
87 | }
88 |
89 | func NewServer(hub *Hub) *Server {
90 | var corsAllowOrigin string
91 | if corsAllowOrigin = os.Getenv("CORS_ORIGIN"); corsAllowOrigin == "" {
92 | corsAllowOrigin = "*"
93 | }
94 |
95 | upgrader := websocket.Upgrader{
96 | ReadBufferSize: 1024,
97 | WriteBufferSize: 1024,
98 | CheckOrigin: func(r *http.Request) bool {
99 | if corsAllowOrigin == "*" {
100 | return true
101 | }
102 | origin := r.Header.Get("Origin")
103 | return origin == corsAllowOrigin
104 | },
105 | }
106 | mux := http.NewServeMux()
107 |
108 | server := &Server{upgrader: upgrader, hub: hub, corsAllowOrigin: corsAllowOrigin, mux: mux}
109 | server.configureRoutes()
110 |
111 | return server
112 | }
113 |
114 | func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
115 | s.mux.ServeHTTP(w, r)
116 | }
117 |
118 | func (s *Server) Run(port string) {
119 | log.Println("Starting server on port", port)
120 | log.Fatal(http.ListenAndServe(":"+port, s))
121 | }
122 |
--------------------------------------------------------------------------------
/backend/pkg/chat/hub.go:
--------------------------------------------------------------------------------
1 | package chat
2 |
3 | import (
4 | "log"
5 | "time"
6 |
7 | "github.com/google/uuid"
8 | "github.com/gorilla/websocket"
9 | "github.com/olzhasar/gochat/pkg/metrics"
10 | )
11 |
12 | const EMPTY_ROOM_TIMEOUT = 1 * time.Minute
13 |
14 | type Room struct {
15 | ID string
16 | clients []*Client
17 | }
18 |
19 | func (r *Room) ClientCount() int {
20 | return len(r.clients)
21 | }
22 |
23 | type Instruction struct {
24 | client *Client
25 | room *Room
26 | }
27 |
28 | func NewInstruction(client *Client, room *Room) Instruction {
29 | return Instruction{client: client, room: room}
30 | }
31 |
32 | type Hub struct {
33 | registerChan chan Instruction
34 | unregisterChan chan Instruction
35 | broadcastChan chan Message
36 | rooms map[string]*Room
37 | }
38 |
39 | func NewHub() *Hub {
40 | return &Hub{
41 | registerChan: make(chan Instruction),
42 | unregisterChan: make(chan Instruction),
43 | broadcastChan: make(chan Message),
44 | rooms: make(map[string]*Room),
45 | }
46 | }
47 |
48 | func (h *Hub) Register(client *Client, room *Room) {
49 | h.registerChan <- NewInstruction(client, room)
50 | }
51 |
52 | func (h *Hub) Unregister(client *Client, room *Room) {
53 | h.unregisterChan <- NewInstruction(client, room)
54 | }
55 |
56 | func (h *Hub) Broadcast(message Message) {
57 | h.broadcastChan <- message
58 | }
59 |
60 | func (h *Hub) handleRegister(client *Client, room *Room) {
61 | room.clients = append(room.clients, client)
62 | metrics.ClientCount.Inc()
63 | client.listen()
64 | }
65 |
66 | func (h *Hub) handleUnregister(client *Client, room *Room) {
67 | for i, c := range room.clients {
68 | if c == client {
69 | room.clients = append(room.clients[:i], room.clients[i+1:]...)
70 | break
71 | }
72 | }
73 |
74 | if client.name != "" {
75 | leaveMsg := NewMessage(client, room, MESSAGE_TYPE_LEAVE, nil)
76 | go h.Broadcast(leaveMsg)
77 | }
78 |
79 | client.close()
80 |
81 | h.scheduleRoomTermination(room)
82 |
83 | metrics.ClientCount.Dec()
84 | }
85 |
86 | func (h *Hub) handleBroadcast(message Message) {
87 | encoded := message.Encode()
88 |
89 | for _, client := range message.room.clients {
90 | if client != message.author {
91 | client.write(encoded)
92 | metrics.MessagesBroadcastedCount.Inc()
93 | }
94 | }
95 |
96 | metrics.MessagesReceivedCount.Inc()
97 | }
98 |
99 | func (h *Hub) Run() {
100 | go func() {
101 | for {
102 | select {
103 | case instruction := <-h.registerChan:
104 | h.handleRegister(instruction.client, instruction.room)
105 | case instruction := <-h.unregisterChan:
106 | h.handleUnregister(instruction.client, instruction.room)
107 | case message := <-h.broadcastChan:
108 | h.handleBroadcast(message)
109 | }
110 | }
111 | }()
112 | }
113 |
114 | func (h *Hub) ListenClient(client *Client, room *Room) {
115 | for {
116 | messageType, message, err := client.conn.ReadMessage()
117 | if err != nil || messageType == websocket.CloseMessage {
118 | h.Unregister(client, room)
119 | return
120 | }
121 |
122 | if messageType != websocket.TextMessage {
123 | continue
124 | }
125 |
126 | msgType, content, err := parseMessageData(message)
127 | if err != nil {
128 | log.Println("Invalid message received. Disconnecting client.")
129 | h.Unregister(client, room)
130 | continue
131 | }
132 |
133 | msg := NewMessage(client, room, msgType, content)
134 |
135 | if msg.msgType == MESSAGE_TYPE_NAME {
136 | client.setName(string(msg.content))
137 | }
138 |
139 | if client.name == "" && msg.msgType != MESSAGE_TYPE_NAME {
140 | log.Println("Client name not set. Disconnecting client.")
141 | h.Unregister(client, room)
142 | continue
143 | }
144 |
145 | h.Broadcast(msg)
146 | }
147 | }
148 |
149 | func (h *Hub) CreateRoom() *Room {
150 | var room *Room
151 |
152 | for {
153 | id := generateID()
154 | if h.rooms[id] == nil {
155 | room = &Room{ID: id}
156 | h.rooms[room.ID] = room
157 | break
158 | }
159 | }
160 |
161 | h.scheduleRoomTermination(room)
162 |
163 | metrics.RoomCount.Inc()
164 |
165 | return room
166 | }
167 |
168 | func (h *Hub) GetRoom(id string) *Room {
169 | return h.rooms[id]
170 | }
171 |
172 | func (h *Hub) RoomCount() int {
173 | return len(h.rooms)
174 | }
175 |
176 | func (h *Hub) scheduleRoomTermination(room *Room) {
177 | go func() {
178 | time.AfterFunc(EMPTY_ROOM_TIMEOUT, func() {
179 | if room.ClientCount() > 0 || h.rooms[room.ID] == nil {
180 | return
181 | }
182 | delete(h.rooms, room.ID)
183 | metrics.RoomCount.Dec()
184 | })
185 | }()
186 | }
187 |
188 | func generateID() string {
189 | return uuid.New().String()
190 | }
191 |
--------------------------------------------------------------------------------
/backend/pkg/chat/server_test.go:
--------------------------------------------------------------------------------
1 | package chat
2 |
3 | import (
4 | "io"
5 | "net/http"
6 | "net/http/httptest"
7 | "testing"
8 | "time"
9 |
10 | "github.com/gorilla/websocket"
11 | )
12 |
13 | func TestCreateRoom(t *testing.T) {
14 | hub := NewHub()
15 | hub.Run()
16 |
17 | server := NewServer(hub)
18 |
19 | ts := httptest.NewServer(server)
20 | defer ts.Close()
21 |
22 | url := ts.URL + "/room"
23 |
24 | resp, err := http.Post(url, "application/json", nil)
25 | if err != nil {
26 | t.Fatal(err)
27 | }
28 |
29 | if resp.StatusCode != http.StatusCreated {
30 | t.Fatalf("expected status code %d, got %d", http.StatusCreated, resp.StatusCode)
31 | }
32 |
33 | body, err := io.ReadAll(resp.Body)
34 | if err != nil {
35 | t.Fatal(err)
36 | }
37 |
38 | roomId := string(body)
39 |
40 | if roomId == "" {
41 | t.Fatal("expected non-empty room id")
42 | }
43 |
44 | room := hub.GetRoom(roomId)
45 | if room == nil {
46 | t.Fatal("expected room to be created")
47 | }
48 | }
49 |
50 | func TestConnectToRoom(t *testing.T) {
51 | hub := NewHub()
52 | hub.Run()
53 |
54 | room := hub.CreateRoom()
55 |
56 | server := NewServer(hub)
57 |
58 | ts := httptest.NewServer(server)
59 | defer ts.Close()
60 |
61 | dialer := websocket.Dialer{}
62 | url := "ws" + ts.URL[4:] + "/ws/" + room.ID
63 |
64 | conn, resp, err := dialer.Dial(url, nil)
65 | if err != nil {
66 | t.Fatal(err)
67 | }
68 | defer conn.Close()
69 |
70 | if resp.StatusCode != http.StatusSwitchingProtocols {
71 | t.Fatalf("expected status code %d, got %d", http.StatusSwitchingProtocols, resp.StatusCode)
72 | }
73 |
74 | time.Sleep(50 * time.Millisecond)
75 |
76 | if room.ClientCount() != 1 {
77 | t.Fatalf("expected 1 client, got %d", room.ClientCount())
78 | }
79 | }
80 |
81 | func TestConnectToUnexistingRoom(t *testing.T) {
82 | hub := NewHub()
83 | hub.Run()
84 |
85 | server := NewServer(hub)
86 |
87 | ts := httptest.NewServer(server)
88 | defer ts.Close()
89 |
90 | dialer := websocket.Dialer{}
91 | url := "ws" + ts.URL[4:] + "/ws/123"
92 |
93 | _, resp, err := dialer.Dial(url, nil)
94 | if err == nil {
95 | t.Fatal("expected error")
96 | }
97 |
98 | if resp.StatusCode != http.StatusNotFound {
99 | t.Fatalf("expected status code %d, got %d", http.StatusNotFound, resp.StatusCode)
100 | }
101 | }
102 |
103 | func TestSetName(t *testing.T) {
104 | hub := NewHub()
105 | hub.Run()
106 |
107 | room := hub.CreateRoom()
108 |
109 | server := NewServer(hub)
110 |
111 | ts := httptest.NewServer(server)
112 | defer ts.Close()
113 |
114 | conn := makeConnection(ts, room.ID)
115 | defer conn.Close()
116 |
117 | name := "test"
118 | if err := conn.WriteMessage(websocket.TextMessage, []byte("2test")); err != nil {
119 | t.Fatal(err)
120 | }
121 |
122 | time.Sleep(50 * time.Millisecond)
123 |
124 | if room.clients[0].name != name {
125 | t.Fatalf("expected name %s, got %s", name, room.clients[0].name)
126 | }
127 | }
128 |
129 | func TestTextMessage(t *testing.T) {
130 | hub := NewHub()
131 | hub.Run()
132 |
133 | room := hub.CreateRoom()
134 |
135 | server := NewServer(hub)
136 |
137 | ts := httptest.NewServer(server)
138 | defer ts.Close()
139 |
140 | conn1 := makeConnection(ts, room.ID)
141 | conn2 := makeConnection(ts, room.ID)
142 | defer conn1.Close()
143 | defer conn2.Close()
144 |
145 | conn1.WriteMessage(websocket.TextMessage, []byte("2test"))
146 |
147 | message := []byte("1hello")
148 | if err := conn1.WriteMessage(websocket.TextMessage, message); err != nil {
149 | t.Fatal(err)
150 | }
151 |
152 | time.Sleep(50 * time.Millisecond)
153 |
154 | checkReceivedMessage(t, conn2, "2test|")
155 | checkReceivedMessage(t, conn2, "1test|hello")
156 | }
157 |
158 | func TestLeaveMessage(t *testing.T) {
159 | hub := NewHub()
160 | hub.Run()
161 |
162 | room := hub.CreateRoom()
163 |
164 | server := NewServer(hub)
165 |
166 | ts := httptest.NewServer(server)
167 | defer ts.Close()
168 |
169 | conn1 := makeConnection(ts, room.ID)
170 | defer conn1.Close()
171 |
172 | conn2 := makeConnection(ts, room.ID)
173 | conn2.WriteMessage(websocket.TextMessage, []byte("2leaver"))
174 | conn2.Close()
175 |
176 | checkReceivedMessage(t, conn1, "2leaver|")
177 | checkReceivedMessage(t, conn1, "3leaver|")
178 | }
179 |
180 | func TestGetRoom(t *testing.T) {
181 | hub := NewHub()
182 | hub.Run()
183 |
184 | room := hub.CreateRoom()
185 |
186 | server := NewServer(hub)
187 |
188 | ts := httptest.NewServer(server)
189 | defer ts.Close()
190 |
191 | resp, err := http.Get(ts.URL + "/room/" + room.ID)
192 | if err != nil {
193 | t.Fatal(err)
194 | }
195 |
196 | if resp.StatusCode != http.StatusNoContent {
197 | t.Fatalf("expected status code %d, got %d", http.StatusOK, resp.StatusCode)
198 | }
199 | }
200 |
201 | func TestGetUnexistingRoom(t *testing.T) {
202 | hub := NewHub()
203 | hub.Run()
204 |
205 | server := NewServer(hub)
206 |
207 | ts := httptest.NewServer(server)
208 | defer ts.Close()
209 |
210 | resp, err := http.Get(ts.URL + "/room/123")
211 | if err != nil {
212 | t.Fatal(err)
213 | }
214 |
215 | if resp.StatusCode != http.StatusNotFound {
216 | t.Fatalf("expected status code %d, got %d", http.StatusNotFound, resp.StatusCode)
217 | }
218 | }
219 |
220 | func makeConnection(ts *httptest.Server, roomId string) *websocket.Conn {
221 | dialer := websocket.Dialer{}
222 | url := "ws" + ts.URL[4:] + "/ws/" + roomId
223 |
224 | conn, _, err := dialer.Dial(url, nil)
225 |
226 | if err != nil {
227 | panic(err)
228 | }
229 |
230 | return conn
231 | }
232 |
233 | func checkReceivedMessage(t testing.TB, conn *websocket.Conn, expected string) {
234 | t.Helper()
235 |
236 | conn.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
237 |
238 | _, received, err := conn.ReadMessage()
239 | if err != nil {
240 | t.Fatalf("expected message %s, got error %s", expected, err)
241 | }
242 |
243 | if string(received) != expected {
244 | t.Fatalf("expected message %s, got %s", expected, received)
245 | }
246 | }
247 |
--------------------------------------------------------------------------------
/frontend/src/pages/Chat.vue:
--------------------------------------------------------------------------------
1 |
167 |
168 |
169 |
173 |
174 |
187 |
188 |
210 |
211 |
247 |
248 |
249 |
250 |
251 |
Connecting...
252 |
253 |
254 |
255 |
256 |
--------------------------------------------------------------------------------
/frontend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "frontend",
9 | "version": "0.0.0",
10 | "dependencies": {
11 | "vue": "^3.4.19",
12 | "vue-github-button": "^3.1.0",
13 | "vue-router": "^4.3.0"
14 | },
15 | "devDependencies": {
16 | "@vitejs/plugin-vue": "^5.0.4",
17 | "autoprefixer": "^10.4.18",
18 | "daisyui": "^4.7.2",
19 | "postcss": "^8.4.35",
20 | "tailwindcss": "^3.4.1",
21 | "typescript": "^5.2.2",
22 | "vite": "^5.1.4",
23 | "vue-tsc": "^1.8.27"
24 | }
25 | },
26 | "node_modules/@alloc/quick-lru": {
27 | "version": "5.2.0",
28 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
29 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
30 | "dev": true,
31 | "engines": {
32 | "node": ">=10"
33 | },
34 | "funding": {
35 | "url": "https://github.com/sponsors/sindresorhus"
36 | }
37 | },
38 | "node_modules/@babel/parser": {
39 | "version": "7.24.0",
40 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz",
41 | "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==",
42 | "bin": {
43 | "parser": "bin/babel-parser.js"
44 | },
45 | "engines": {
46 | "node": ">=6.0.0"
47 | }
48 | },
49 | "node_modules/@esbuild/aix-ppc64": {
50 | "version": "0.19.12",
51 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
52 | "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
53 | "cpu": [
54 | "ppc64"
55 | ],
56 | "dev": true,
57 | "optional": true,
58 | "os": [
59 | "aix"
60 | ],
61 | "engines": {
62 | "node": ">=12"
63 | }
64 | },
65 | "node_modules/@esbuild/android-arm": {
66 | "version": "0.19.12",
67 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
68 | "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
69 | "cpu": [
70 | "arm"
71 | ],
72 | "dev": true,
73 | "optional": true,
74 | "os": [
75 | "android"
76 | ],
77 | "engines": {
78 | "node": ">=12"
79 | }
80 | },
81 | "node_modules/@esbuild/android-arm64": {
82 | "version": "0.19.12",
83 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
84 | "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
85 | "cpu": [
86 | "arm64"
87 | ],
88 | "dev": true,
89 | "optional": true,
90 | "os": [
91 | "android"
92 | ],
93 | "engines": {
94 | "node": ">=12"
95 | }
96 | },
97 | "node_modules/@esbuild/android-x64": {
98 | "version": "0.19.12",
99 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
100 | "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
101 | "cpu": [
102 | "x64"
103 | ],
104 | "dev": true,
105 | "optional": true,
106 | "os": [
107 | "android"
108 | ],
109 | "engines": {
110 | "node": ">=12"
111 | }
112 | },
113 | "node_modules/@esbuild/darwin-arm64": {
114 | "version": "0.19.12",
115 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
116 | "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
117 | "cpu": [
118 | "arm64"
119 | ],
120 | "dev": true,
121 | "optional": true,
122 | "os": [
123 | "darwin"
124 | ],
125 | "engines": {
126 | "node": ">=12"
127 | }
128 | },
129 | "node_modules/@esbuild/darwin-x64": {
130 | "version": "0.19.12",
131 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
132 | "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
133 | "cpu": [
134 | "x64"
135 | ],
136 | "dev": true,
137 | "optional": true,
138 | "os": [
139 | "darwin"
140 | ],
141 | "engines": {
142 | "node": ">=12"
143 | }
144 | },
145 | "node_modules/@esbuild/freebsd-arm64": {
146 | "version": "0.19.12",
147 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
148 | "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
149 | "cpu": [
150 | "arm64"
151 | ],
152 | "dev": true,
153 | "optional": true,
154 | "os": [
155 | "freebsd"
156 | ],
157 | "engines": {
158 | "node": ">=12"
159 | }
160 | },
161 | "node_modules/@esbuild/freebsd-x64": {
162 | "version": "0.19.12",
163 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
164 | "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
165 | "cpu": [
166 | "x64"
167 | ],
168 | "dev": true,
169 | "optional": true,
170 | "os": [
171 | "freebsd"
172 | ],
173 | "engines": {
174 | "node": ">=12"
175 | }
176 | },
177 | "node_modules/@esbuild/linux-arm": {
178 | "version": "0.19.12",
179 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
180 | "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
181 | "cpu": [
182 | "arm"
183 | ],
184 | "dev": true,
185 | "optional": true,
186 | "os": [
187 | "linux"
188 | ],
189 | "engines": {
190 | "node": ">=12"
191 | }
192 | },
193 | "node_modules/@esbuild/linux-arm64": {
194 | "version": "0.19.12",
195 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
196 | "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
197 | "cpu": [
198 | "arm64"
199 | ],
200 | "dev": true,
201 | "optional": true,
202 | "os": [
203 | "linux"
204 | ],
205 | "engines": {
206 | "node": ">=12"
207 | }
208 | },
209 | "node_modules/@esbuild/linux-ia32": {
210 | "version": "0.19.12",
211 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
212 | "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
213 | "cpu": [
214 | "ia32"
215 | ],
216 | "dev": true,
217 | "optional": true,
218 | "os": [
219 | "linux"
220 | ],
221 | "engines": {
222 | "node": ">=12"
223 | }
224 | },
225 | "node_modules/@esbuild/linux-loong64": {
226 | "version": "0.19.12",
227 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
228 | "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
229 | "cpu": [
230 | "loong64"
231 | ],
232 | "dev": true,
233 | "optional": true,
234 | "os": [
235 | "linux"
236 | ],
237 | "engines": {
238 | "node": ">=12"
239 | }
240 | },
241 | "node_modules/@esbuild/linux-mips64el": {
242 | "version": "0.19.12",
243 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
244 | "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
245 | "cpu": [
246 | "mips64el"
247 | ],
248 | "dev": true,
249 | "optional": true,
250 | "os": [
251 | "linux"
252 | ],
253 | "engines": {
254 | "node": ">=12"
255 | }
256 | },
257 | "node_modules/@esbuild/linux-ppc64": {
258 | "version": "0.19.12",
259 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
260 | "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
261 | "cpu": [
262 | "ppc64"
263 | ],
264 | "dev": true,
265 | "optional": true,
266 | "os": [
267 | "linux"
268 | ],
269 | "engines": {
270 | "node": ">=12"
271 | }
272 | },
273 | "node_modules/@esbuild/linux-riscv64": {
274 | "version": "0.19.12",
275 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
276 | "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
277 | "cpu": [
278 | "riscv64"
279 | ],
280 | "dev": true,
281 | "optional": true,
282 | "os": [
283 | "linux"
284 | ],
285 | "engines": {
286 | "node": ">=12"
287 | }
288 | },
289 | "node_modules/@esbuild/linux-s390x": {
290 | "version": "0.19.12",
291 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
292 | "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
293 | "cpu": [
294 | "s390x"
295 | ],
296 | "dev": true,
297 | "optional": true,
298 | "os": [
299 | "linux"
300 | ],
301 | "engines": {
302 | "node": ">=12"
303 | }
304 | },
305 | "node_modules/@esbuild/linux-x64": {
306 | "version": "0.19.12",
307 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
308 | "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
309 | "cpu": [
310 | "x64"
311 | ],
312 | "dev": true,
313 | "optional": true,
314 | "os": [
315 | "linux"
316 | ],
317 | "engines": {
318 | "node": ">=12"
319 | }
320 | },
321 | "node_modules/@esbuild/netbsd-x64": {
322 | "version": "0.19.12",
323 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
324 | "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
325 | "cpu": [
326 | "x64"
327 | ],
328 | "dev": true,
329 | "optional": true,
330 | "os": [
331 | "netbsd"
332 | ],
333 | "engines": {
334 | "node": ">=12"
335 | }
336 | },
337 | "node_modules/@esbuild/openbsd-x64": {
338 | "version": "0.19.12",
339 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
340 | "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
341 | "cpu": [
342 | "x64"
343 | ],
344 | "dev": true,
345 | "optional": true,
346 | "os": [
347 | "openbsd"
348 | ],
349 | "engines": {
350 | "node": ">=12"
351 | }
352 | },
353 | "node_modules/@esbuild/sunos-x64": {
354 | "version": "0.19.12",
355 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
356 | "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
357 | "cpu": [
358 | "x64"
359 | ],
360 | "dev": true,
361 | "optional": true,
362 | "os": [
363 | "sunos"
364 | ],
365 | "engines": {
366 | "node": ">=12"
367 | }
368 | },
369 | "node_modules/@esbuild/win32-arm64": {
370 | "version": "0.19.12",
371 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
372 | "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
373 | "cpu": [
374 | "arm64"
375 | ],
376 | "dev": true,
377 | "optional": true,
378 | "os": [
379 | "win32"
380 | ],
381 | "engines": {
382 | "node": ">=12"
383 | }
384 | },
385 | "node_modules/@esbuild/win32-ia32": {
386 | "version": "0.19.12",
387 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
388 | "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
389 | "cpu": [
390 | "ia32"
391 | ],
392 | "dev": true,
393 | "optional": true,
394 | "os": [
395 | "win32"
396 | ],
397 | "engines": {
398 | "node": ">=12"
399 | }
400 | },
401 | "node_modules/@esbuild/win32-x64": {
402 | "version": "0.19.12",
403 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
404 | "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
405 | "cpu": [
406 | "x64"
407 | ],
408 | "dev": true,
409 | "optional": true,
410 | "os": [
411 | "win32"
412 | ],
413 | "engines": {
414 | "node": ">=12"
415 | }
416 | },
417 | "node_modules/@isaacs/cliui": {
418 | "version": "8.0.2",
419 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
420 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
421 | "dev": true,
422 | "dependencies": {
423 | "string-width": "^5.1.2",
424 | "string-width-cjs": "npm:string-width@^4.2.0",
425 | "strip-ansi": "^7.0.1",
426 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
427 | "wrap-ansi": "^8.1.0",
428 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
429 | },
430 | "engines": {
431 | "node": ">=12"
432 | }
433 | },
434 | "node_modules/@jridgewell/gen-mapping": {
435 | "version": "0.3.5",
436 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
437 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
438 | "dev": true,
439 | "dependencies": {
440 | "@jridgewell/set-array": "^1.2.1",
441 | "@jridgewell/sourcemap-codec": "^1.4.10",
442 | "@jridgewell/trace-mapping": "^0.3.24"
443 | },
444 | "engines": {
445 | "node": ">=6.0.0"
446 | }
447 | },
448 | "node_modules/@jridgewell/resolve-uri": {
449 | "version": "3.1.2",
450 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
451 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
452 | "dev": true,
453 | "engines": {
454 | "node": ">=6.0.0"
455 | }
456 | },
457 | "node_modules/@jridgewell/set-array": {
458 | "version": "1.2.1",
459 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
460 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
461 | "dev": true,
462 | "engines": {
463 | "node": ">=6.0.0"
464 | }
465 | },
466 | "node_modules/@jridgewell/sourcemap-codec": {
467 | "version": "1.4.15",
468 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
469 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
470 | },
471 | "node_modules/@jridgewell/trace-mapping": {
472 | "version": "0.3.25",
473 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
474 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
475 | "dev": true,
476 | "dependencies": {
477 | "@jridgewell/resolve-uri": "^3.1.0",
478 | "@jridgewell/sourcemap-codec": "^1.4.14"
479 | }
480 | },
481 | "node_modules/@nodelib/fs.scandir": {
482 | "version": "2.1.5",
483 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
484 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
485 | "dev": true,
486 | "dependencies": {
487 | "@nodelib/fs.stat": "2.0.5",
488 | "run-parallel": "^1.1.9"
489 | },
490 | "engines": {
491 | "node": ">= 8"
492 | }
493 | },
494 | "node_modules/@nodelib/fs.stat": {
495 | "version": "2.0.5",
496 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
497 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
498 | "dev": true,
499 | "engines": {
500 | "node": ">= 8"
501 | }
502 | },
503 | "node_modules/@nodelib/fs.walk": {
504 | "version": "1.2.8",
505 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
506 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
507 | "dev": true,
508 | "dependencies": {
509 | "@nodelib/fs.scandir": "2.1.5",
510 | "fastq": "^1.6.0"
511 | },
512 | "engines": {
513 | "node": ">= 8"
514 | }
515 | },
516 | "node_modules/@pkgjs/parseargs": {
517 | "version": "0.11.0",
518 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
519 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
520 | "dev": true,
521 | "optional": true,
522 | "engines": {
523 | "node": ">=14"
524 | }
525 | },
526 | "node_modules/@rollup/rollup-android-arm-eabi": {
527 | "version": "4.12.1",
528 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz",
529 | "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==",
530 | "cpu": [
531 | "arm"
532 | ],
533 | "dev": true,
534 | "optional": true,
535 | "os": [
536 | "android"
537 | ]
538 | },
539 | "node_modules/@rollup/rollup-android-arm64": {
540 | "version": "4.12.1",
541 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz",
542 | "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==",
543 | "cpu": [
544 | "arm64"
545 | ],
546 | "dev": true,
547 | "optional": true,
548 | "os": [
549 | "android"
550 | ]
551 | },
552 | "node_modules/@rollup/rollup-darwin-arm64": {
553 | "version": "4.12.1",
554 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz",
555 | "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==",
556 | "cpu": [
557 | "arm64"
558 | ],
559 | "dev": true,
560 | "optional": true,
561 | "os": [
562 | "darwin"
563 | ]
564 | },
565 | "node_modules/@rollup/rollup-darwin-x64": {
566 | "version": "4.12.1",
567 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz",
568 | "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==",
569 | "cpu": [
570 | "x64"
571 | ],
572 | "dev": true,
573 | "optional": true,
574 | "os": [
575 | "darwin"
576 | ]
577 | },
578 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
579 | "version": "4.12.1",
580 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz",
581 | "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==",
582 | "cpu": [
583 | "arm"
584 | ],
585 | "dev": true,
586 | "optional": true,
587 | "os": [
588 | "linux"
589 | ]
590 | },
591 | "node_modules/@rollup/rollup-linux-arm64-gnu": {
592 | "version": "4.12.1",
593 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz",
594 | "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==",
595 | "cpu": [
596 | "arm64"
597 | ],
598 | "dev": true,
599 | "optional": true,
600 | "os": [
601 | "linux"
602 | ]
603 | },
604 | "node_modules/@rollup/rollup-linux-arm64-musl": {
605 | "version": "4.12.1",
606 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz",
607 | "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==",
608 | "cpu": [
609 | "arm64"
610 | ],
611 | "dev": true,
612 | "optional": true,
613 | "os": [
614 | "linux"
615 | ]
616 | },
617 | "node_modules/@rollup/rollup-linux-riscv64-gnu": {
618 | "version": "4.12.1",
619 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz",
620 | "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==",
621 | "cpu": [
622 | "riscv64"
623 | ],
624 | "dev": true,
625 | "optional": true,
626 | "os": [
627 | "linux"
628 | ]
629 | },
630 | "node_modules/@rollup/rollup-linux-x64-gnu": {
631 | "version": "4.12.1",
632 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz",
633 | "integrity": "sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==",
634 | "cpu": [
635 | "x64"
636 | ],
637 | "dev": true,
638 | "optional": true,
639 | "os": [
640 | "linux"
641 | ]
642 | },
643 | "node_modules/@rollup/rollup-linux-x64-musl": {
644 | "version": "4.12.1",
645 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz",
646 | "integrity": "sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==",
647 | "cpu": [
648 | "x64"
649 | ],
650 | "dev": true,
651 | "optional": true,
652 | "os": [
653 | "linux"
654 | ]
655 | },
656 | "node_modules/@rollup/rollup-win32-arm64-msvc": {
657 | "version": "4.12.1",
658 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz",
659 | "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==",
660 | "cpu": [
661 | "arm64"
662 | ],
663 | "dev": true,
664 | "optional": true,
665 | "os": [
666 | "win32"
667 | ]
668 | },
669 | "node_modules/@rollup/rollup-win32-ia32-msvc": {
670 | "version": "4.12.1",
671 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz",
672 | "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==",
673 | "cpu": [
674 | "ia32"
675 | ],
676 | "dev": true,
677 | "optional": true,
678 | "os": [
679 | "win32"
680 | ]
681 | },
682 | "node_modules/@rollup/rollup-win32-x64-msvc": {
683 | "version": "4.12.1",
684 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz",
685 | "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==",
686 | "cpu": [
687 | "x64"
688 | ],
689 | "dev": true,
690 | "optional": true,
691 | "os": [
692 | "win32"
693 | ]
694 | },
695 | "node_modules/@types/estree": {
696 | "version": "1.0.5",
697 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
698 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
699 | "dev": true
700 | },
701 | "node_modules/@vitejs/plugin-vue": {
702 | "version": "5.0.4",
703 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz",
704 | "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==",
705 | "dev": true,
706 | "engines": {
707 | "node": "^18.0.0 || >=20.0.0"
708 | },
709 | "peerDependencies": {
710 | "vite": "^5.0.0",
711 | "vue": "^3.2.25"
712 | }
713 | },
714 | "node_modules/@volar/language-core": {
715 | "version": "1.11.1",
716 | "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz",
717 | "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==",
718 | "dev": true,
719 | "dependencies": {
720 | "@volar/source-map": "1.11.1"
721 | }
722 | },
723 | "node_modules/@volar/source-map": {
724 | "version": "1.11.1",
725 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz",
726 | "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==",
727 | "dev": true,
728 | "dependencies": {
729 | "muggle-string": "^0.3.1"
730 | }
731 | },
732 | "node_modules/@volar/typescript": {
733 | "version": "1.11.1",
734 | "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz",
735 | "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==",
736 | "dev": true,
737 | "dependencies": {
738 | "@volar/language-core": "1.11.1",
739 | "path-browserify": "^1.0.1"
740 | }
741 | },
742 | "node_modules/@vue/compiler-core": {
743 | "version": "3.4.21",
744 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz",
745 | "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==",
746 | "dependencies": {
747 | "@babel/parser": "^7.23.9",
748 | "@vue/shared": "3.4.21",
749 | "entities": "^4.5.0",
750 | "estree-walker": "^2.0.2",
751 | "source-map-js": "^1.0.2"
752 | }
753 | },
754 | "node_modules/@vue/compiler-dom": {
755 | "version": "3.4.21",
756 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz",
757 | "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==",
758 | "dependencies": {
759 | "@vue/compiler-core": "3.4.21",
760 | "@vue/shared": "3.4.21"
761 | }
762 | },
763 | "node_modules/@vue/compiler-sfc": {
764 | "version": "3.4.21",
765 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz",
766 | "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==",
767 | "dependencies": {
768 | "@babel/parser": "^7.23.9",
769 | "@vue/compiler-core": "3.4.21",
770 | "@vue/compiler-dom": "3.4.21",
771 | "@vue/compiler-ssr": "3.4.21",
772 | "@vue/shared": "3.4.21",
773 | "estree-walker": "^2.0.2",
774 | "magic-string": "^0.30.7",
775 | "postcss": "^8.4.35",
776 | "source-map-js": "^1.0.2"
777 | }
778 | },
779 | "node_modules/@vue/compiler-ssr": {
780 | "version": "3.4.21",
781 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz",
782 | "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==",
783 | "dependencies": {
784 | "@vue/compiler-dom": "3.4.21",
785 | "@vue/shared": "3.4.21"
786 | }
787 | },
788 | "node_modules/@vue/devtools-api": {
789 | "version": "6.6.1",
790 | "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz",
791 | "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA=="
792 | },
793 | "node_modules/@vue/language-core": {
794 | "version": "1.8.27",
795 | "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz",
796 | "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==",
797 | "dev": true,
798 | "dependencies": {
799 | "@volar/language-core": "~1.11.1",
800 | "@volar/source-map": "~1.11.1",
801 | "@vue/compiler-dom": "^3.3.0",
802 | "@vue/shared": "^3.3.0",
803 | "computeds": "^0.0.1",
804 | "minimatch": "^9.0.3",
805 | "muggle-string": "^0.3.1",
806 | "path-browserify": "^1.0.1",
807 | "vue-template-compiler": "^2.7.14"
808 | },
809 | "peerDependencies": {
810 | "typescript": "*"
811 | },
812 | "peerDependenciesMeta": {
813 | "typescript": {
814 | "optional": true
815 | }
816 | }
817 | },
818 | "node_modules/@vue/reactivity": {
819 | "version": "3.4.21",
820 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz",
821 | "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
822 | "dependencies": {
823 | "@vue/shared": "3.4.21"
824 | }
825 | },
826 | "node_modules/@vue/runtime-core": {
827 | "version": "3.4.21",
828 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
829 | "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
830 | "dependencies": {
831 | "@vue/reactivity": "3.4.21",
832 | "@vue/shared": "3.4.21"
833 | }
834 | },
835 | "node_modules/@vue/runtime-dom": {
836 | "version": "3.4.21",
837 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
838 | "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
839 | "dependencies": {
840 | "@vue/runtime-core": "3.4.21",
841 | "@vue/shared": "3.4.21",
842 | "csstype": "^3.1.3"
843 | }
844 | },
845 | "node_modules/@vue/server-renderer": {
846 | "version": "3.4.21",
847 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
848 | "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
849 | "dependencies": {
850 | "@vue/compiler-ssr": "3.4.21",
851 | "@vue/shared": "3.4.21"
852 | },
853 | "peerDependencies": {
854 | "vue": "3.4.21"
855 | }
856 | },
857 | "node_modules/@vue/shared": {
858 | "version": "3.4.21",
859 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz",
860 | "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g=="
861 | },
862 | "node_modules/ansi-regex": {
863 | "version": "6.0.1",
864 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
865 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
866 | "dev": true,
867 | "engines": {
868 | "node": ">=12"
869 | },
870 | "funding": {
871 | "url": "https://github.com/chalk/ansi-regex?sponsor=1"
872 | }
873 | },
874 | "node_modules/ansi-styles": {
875 | "version": "6.2.1",
876 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
877 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
878 | "dev": true,
879 | "engines": {
880 | "node": ">=12"
881 | },
882 | "funding": {
883 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
884 | }
885 | },
886 | "node_modules/any-promise": {
887 | "version": "1.3.0",
888 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
889 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
890 | "dev": true
891 | },
892 | "node_modules/anymatch": {
893 | "version": "3.1.3",
894 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
895 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
896 | "dev": true,
897 | "dependencies": {
898 | "normalize-path": "^3.0.0",
899 | "picomatch": "^2.0.4"
900 | },
901 | "engines": {
902 | "node": ">= 8"
903 | }
904 | },
905 | "node_modules/arg": {
906 | "version": "5.0.2",
907 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
908 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
909 | "dev": true
910 | },
911 | "node_modules/autoprefixer": {
912 | "version": "10.4.18",
913 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz",
914 | "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==",
915 | "dev": true,
916 | "funding": [
917 | {
918 | "type": "opencollective",
919 | "url": "https://opencollective.com/postcss/"
920 | },
921 | {
922 | "type": "tidelift",
923 | "url": "https://tidelift.com/funding/github/npm/autoprefixer"
924 | },
925 | {
926 | "type": "github",
927 | "url": "https://github.com/sponsors/ai"
928 | }
929 | ],
930 | "dependencies": {
931 | "browserslist": "^4.23.0",
932 | "caniuse-lite": "^1.0.30001591",
933 | "fraction.js": "^4.3.7",
934 | "normalize-range": "^0.1.2",
935 | "picocolors": "^1.0.0",
936 | "postcss-value-parser": "^4.2.0"
937 | },
938 | "bin": {
939 | "autoprefixer": "bin/autoprefixer"
940 | },
941 | "engines": {
942 | "node": "^10 || ^12 || >=14"
943 | },
944 | "peerDependencies": {
945 | "postcss": "^8.1.0"
946 | }
947 | },
948 | "node_modules/balanced-match": {
949 | "version": "1.0.2",
950 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
951 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
952 | "dev": true
953 | },
954 | "node_modules/binary-extensions": {
955 | "version": "2.2.0",
956 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
957 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
958 | "dev": true,
959 | "engines": {
960 | "node": ">=8"
961 | }
962 | },
963 | "node_modules/brace-expansion": {
964 | "version": "2.0.1",
965 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
966 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
967 | "dev": true,
968 | "dependencies": {
969 | "balanced-match": "^1.0.0"
970 | }
971 | },
972 | "node_modules/braces": {
973 | "version": "3.0.2",
974 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
975 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
976 | "dev": true,
977 | "dependencies": {
978 | "fill-range": "^7.0.1"
979 | },
980 | "engines": {
981 | "node": ">=8"
982 | }
983 | },
984 | "node_modules/browserslist": {
985 | "version": "4.23.0",
986 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
987 | "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
988 | "dev": true,
989 | "funding": [
990 | {
991 | "type": "opencollective",
992 | "url": "https://opencollective.com/browserslist"
993 | },
994 | {
995 | "type": "tidelift",
996 | "url": "https://tidelift.com/funding/github/npm/browserslist"
997 | },
998 | {
999 | "type": "github",
1000 | "url": "https://github.com/sponsors/ai"
1001 | }
1002 | ],
1003 | "dependencies": {
1004 | "caniuse-lite": "^1.0.30001587",
1005 | "electron-to-chromium": "^1.4.668",
1006 | "node-releases": "^2.0.14",
1007 | "update-browserslist-db": "^1.0.13"
1008 | },
1009 | "bin": {
1010 | "browserslist": "cli.js"
1011 | },
1012 | "engines": {
1013 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1014 | }
1015 | },
1016 | "node_modules/camelcase-css": {
1017 | "version": "2.0.1",
1018 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
1019 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
1020 | "dev": true,
1021 | "engines": {
1022 | "node": ">= 6"
1023 | }
1024 | },
1025 | "node_modules/caniuse-lite": {
1026 | "version": "1.0.30001596",
1027 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz",
1028 | "integrity": "sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==",
1029 | "dev": true,
1030 | "funding": [
1031 | {
1032 | "type": "opencollective",
1033 | "url": "https://opencollective.com/browserslist"
1034 | },
1035 | {
1036 | "type": "tidelift",
1037 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1038 | },
1039 | {
1040 | "type": "github",
1041 | "url": "https://github.com/sponsors/ai"
1042 | }
1043 | ]
1044 | },
1045 | "node_modules/chokidar": {
1046 | "version": "3.6.0",
1047 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
1048 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
1049 | "dev": true,
1050 | "dependencies": {
1051 | "anymatch": "~3.1.2",
1052 | "braces": "~3.0.2",
1053 | "glob-parent": "~5.1.2",
1054 | "is-binary-path": "~2.1.0",
1055 | "is-glob": "~4.0.1",
1056 | "normalize-path": "~3.0.0",
1057 | "readdirp": "~3.6.0"
1058 | },
1059 | "engines": {
1060 | "node": ">= 8.10.0"
1061 | },
1062 | "funding": {
1063 | "url": "https://paulmillr.com/funding/"
1064 | },
1065 | "optionalDependencies": {
1066 | "fsevents": "~2.3.2"
1067 | }
1068 | },
1069 | "node_modules/chokidar/node_modules/glob-parent": {
1070 | "version": "5.1.2",
1071 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1072 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1073 | "dev": true,
1074 | "dependencies": {
1075 | "is-glob": "^4.0.1"
1076 | },
1077 | "engines": {
1078 | "node": ">= 6"
1079 | }
1080 | },
1081 | "node_modules/color-convert": {
1082 | "version": "2.0.1",
1083 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1084 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1085 | "dev": true,
1086 | "dependencies": {
1087 | "color-name": "~1.1.4"
1088 | },
1089 | "engines": {
1090 | "node": ">=7.0.0"
1091 | }
1092 | },
1093 | "node_modules/color-name": {
1094 | "version": "1.1.4",
1095 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1096 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1097 | "dev": true
1098 | },
1099 | "node_modules/commander": {
1100 | "version": "4.1.1",
1101 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1102 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1103 | "dev": true,
1104 | "engines": {
1105 | "node": ">= 6"
1106 | }
1107 | },
1108 | "node_modules/computeds": {
1109 | "version": "0.0.1",
1110 | "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz",
1111 | "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==",
1112 | "dev": true
1113 | },
1114 | "node_modules/cross-spawn": {
1115 | "version": "7.0.3",
1116 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
1117 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
1118 | "dev": true,
1119 | "dependencies": {
1120 | "path-key": "^3.1.0",
1121 | "shebang-command": "^2.0.0",
1122 | "which": "^2.0.1"
1123 | },
1124 | "engines": {
1125 | "node": ">= 8"
1126 | }
1127 | },
1128 | "node_modules/css-selector-tokenizer": {
1129 | "version": "0.8.0",
1130 | "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz",
1131 | "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==",
1132 | "dev": true,
1133 | "dependencies": {
1134 | "cssesc": "^3.0.0",
1135 | "fastparse": "^1.1.2"
1136 | }
1137 | },
1138 | "node_modules/cssesc": {
1139 | "version": "3.0.0",
1140 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
1141 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
1142 | "dev": true,
1143 | "bin": {
1144 | "cssesc": "bin/cssesc"
1145 | },
1146 | "engines": {
1147 | "node": ">=4"
1148 | }
1149 | },
1150 | "node_modules/csstype": {
1151 | "version": "3.1.3",
1152 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1153 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
1154 | },
1155 | "node_modules/culori": {
1156 | "version": "3.3.0",
1157 | "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz",
1158 | "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==",
1159 | "dev": true,
1160 | "engines": {
1161 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1162 | }
1163 | },
1164 | "node_modules/daisyui": {
1165 | "version": "4.7.2",
1166 | "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.7.2.tgz",
1167 | "integrity": "sha512-9UCss12Zmyk/22u+JbkVrHHxOzFOyY17HuqP5LeswI4hclbj6qbjJTovdj2zRy8cCH6/n6Wh0lTLjriGnyGh0g==",
1168 | "dev": true,
1169 | "dependencies": {
1170 | "css-selector-tokenizer": "^0.8",
1171 | "culori": "^3",
1172 | "picocolors": "^1",
1173 | "postcss-js": "^4"
1174 | },
1175 | "engines": {
1176 | "node": ">=16.9.0"
1177 | },
1178 | "funding": {
1179 | "type": "opencollective",
1180 | "url": "https://opencollective.com/daisyui"
1181 | }
1182 | },
1183 | "node_modules/de-indent": {
1184 | "version": "1.0.2",
1185 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
1186 | "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
1187 | "dev": true
1188 | },
1189 | "node_modules/didyoumean": {
1190 | "version": "1.2.2",
1191 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
1192 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
1193 | "dev": true
1194 | },
1195 | "node_modules/dlv": {
1196 | "version": "1.1.3",
1197 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
1198 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
1199 | "dev": true
1200 | },
1201 | "node_modules/eastasianwidth": {
1202 | "version": "0.2.0",
1203 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1204 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
1205 | "dev": true
1206 | },
1207 | "node_modules/electron-to-chromium": {
1208 | "version": "1.4.696",
1209 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.696.tgz",
1210 | "integrity": "sha512-SOr0bHP52OvYg2chCsz/0+FUSMGFm8L8HKwPpx3cbwRY24EOemVJtbgTm+IFO8LzhcnPy+hXmTq7ZcZ8uUuaYg==",
1211 | "dev": true
1212 | },
1213 | "node_modules/emoji-regex": {
1214 | "version": "9.2.2",
1215 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1216 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
1217 | "dev": true
1218 | },
1219 | "node_modules/entities": {
1220 | "version": "4.5.0",
1221 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
1222 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
1223 | "engines": {
1224 | "node": ">=0.12"
1225 | },
1226 | "funding": {
1227 | "url": "https://github.com/fb55/entities?sponsor=1"
1228 | }
1229 | },
1230 | "node_modules/esbuild": {
1231 | "version": "0.19.12",
1232 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
1233 | "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
1234 | "dev": true,
1235 | "hasInstallScript": true,
1236 | "bin": {
1237 | "esbuild": "bin/esbuild"
1238 | },
1239 | "engines": {
1240 | "node": ">=12"
1241 | },
1242 | "optionalDependencies": {
1243 | "@esbuild/aix-ppc64": "0.19.12",
1244 | "@esbuild/android-arm": "0.19.12",
1245 | "@esbuild/android-arm64": "0.19.12",
1246 | "@esbuild/android-x64": "0.19.12",
1247 | "@esbuild/darwin-arm64": "0.19.12",
1248 | "@esbuild/darwin-x64": "0.19.12",
1249 | "@esbuild/freebsd-arm64": "0.19.12",
1250 | "@esbuild/freebsd-x64": "0.19.12",
1251 | "@esbuild/linux-arm": "0.19.12",
1252 | "@esbuild/linux-arm64": "0.19.12",
1253 | "@esbuild/linux-ia32": "0.19.12",
1254 | "@esbuild/linux-loong64": "0.19.12",
1255 | "@esbuild/linux-mips64el": "0.19.12",
1256 | "@esbuild/linux-ppc64": "0.19.12",
1257 | "@esbuild/linux-riscv64": "0.19.12",
1258 | "@esbuild/linux-s390x": "0.19.12",
1259 | "@esbuild/linux-x64": "0.19.12",
1260 | "@esbuild/netbsd-x64": "0.19.12",
1261 | "@esbuild/openbsd-x64": "0.19.12",
1262 | "@esbuild/sunos-x64": "0.19.12",
1263 | "@esbuild/win32-arm64": "0.19.12",
1264 | "@esbuild/win32-ia32": "0.19.12",
1265 | "@esbuild/win32-x64": "0.19.12"
1266 | }
1267 | },
1268 | "node_modules/escalade": {
1269 | "version": "3.1.2",
1270 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
1271 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
1272 | "dev": true,
1273 | "engines": {
1274 | "node": ">=6"
1275 | }
1276 | },
1277 | "node_modules/estree-walker": {
1278 | "version": "2.0.2",
1279 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
1280 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
1281 | },
1282 | "node_modules/fast-glob": {
1283 | "version": "3.3.2",
1284 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
1285 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
1286 | "dev": true,
1287 | "dependencies": {
1288 | "@nodelib/fs.stat": "^2.0.2",
1289 | "@nodelib/fs.walk": "^1.2.3",
1290 | "glob-parent": "^5.1.2",
1291 | "merge2": "^1.3.0",
1292 | "micromatch": "^4.0.4"
1293 | },
1294 | "engines": {
1295 | "node": ">=8.6.0"
1296 | }
1297 | },
1298 | "node_modules/fast-glob/node_modules/glob-parent": {
1299 | "version": "5.1.2",
1300 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1301 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1302 | "dev": true,
1303 | "dependencies": {
1304 | "is-glob": "^4.0.1"
1305 | },
1306 | "engines": {
1307 | "node": ">= 6"
1308 | }
1309 | },
1310 | "node_modules/fastparse": {
1311 | "version": "1.1.2",
1312 | "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
1313 | "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
1314 | "dev": true
1315 | },
1316 | "node_modules/fastq": {
1317 | "version": "1.17.1",
1318 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
1319 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
1320 | "dev": true,
1321 | "dependencies": {
1322 | "reusify": "^1.0.4"
1323 | }
1324 | },
1325 | "node_modules/fill-range": {
1326 | "version": "7.0.1",
1327 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1328 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1329 | "dev": true,
1330 | "dependencies": {
1331 | "to-regex-range": "^5.0.1"
1332 | },
1333 | "engines": {
1334 | "node": ">=8"
1335 | }
1336 | },
1337 | "node_modules/foreground-child": {
1338 | "version": "3.1.1",
1339 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
1340 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
1341 | "dev": true,
1342 | "dependencies": {
1343 | "cross-spawn": "^7.0.0",
1344 | "signal-exit": "^4.0.1"
1345 | },
1346 | "engines": {
1347 | "node": ">=14"
1348 | },
1349 | "funding": {
1350 | "url": "https://github.com/sponsors/isaacs"
1351 | }
1352 | },
1353 | "node_modules/fraction.js": {
1354 | "version": "4.3.7",
1355 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
1356 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
1357 | "dev": true,
1358 | "engines": {
1359 | "node": "*"
1360 | },
1361 | "funding": {
1362 | "type": "patreon",
1363 | "url": "https://github.com/sponsors/rawify"
1364 | }
1365 | },
1366 | "node_modules/fsevents": {
1367 | "version": "2.3.3",
1368 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1369 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1370 | "dev": true,
1371 | "hasInstallScript": true,
1372 | "optional": true,
1373 | "os": [
1374 | "darwin"
1375 | ],
1376 | "engines": {
1377 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1378 | }
1379 | },
1380 | "node_modules/function-bind": {
1381 | "version": "1.1.2",
1382 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1383 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1384 | "dev": true,
1385 | "funding": {
1386 | "url": "https://github.com/sponsors/ljharb"
1387 | }
1388 | },
1389 | "node_modules/github-buttons": {
1390 | "version": "2.27.0",
1391 | "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.27.0.tgz",
1392 | "integrity": "sha512-PmfRMI2Rttg/2jDfKBeSl621sEznrsKF019SuoLdoNlO7qRUZaOyEI5Li4uW+79pVqnDtKfIEVuHTIJ5lgy64w=="
1393 | },
1394 | "node_modules/glob": {
1395 | "version": "10.3.10",
1396 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
1397 | "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
1398 | "dev": true,
1399 | "dependencies": {
1400 | "foreground-child": "^3.1.0",
1401 | "jackspeak": "^2.3.5",
1402 | "minimatch": "^9.0.1",
1403 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
1404 | "path-scurry": "^1.10.1"
1405 | },
1406 | "bin": {
1407 | "glob": "dist/esm/bin.mjs"
1408 | },
1409 | "engines": {
1410 | "node": ">=16 || 14 >=14.17"
1411 | },
1412 | "funding": {
1413 | "url": "https://github.com/sponsors/isaacs"
1414 | }
1415 | },
1416 | "node_modules/glob-parent": {
1417 | "version": "6.0.2",
1418 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1419 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1420 | "dev": true,
1421 | "dependencies": {
1422 | "is-glob": "^4.0.3"
1423 | },
1424 | "engines": {
1425 | "node": ">=10.13.0"
1426 | }
1427 | },
1428 | "node_modules/hasown": {
1429 | "version": "2.0.1",
1430 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
1431 | "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
1432 | "dev": true,
1433 | "dependencies": {
1434 | "function-bind": "^1.1.2"
1435 | },
1436 | "engines": {
1437 | "node": ">= 0.4"
1438 | }
1439 | },
1440 | "node_modules/he": {
1441 | "version": "1.2.0",
1442 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
1443 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
1444 | "dev": true,
1445 | "bin": {
1446 | "he": "bin/he"
1447 | }
1448 | },
1449 | "node_modules/is-binary-path": {
1450 | "version": "2.1.0",
1451 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1452 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1453 | "dev": true,
1454 | "dependencies": {
1455 | "binary-extensions": "^2.0.0"
1456 | },
1457 | "engines": {
1458 | "node": ">=8"
1459 | }
1460 | },
1461 | "node_modules/is-core-module": {
1462 | "version": "2.13.1",
1463 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
1464 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
1465 | "dev": true,
1466 | "dependencies": {
1467 | "hasown": "^2.0.0"
1468 | },
1469 | "funding": {
1470 | "url": "https://github.com/sponsors/ljharb"
1471 | }
1472 | },
1473 | "node_modules/is-extglob": {
1474 | "version": "2.1.1",
1475 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1476 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1477 | "dev": true,
1478 | "engines": {
1479 | "node": ">=0.10.0"
1480 | }
1481 | },
1482 | "node_modules/is-fullwidth-code-point": {
1483 | "version": "3.0.0",
1484 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1485 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1486 | "dev": true,
1487 | "engines": {
1488 | "node": ">=8"
1489 | }
1490 | },
1491 | "node_modules/is-glob": {
1492 | "version": "4.0.3",
1493 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1494 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1495 | "dev": true,
1496 | "dependencies": {
1497 | "is-extglob": "^2.1.1"
1498 | },
1499 | "engines": {
1500 | "node": ">=0.10.0"
1501 | }
1502 | },
1503 | "node_modules/is-number": {
1504 | "version": "7.0.0",
1505 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1506 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1507 | "dev": true,
1508 | "engines": {
1509 | "node": ">=0.12.0"
1510 | }
1511 | },
1512 | "node_modules/isexe": {
1513 | "version": "2.0.0",
1514 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1515 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1516 | "dev": true
1517 | },
1518 | "node_modules/jackspeak": {
1519 | "version": "2.3.6",
1520 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
1521 | "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
1522 | "dev": true,
1523 | "dependencies": {
1524 | "@isaacs/cliui": "^8.0.2"
1525 | },
1526 | "engines": {
1527 | "node": ">=14"
1528 | },
1529 | "funding": {
1530 | "url": "https://github.com/sponsors/isaacs"
1531 | },
1532 | "optionalDependencies": {
1533 | "@pkgjs/parseargs": "^0.11.0"
1534 | }
1535 | },
1536 | "node_modules/jiti": {
1537 | "version": "1.21.0",
1538 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
1539 | "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
1540 | "dev": true,
1541 | "bin": {
1542 | "jiti": "bin/jiti.js"
1543 | }
1544 | },
1545 | "node_modules/lilconfig": {
1546 | "version": "2.1.0",
1547 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
1548 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
1549 | "dev": true,
1550 | "engines": {
1551 | "node": ">=10"
1552 | }
1553 | },
1554 | "node_modules/lines-and-columns": {
1555 | "version": "1.2.4",
1556 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1557 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
1558 | "dev": true
1559 | },
1560 | "node_modules/lru-cache": {
1561 | "version": "6.0.0",
1562 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
1563 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
1564 | "dev": true,
1565 | "dependencies": {
1566 | "yallist": "^4.0.0"
1567 | },
1568 | "engines": {
1569 | "node": ">=10"
1570 | }
1571 | },
1572 | "node_modules/magic-string": {
1573 | "version": "0.30.8",
1574 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz",
1575 | "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
1576 | "dependencies": {
1577 | "@jridgewell/sourcemap-codec": "^1.4.15"
1578 | },
1579 | "engines": {
1580 | "node": ">=12"
1581 | }
1582 | },
1583 | "node_modules/merge2": {
1584 | "version": "1.4.1",
1585 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1586 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1587 | "dev": true,
1588 | "engines": {
1589 | "node": ">= 8"
1590 | }
1591 | },
1592 | "node_modules/micromatch": {
1593 | "version": "4.0.5",
1594 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
1595 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
1596 | "dev": true,
1597 | "dependencies": {
1598 | "braces": "^3.0.2",
1599 | "picomatch": "^2.3.1"
1600 | },
1601 | "engines": {
1602 | "node": ">=8.6"
1603 | }
1604 | },
1605 | "node_modules/minimatch": {
1606 | "version": "9.0.3",
1607 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
1608 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
1609 | "dev": true,
1610 | "dependencies": {
1611 | "brace-expansion": "^2.0.1"
1612 | },
1613 | "engines": {
1614 | "node": ">=16 || 14 >=14.17"
1615 | },
1616 | "funding": {
1617 | "url": "https://github.com/sponsors/isaacs"
1618 | }
1619 | },
1620 | "node_modules/minipass": {
1621 | "version": "7.0.4",
1622 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
1623 | "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
1624 | "dev": true,
1625 | "engines": {
1626 | "node": ">=16 || 14 >=14.17"
1627 | }
1628 | },
1629 | "node_modules/muggle-string": {
1630 | "version": "0.3.1",
1631 | "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz",
1632 | "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==",
1633 | "dev": true
1634 | },
1635 | "node_modules/mz": {
1636 | "version": "2.7.0",
1637 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1638 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
1639 | "dev": true,
1640 | "dependencies": {
1641 | "any-promise": "^1.0.0",
1642 | "object-assign": "^4.0.1",
1643 | "thenify-all": "^1.0.0"
1644 | }
1645 | },
1646 | "node_modules/nanoid": {
1647 | "version": "3.3.7",
1648 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
1649 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
1650 | "funding": [
1651 | {
1652 | "type": "github",
1653 | "url": "https://github.com/sponsors/ai"
1654 | }
1655 | ],
1656 | "bin": {
1657 | "nanoid": "bin/nanoid.cjs"
1658 | },
1659 | "engines": {
1660 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1661 | }
1662 | },
1663 | "node_modules/node-releases": {
1664 | "version": "2.0.14",
1665 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
1666 | "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
1667 | "dev": true
1668 | },
1669 | "node_modules/normalize-path": {
1670 | "version": "3.0.0",
1671 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1672 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1673 | "dev": true,
1674 | "engines": {
1675 | "node": ">=0.10.0"
1676 | }
1677 | },
1678 | "node_modules/normalize-range": {
1679 | "version": "0.1.2",
1680 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
1681 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
1682 | "dev": true,
1683 | "engines": {
1684 | "node": ">=0.10.0"
1685 | }
1686 | },
1687 | "node_modules/object-assign": {
1688 | "version": "4.1.1",
1689 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1690 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1691 | "dev": true,
1692 | "engines": {
1693 | "node": ">=0.10.0"
1694 | }
1695 | },
1696 | "node_modules/object-hash": {
1697 | "version": "3.0.0",
1698 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
1699 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
1700 | "dev": true,
1701 | "engines": {
1702 | "node": ">= 6"
1703 | }
1704 | },
1705 | "node_modules/path-browserify": {
1706 | "version": "1.0.1",
1707 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
1708 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
1709 | "dev": true
1710 | },
1711 | "node_modules/path-key": {
1712 | "version": "3.1.1",
1713 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1714 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1715 | "dev": true,
1716 | "engines": {
1717 | "node": ">=8"
1718 | }
1719 | },
1720 | "node_modules/path-parse": {
1721 | "version": "1.0.7",
1722 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1723 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1724 | "dev": true
1725 | },
1726 | "node_modules/path-scurry": {
1727 | "version": "1.10.1",
1728 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
1729 | "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
1730 | "dev": true,
1731 | "dependencies": {
1732 | "lru-cache": "^9.1.1 || ^10.0.0",
1733 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
1734 | },
1735 | "engines": {
1736 | "node": ">=16 || 14 >=14.17"
1737 | },
1738 | "funding": {
1739 | "url": "https://github.com/sponsors/isaacs"
1740 | }
1741 | },
1742 | "node_modules/path-scurry/node_modules/lru-cache": {
1743 | "version": "10.2.0",
1744 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
1745 | "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
1746 | "dev": true,
1747 | "engines": {
1748 | "node": "14 || >=16.14"
1749 | }
1750 | },
1751 | "node_modules/picocolors": {
1752 | "version": "1.0.0",
1753 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1754 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
1755 | },
1756 | "node_modules/picomatch": {
1757 | "version": "2.3.1",
1758 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1759 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1760 | "dev": true,
1761 | "engines": {
1762 | "node": ">=8.6"
1763 | },
1764 | "funding": {
1765 | "url": "https://github.com/sponsors/jonschlinkert"
1766 | }
1767 | },
1768 | "node_modules/pify": {
1769 | "version": "2.3.0",
1770 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1771 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
1772 | "dev": true,
1773 | "engines": {
1774 | "node": ">=0.10.0"
1775 | }
1776 | },
1777 | "node_modules/pirates": {
1778 | "version": "4.0.6",
1779 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
1780 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
1781 | "dev": true,
1782 | "engines": {
1783 | "node": ">= 6"
1784 | }
1785 | },
1786 | "node_modules/postcss": {
1787 | "version": "8.4.35",
1788 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
1789 | "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
1790 | "funding": [
1791 | {
1792 | "type": "opencollective",
1793 | "url": "https://opencollective.com/postcss/"
1794 | },
1795 | {
1796 | "type": "tidelift",
1797 | "url": "https://tidelift.com/funding/github/npm/postcss"
1798 | },
1799 | {
1800 | "type": "github",
1801 | "url": "https://github.com/sponsors/ai"
1802 | }
1803 | ],
1804 | "dependencies": {
1805 | "nanoid": "^3.3.7",
1806 | "picocolors": "^1.0.0",
1807 | "source-map-js": "^1.0.2"
1808 | },
1809 | "engines": {
1810 | "node": "^10 || ^12 || >=14"
1811 | }
1812 | },
1813 | "node_modules/postcss-import": {
1814 | "version": "15.1.0",
1815 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
1816 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
1817 | "dev": true,
1818 | "dependencies": {
1819 | "postcss-value-parser": "^4.0.0",
1820 | "read-cache": "^1.0.0",
1821 | "resolve": "^1.1.7"
1822 | },
1823 | "engines": {
1824 | "node": ">=14.0.0"
1825 | },
1826 | "peerDependencies": {
1827 | "postcss": "^8.0.0"
1828 | }
1829 | },
1830 | "node_modules/postcss-js": {
1831 | "version": "4.0.1",
1832 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
1833 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
1834 | "dev": true,
1835 | "dependencies": {
1836 | "camelcase-css": "^2.0.1"
1837 | },
1838 | "engines": {
1839 | "node": "^12 || ^14 || >= 16"
1840 | },
1841 | "funding": {
1842 | "type": "opencollective",
1843 | "url": "https://opencollective.com/postcss/"
1844 | },
1845 | "peerDependencies": {
1846 | "postcss": "^8.4.21"
1847 | }
1848 | },
1849 | "node_modules/postcss-load-config": {
1850 | "version": "4.0.2",
1851 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
1852 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
1853 | "dev": true,
1854 | "funding": [
1855 | {
1856 | "type": "opencollective",
1857 | "url": "https://opencollective.com/postcss/"
1858 | },
1859 | {
1860 | "type": "github",
1861 | "url": "https://github.com/sponsors/ai"
1862 | }
1863 | ],
1864 | "dependencies": {
1865 | "lilconfig": "^3.0.0",
1866 | "yaml": "^2.3.4"
1867 | },
1868 | "engines": {
1869 | "node": ">= 14"
1870 | },
1871 | "peerDependencies": {
1872 | "postcss": ">=8.0.9",
1873 | "ts-node": ">=9.0.0"
1874 | },
1875 | "peerDependenciesMeta": {
1876 | "postcss": {
1877 | "optional": true
1878 | },
1879 | "ts-node": {
1880 | "optional": true
1881 | }
1882 | }
1883 | },
1884 | "node_modules/postcss-load-config/node_modules/lilconfig": {
1885 | "version": "3.1.1",
1886 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
1887 | "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
1888 | "dev": true,
1889 | "engines": {
1890 | "node": ">=14"
1891 | },
1892 | "funding": {
1893 | "url": "https://github.com/sponsors/antonk52"
1894 | }
1895 | },
1896 | "node_modules/postcss-nested": {
1897 | "version": "6.0.1",
1898 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
1899 | "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
1900 | "dev": true,
1901 | "dependencies": {
1902 | "postcss-selector-parser": "^6.0.11"
1903 | },
1904 | "engines": {
1905 | "node": ">=12.0"
1906 | },
1907 | "funding": {
1908 | "type": "opencollective",
1909 | "url": "https://opencollective.com/postcss/"
1910 | },
1911 | "peerDependencies": {
1912 | "postcss": "^8.2.14"
1913 | }
1914 | },
1915 | "node_modules/postcss-selector-parser": {
1916 | "version": "6.0.15",
1917 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
1918 | "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
1919 | "dev": true,
1920 | "dependencies": {
1921 | "cssesc": "^3.0.0",
1922 | "util-deprecate": "^1.0.2"
1923 | },
1924 | "engines": {
1925 | "node": ">=4"
1926 | }
1927 | },
1928 | "node_modules/postcss-value-parser": {
1929 | "version": "4.2.0",
1930 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
1931 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
1932 | "dev": true
1933 | },
1934 | "node_modules/queue-microtask": {
1935 | "version": "1.2.3",
1936 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1937 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1938 | "dev": true,
1939 | "funding": [
1940 | {
1941 | "type": "github",
1942 | "url": "https://github.com/sponsors/feross"
1943 | },
1944 | {
1945 | "type": "patreon",
1946 | "url": "https://www.patreon.com/feross"
1947 | },
1948 | {
1949 | "type": "consulting",
1950 | "url": "https://feross.org/support"
1951 | }
1952 | ]
1953 | },
1954 | "node_modules/read-cache": {
1955 | "version": "1.0.0",
1956 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
1957 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
1958 | "dev": true,
1959 | "dependencies": {
1960 | "pify": "^2.3.0"
1961 | }
1962 | },
1963 | "node_modules/readdirp": {
1964 | "version": "3.6.0",
1965 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1966 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1967 | "dev": true,
1968 | "dependencies": {
1969 | "picomatch": "^2.2.1"
1970 | },
1971 | "engines": {
1972 | "node": ">=8.10.0"
1973 | }
1974 | },
1975 | "node_modules/resolve": {
1976 | "version": "1.22.8",
1977 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
1978 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
1979 | "dev": true,
1980 | "dependencies": {
1981 | "is-core-module": "^2.13.0",
1982 | "path-parse": "^1.0.7",
1983 | "supports-preserve-symlinks-flag": "^1.0.0"
1984 | },
1985 | "bin": {
1986 | "resolve": "bin/resolve"
1987 | },
1988 | "funding": {
1989 | "url": "https://github.com/sponsors/ljharb"
1990 | }
1991 | },
1992 | "node_modules/reusify": {
1993 | "version": "1.0.4",
1994 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1995 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1996 | "dev": true,
1997 | "engines": {
1998 | "iojs": ">=1.0.0",
1999 | "node": ">=0.10.0"
2000 | }
2001 | },
2002 | "node_modules/rollup": {
2003 | "version": "4.12.1",
2004 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz",
2005 | "integrity": "sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==",
2006 | "dev": true,
2007 | "dependencies": {
2008 | "@types/estree": "1.0.5"
2009 | },
2010 | "bin": {
2011 | "rollup": "dist/bin/rollup"
2012 | },
2013 | "engines": {
2014 | "node": ">=18.0.0",
2015 | "npm": ">=8.0.0"
2016 | },
2017 | "optionalDependencies": {
2018 | "@rollup/rollup-android-arm-eabi": "4.12.1",
2019 | "@rollup/rollup-android-arm64": "4.12.1",
2020 | "@rollup/rollup-darwin-arm64": "4.12.1",
2021 | "@rollup/rollup-darwin-x64": "4.12.1",
2022 | "@rollup/rollup-linux-arm-gnueabihf": "4.12.1",
2023 | "@rollup/rollup-linux-arm64-gnu": "4.12.1",
2024 | "@rollup/rollup-linux-arm64-musl": "4.12.1",
2025 | "@rollup/rollup-linux-riscv64-gnu": "4.12.1",
2026 | "@rollup/rollup-linux-x64-gnu": "4.12.1",
2027 | "@rollup/rollup-linux-x64-musl": "4.12.1",
2028 | "@rollup/rollup-win32-arm64-msvc": "4.12.1",
2029 | "@rollup/rollup-win32-ia32-msvc": "4.12.1",
2030 | "@rollup/rollup-win32-x64-msvc": "4.12.1",
2031 | "fsevents": "~2.3.2"
2032 | }
2033 | },
2034 | "node_modules/run-parallel": {
2035 | "version": "1.2.0",
2036 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2037 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2038 | "dev": true,
2039 | "funding": [
2040 | {
2041 | "type": "github",
2042 | "url": "https://github.com/sponsors/feross"
2043 | },
2044 | {
2045 | "type": "patreon",
2046 | "url": "https://www.patreon.com/feross"
2047 | },
2048 | {
2049 | "type": "consulting",
2050 | "url": "https://feross.org/support"
2051 | }
2052 | ],
2053 | "dependencies": {
2054 | "queue-microtask": "^1.2.2"
2055 | }
2056 | },
2057 | "node_modules/semver": {
2058 | "version": "7.6.0",
2059 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
2060 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
2061 | "dev": true,
2062 | "dependencies": {
2063 | "lru-cache": "^6.0.0"
2064 | },
2065 | "bin": {
2066 | "semver": "bin/semver.js"
2067 | },
2068 | "engines": {
2069 | "node": ">=10"
2070 | }
2071 | },
2072 | "node_modules/shebang-command": {
2073 | "version": "2.0.0",
2074 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2075 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2076 | "dev": true,
2077 | "dependencies": {
2078 | "shebang-regex": "^3.0.0"
2079 | },
2080 | "engines": {
2081 | "node": ">=8"
2082 | }
2083 | },
2084 | "node_modules/shebang-regex": {
2085 | "version": "3.0.0",
2086 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2087 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2088 | "dev": true,
2089 | "engines": {
2090 | "node": ">=8"
2091 | }
2092 | },
2093 | "node_modules/signal-exit": {
2094 | "version": "4.1.0",
2095 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
2096 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
2097 | "dev": true,
2098 | "engines": {
2099 | "node": ">=14"
2100 | },
2101 | "funding": {
2102 | "url": "https://github.com/sponsors/isaacs"
2103 | }
2104 | },
2105 | "node_modules/source-map-js": {
2106 | "version": "1.0.2",
2107 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
2108 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
2109 | "engines": {
2110 | "node": ">=0.10.0"
2111 | }
2112 | },
2113 | "node_modules/string-width": {
2114 | "version": "5.1.2",
2115 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
2116 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
2117 | "dev": true,
2118 | "dependencies": {
2119 | "eastasianwidth": "^0.2.0",
2120 | "emoji-regex": "^9.2.2",
2121 | "strip-ansi": "^7.0.1"
2122 | },
2123 | "engines": {
2124 | "node": ">=12"
2125 | },
2126 | "funding": {
2127 | "url": "https://github.com/sponsors/sindresorhus"
2128 | }
2129 | },
2130 | "node_modules/string-width-cjs": {
2131 | "name": "string-width",
2132 | "version": "4.2.3",
2133 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2134 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2135 | "dev": true,
2136 | "dependencies": {
2137 | "emoji-regex": "^8.0.0",
2138 | "is-fullwidth-code-point": "^3.0.0",
2139 | "strip-ansi": "^6.0.1"
2140 | },
2141 | "engines": {
2142 | "node": ">=8"
2143 | }
2144 | },
2145 | "node_modules/string-width-cjs/node_modules/ansi-regex": {
2146 | "version": "5.0.1",
2147 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2148 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2149 | "dev": true,
2150 | "engines": {
2151 | "node": ">=8"
2152 | }
2153 | },
2154 | "node_modules/string-width-cjs/node_modules/emoji-regex": {
2155 | "version": "8.0.0",
2156 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2157 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2158 | "dev": true
2159 | },
2160 | "node_modules/string-width-cjs/node_modules/strip-ansi": {
2161 | "version": "6.0.1",
2162 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2163 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2164 | "dev": true,
2165 | "dependencies": {
2166 | "ansi-regex": "^5.0.1"
2167 | },
2168 | "engines": {
2169 | "node": ">=8"
2170 | }
2171 | },
2172 | "node_modules/strip-ansi": {
2173 | "version": "7.1.0",
2174 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
2175 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
2176 | "dev": true,
2177 | "dependencies": {
2178 | "ansi-regex": "^6.0.1"
2179 | },
2180 | "engines": {
2181 | "node": ">=12"
2182 | },
2183 | "funding": {
2184 | "url": "https://github.com/chalk/strip-ansi?sponsor=1"
2185 | }
2186 | },
2187 | "node_modules/strip-ansi-cjs": {
2188 | "name": "strip-ansi",
2189 | "version": "6.0.1",
2190 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2191 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2192 | "dev": true,
2193 | "dependencies": {
2194 | "ansi-regex": "^5.0.1"
2195 | },
2196 | "engines": {
2197 | "node": ">=8"
2198 | }
2199 | },
2200 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
2201 | "version": "5.0.1",
2202 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2203 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2204 | "dev": true,
2205 | "engines": {
2206 | "node": ">=8"
2207 | }
2208 | },
2209 | "node_modules/sucrase": {
2210 | "version": "3.35.0",
2211 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
2212 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
2213 | "dev": true,
2214 | "dependencies": {
2215 | "@jridgewell/gen-mapping": "^0.3.2",
2216 | "commander": "^4.0.0",
2217 | "glob": "^10.3.10",
2218 | "lines-and-columns": "^1.1.6",
2219 | "mz": "^2.7.0",
2220 | "pirates": "^4.0.1",
2221 | "ts-interface-checker": "^0.1.9"
2222 | },
2223 | "bin": {
2224 | "sucrase": "bin/sucrase",
2225 | "sucrase-node": "bin/sucrase-node"
2226 | },
2227 | "engines": {
2228 | "node": ">=16 || 14 >=14.17"
2229 | }
2230 | },
2231 | "node_modules/supports-preserve-symlinks-flag": {
2232 | "version": "1.0.0",
2233 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2234 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2235 | "dev": true,
2236 | "engines": {
2237 | "node": ">= 0.4"
2238 | },
2239 | "funding": {
2240 | "url": "https://github.com/sponsors/ljharb"
2241 | }
2242 | },
2243 | "node_modules/tailwindcss": {
2244 | "version": "3.4.1",
2245 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz",
2246 | "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==",
2247 | "dev": true,
2248 | "dependencies": {
2249 | "@alloc/quick-lru": "^5.2.0",
2250 | "arg": "^5.0.2",
2251 | "chokidar": "^3.5.3",
2252 | "didyoumean": "^1.2.2",
2253 | "dlv": "^1.1.3",
2254 | "fast-glob": "^3.3.0",
2255 | "glob-parent": "^6.0.2",
2256 | "is-glob": "^4.0.3",
2257 | "jiti": "^1.19.1",
2258 | "lilconfig": "^2.1.0",
2259 | "micromatch": "^4.0.5",
2260 | "normalize-path": "^3.0.0",
2261 | "object-hash": "^3.0.0",
2262 | "picocolors": "^1.0.0",
2263 | "postcss": "^8.4.23",
2264 | "postcss-import": "^15.1.0",
2265 | "postcss-js": "^4.0.1",
2266 | "postcss-load-config": "^4.0.1",
2267 | "postcss-nested": "^6.0.1",
2268 | "postcss-selector-parser": "^6.0.11",
2269 | "resolve": "^1.22.2",
2270 | "sucrase": "^3.32.0"
2271 | },
2272 | "bin": {
2273 | "tailwind": "lib/cli.js",
2274 | "tailwindcss": "lib/cli.js"
2275 | },
2276 | "engines": {
2277 | "node": ">=14.0.0"
2278 | }
2279 | },
2280 | "node_modules/thenify": {
2281 | "version": "3.3.1",
2282 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
2283 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
2284 | "dev": true,
2285 | "dependencies": {
2286 | "any-promise": "^1.0.0"
2287 | }
2288 | },
2289 | "node_modules/thenify-all": {
2290 | "version": "1.6.0",
2291 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
2292 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
2293 | "dev": true,
2294 | "dependencies": {
2295 | "thenify": ">= 3.1.0 < 4"
2296 | },
2297 | "engines": {
2298 | "node": ">=0.8"
2299 | }
2300 | },
2301 | "node_modules/to-regex-range": {
2302 | "version": "5.0.1",
2303 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2304 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2305 | "dev": true,
2306 | "dependencies": {
2307 | "is-number": "^7.0.0"
2308 | },
2309 | "engines": {
2310 | "node": ">=8.0"
2311 | }
2312 | },
2313 | "node_modules/ts-interface-checker": {
2314 | "version": "0.1.13",
2315 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
2316 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
2317 | "dev": true
2318 | },
2319 | "node_modules/typescript": {
2320 | "version": "5.4.2",
2321 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz",
2322 | "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==",
2323 | "devOptional": true,
2324 | "bin": {
2325 | "tsc": "bin/tsc",
2326 | "tsserver": "bin/tsserver"
2327 | },
2328 | "engines": {
2329 | "node": ">=14.17"
2330 | }
2331 | },
2332 | "node_modules/update-browserslist-db": {
2333 | "version": "1.0.13",
2334 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
2335 | "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
2336 | "dev": true,
2337 | "funding": [
2338 | {
2339 | "type": "opencollective",
2340 | "url": "https://opencollective.com/browserslist"
2341 | },
2342 | {
2343 | "type": "tidelift",
2344 | "url": "https://tidelift.com/funding/github/npm/browserslist"
2345 | },
2346 | {
2347 | "type": "github",
2348 | "url": "https://github.com/sponsors/ai"
2349 | }
2350 | ],
2351 | "dependencies": {
2352 | "escalade": "^3.1.1",
2353 | "picocolors": "^1.0.0"
2354 | },
2355 | "bin": {
2356 | "update-browserslist-db": "cli.js"
2357 | },
2358 | "peerDependencies": {
2359 | "browserslist": ">= 4.21.0"
2360 | }
2361 | },
2362 | "node_modules/util-deprecate": {
2363 | "version": "1.0.2",
2364 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2365 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
2366 | "dev": true
2367 | },
2368 | "node_modules/vite": {
2369 | "version": "5.1.5",
2370 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz",
2371 | "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==",
2372 | "dev": true,
2373 | "dependencies": {
2374 | "esbuild": "^0.19.3",
2375 | "postcss": "^8.4.35",
2376 | "rollup": "^4.2.0"
2377 | },
2378 | "bin": {
2379 | "vite": "bin/vite.js"
2380 | },
2381 | "engines": {
2382 | "node": "^18.0.0 || >=20.0.0"
2383 | },
2384 | "funding": {
2385 | "url": "https://github.com/vitejs/vite?sponsor=1"
2386 | },
2387 | "optionalDependencies": {
2388 | "fsevents": "~2.3.3"
2389 | },
2390 | "peerDependencies": {
2391 | "@types/node": "^18.0.0 || >=20.0.0",
2392 | "less": "*",
2393 | "lightningcss": "^1.21.0",
2394 | "sass": "*",
2395 | "stylus": "*",
2396 | "sugarss": "*",
2397 | "terser": "^5.4.0"
2398 | },
2399 | "peerDependenciesMeta": {
2400 | "@types/node": {
2401 | "optional": true
2402 | },
2403 | "less": {
2404 | "optional": true
2405 | },
2406 | "lightningcss": {
2407 | "optional": true
2408 | },
2409 | "sass": {
2410 | "optional": true
2411 | },
2412 | "stylus": {
2413 | "optional": true
2414 | },
2415 | "sugarss": {
2416 | "optional": true
2417 | },
2418 | "terser": {
2419 | "optional": true
2420 | }
2421 | }
2422 | },
2423 | "node_modules/vue": {
2424 | "version": "3.4.21",
2425 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz",
2426 | "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
2427 | "dependencies": {
2428 | "@vue/compiler-dom": "3.4.21",
2429 | "@vue/compiler-sfc": "3.4.21",
2430 | "@vue/runtime-dom": "3.4.21",
2431 | "@vue/server-renderer": "3.4.21",
2432 | "@vue/shared": "3.4.21"
2433 | },
2434 | "peerDependencies": {
2435 | "typescript": "*"
2436 | },
2437 | "peerDependenciesMeta": {
2438 | "typescript": {
2439 | "optional": true
2440 | }
2441 | }
2442 | },
2443 | "node_modules/vue-github-button": {
2444 | "version": "3.1.0",
2445 | "resolved": "https://registry.npmjs.org/vue-github-button/-/vue-github-button-3.1.0.tgz",
2446 | "integrity": "sha512-S69NFalucetUW4AjMkLlHY/fgTWu6LEGEtehMewXRNLnjODhDvJj4lwt0u0BSPXLTDB+PLk1tWlwx3pw+ItLgQ==",
2447 | "dependencies": {
2448 | "github-buttons": "^2.22.0"
2449 | }
2450 | },
2451 | "node_modules/vue-router": {
2452 | "version": "4.3.0",
2453 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.0.tgz",
2454 | "integrity": "sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==",
2455 | "dependencies": {
2456 | "@vue/devtools-api": "^6.5.1"
2457 | },
2458 | "funding": {
2459 | "url": "https://github.com/sponsors/posva"
2460 | },
2461 | "peerDependencies": {
2462 | "vue": "^3.2.0"
2463 | }
2464 | },
2465 | "node_modules/vue-template-compiler": {
2466 | "version": "2.7.16",
2467 | "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
2468 | "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==",
2469 | "dev": true,
2470 | "dependencies": {
2471 | "de-indent": "^1.0.2",
2472 | "he": "^1.2.0"
2473 | }
2474 | },
2475 | "node_modules/vue-tsc": {
2476 | "version": "1.8.27",
2477 | "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.27.tgz",
2478 | "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==",
2479 | "dev": true,
2480 | "dependencies": {
2481 | "@volar/typescript": "~1.11.1",
2482 | "@vue/language-core": "1.8.27",
2483 | "semver": "^7.5.4"
2484 | },
2485 | "bin": {
2486 | "vue-tsc": "bin/vue-tsc.js"
2487 | },
2488 | "peerDependencies": {
2489 | "typescript": "*"
2490 | }
2491 | },
2492 | "node_modules/which": {
2493 | "version": "2.0.2",
2494 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2495 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2496 | "dev": true,
2497 | "dependencies": {
2498 | "isexe": "^2.0.0"
2499 | },
2500 | "bin": {
2501 | "node-which": "bin/node-which"
2502 | },
2503 | "engines": {
2504 | "node": ">= 8"
2505 | }
2506 | },
2507 | "node_modules/wrap-ansi": {
2508 | "version": "8.1.0",
2509 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
2510 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
2511 | "dev": true,
2512 | "dependencies": {
2513 | "ansi-styles": "^6.1.0",
2514 | "string-width": "^5.0.1",
2515 | "strip-ansi": "^7.0.1"
2516 | },
2517 | "engines": {
2518 | "node": ">=12"
2519 | },
2520 | "funding": {
2521 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2522 | }
2523 | },
2524 | "node_modules/wrap-ansi-cjs": {
2525 | "name": "wrap-ansi",
2526 | "version": "7.0.0",
2527 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
2528 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
2529 | "dev": true,
2530 | "dependencies": {
2531 | "ansi-styles": "^4.0.0",
2532 | "string-width": "^4.1.0",
2533 | "strip-ansi": "^6.0.0"
2534 | },
2535 | "engines": {
2536 | "node": ">=10"
2537 | },
2538 | "funding": {
2539 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2540 | }
2541 | },
2542 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
2543 | "version": "5.0.1",
2544 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2545 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2546 | "dev": true,
2547 | "engines": {
2548 | "node": ">=8"
2549 | }
2550 | },
2551 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
2552 | "version": "4.3.0",
2553 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2554 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2555 | "dev": true,
2556 | "dependencies": {
2557 | "color-convert": "^2.0.1"
2558 | },
2559 | "engines": {
2560 | "node": ">=8"
2561 | },
2562 | "funding": {
2563 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2564 | }
2565 | },
2566 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
2567 | "version": "8.0.0",
2568 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2569 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2570 | "dev": true
2571 | },
2572 | "node_modules/wrap-ansi-cjs/node_modules/string-width": {
2573 | "version": "4.2.3",
2574 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2575 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2576 | "dev": true,
2577 | "dependencies": {
2578 | "emoji-regex": "^8.0.0",
2579 | "is-fullwidth-code-point": "^3.0.0",
2580 | "strip-ansi": "^6.0.1"
2581 | },
2582 | "engines": {
2583 | "node": ">=8"
2584 | }
2585 | },
2586 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
2587 | "version": "6.0.1",
2588 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2589 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2590 | "dev": true,
2591 | "dependencies": {
2592 | "ansi-regex": "^5.0.1"
2593 | },
2594 | "engines": {
2595 | "node": ">=8"
2596 | }
2597 | },
2598 | "node_modules/yallist": {
2599 | "version": "4.0.0",
2600 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
2601 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
2602 | "dev": true
2603 | },
2604 | "node_modules/yaml": {
2605 | "version": "2.4.1",
2606 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
2607 | "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
2608 | "dev": true,
2609 | "bin": {
2610 | "yaml": "bin.mjs"
2611 | },
2612 | "engines": {
2613 | "node": ">= 14"
2614 | }
2615 | }
2616 | }
2617 | }
2618 |
--------------------------------------------------------------------------------