├── docs ├── public │ └── logo.jpg ├── guide │ ├── body-reader.md │ ├── getting-started.md │ ├── responder.md │ ├── cors.md │ ├── cookie.md │ ├── websocket.md │ ├── middleware.md │ └── routing.md ├── 0.5.8 │ ├── index.md │ └── guide │ │ ├── getting-started.md │ │ ├── cors.md │ │ ├── websocket.md │ │ ├── cookie.md │ │ ├── middleware.md │ │ └── routing.md ├── index.md └── .vitepress │ ├── config.mts │ └── moonbit.tmLanguage.json ├── .gitignore ├── package.json └── bun.lock /docs/public/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oboard/mocket-docs/main/docs/public/logo.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # VitePress 2 | docs/.vitepress/dist 3 | docs/.vitepress/cache 4 | node_modules 5 | .DS_Store -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "docs:dev": "vitepress dev docs", 4 | "docs:build": "vitepress build docs", 5 | "docs:preview": "vitepress preview docs" 6 | }, 7 | "devDependencies": { 8 | "mermaid": "^11.12.1", 9 | "vitepress": "^1.6.4", 10 | "vitepress-plugin-mermaid": "^2.0.17" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /docs/guide/body-reader.md: -------------------------------------------------------------------------------- 1 | # Body Reader Guide 2 | 3 | Body reader is Mocket’s unified request body protocol. Route handlers and middlewares read the request body using `HttpRequest::body()`. The runtime uses it to deserialize the body into a type. 4 | 5 | ## Body Reader Trait 6 | ```moonbit 7 | trait BodyReader { 8 | read(Self, buf: @buffer.Buffer) -> Unit 9 | } 10 | ``` 11 | 12 | Common constructs: 13 | 14 | - Text: return `String` / `StringView`. 15 | - JSON: return `Json`. 16 | - Binary: return `Bytes`. 17 | 18 | ## Custom Body Reader 19 | 20 | Implement `BodyReader` for your own type to control deserialization, e.g., CSV: 21 | 22 | ```moonbit 23 | struct Csv(String) 24 | 25 | impl @mocket.BodyReader for Csv with from_request(req) -> Csv raise { 26 | let text: String = req.body() 27 | Csv(text) 28 | } 29 | 30 | let csv: Csv = event.req.body() 31 | ``` 32 | -------------------------------------------------------------------------------- /docs/0.5.8/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # https://vitepress.dev/reference/default-theme-home-page 3 | layout: home 4 | 5 | hero: 6 | name: "Mocket" 7 | text: "MoonBit Web Framework" 8 | tagline: "Documentation for Mocket 0.5.8" 9 | image: 10 | src: /logo.jpg 11 | alt: Mocket 12 | actions: 13 | - theme: brand 14 | text: Get Started (0.5.8) 15 | link: /0.5.8/guide/getting-started 16 | - theme: alt 17 | text: View on GitHub 18 | link: https://github.com/oboard/mocket 19 | --- 20 | ![Version](https://img.shields.io/badge/docs-0.5.8-green) ![visitors](https://visitor-badge.laobi.icu/badge?page_id=mocket-docs-0-5-8) 21 | 22 | ```moonbit 23 | let app = @mocket.new() 24 | app.get("/", _ => Text("Hello, Mocket 0.5.8!")) 25 | app.serve(port=4000) 26 | ``` 27 | 28 | ## About 0.5.8 29 | 30 | This is the stable 0.5.8 documentation snapshot. 31 | 32 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # https://vitepress.dev/reference/default-theme-home-page 3 | layout: home 4 | 5 | hero: 6 | name: "Mocket" 7 | text: "MoonBit Web Framework" 8 | tagline: "Documentation for Mocket" 9 | image: 10 | src: /logo.jpg 11 | alt: Mocket 12 | actions: 13 | - theme: brand 14 | text: Get Started 15 | link: /guide/getting-started 16 | - theme: alt 17 | text: View on GitHub 18 | link: https://github.com/oboard/mocket 19 | --- 20 | 21 | [![Version](https://img.shields.io/badge/dynamic/json?url=https%3A//mooncakes.io/assets/oboard/mocket/resource.json&query=%24.meta_info.version&label=mooncakes&color=yellow)](https://mooncakes.io/docs/oboard/mocket) ![visitors](https://visitor-badge.laobi.icu/badge?page_id=mocket-docs-0-6-0) 22 | 23 | ```moonbit 24 | let app = @mocket.new() 25 | app.get("/", _ => "Hello, Mocket!") 26 | app.serve(port=4000) 27 | ``` -------------------------------------------------------------------------------- /docs/0.5.8/guide/getting-started.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Getting Started (0.5.8) 3 | --- 4 | # Mocket - Getting Started (0.5.8) 5 | [![Version](https://img.shields.io/badge/docs-0.5.8-green)](../) 6 | 7 | A web framework for MoonBit. 8 | 9 | ## Quick Start 10 | 11 | 12 | ```bash 13 | moon add oboard/mocket 14 | ``` 15 | 16 | ```moonbit 17 | let app = @mocket.new() 18 | app.get("/", _ => Text("Hello, Mocket!")) 19 | app.group("/api", group => { 20 | group.get("/status", _ => Json({ "status": "ok" })) 21 | }) 22 | app.serve(port=4000) 23 | ``` 24 | 25 | --- 26 | 27 | 28 | Mocket supports both `js` and `native` backends. 29 | 30 | ### JavaScript Backend 31 | 32 | Set the backend of MoonBit to `js` in `Visual Studio Code` 33 | 34 | Command: `MoonBit: Select Backend` -> `js` 35 | 36 | ```bash 37 | moon run src/example --target js 38 | ``` 39 | 40 | ### Native Backend 41 | 42 | Set the backend of MoonBit to `native` in `Visual Studio Code` 43 | 44 | Command: `MoonBit: Select Backend` -> `native` 45 | 46 | ```bash 47 | moon run src/example --target native 48 | ``` 49 | 50 | Then visit `http://localhost:4000` 51 | 52 | -------------------------------------------------------------------------------- /docs/guide/getting-started.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Getting Started 3 | --- 4 | # Mocket - Getting Started 5 | 6 | [![Version](https://img.shields.io/badge/dynamic/json?url=https%3A//mooncakes.io/assets/oboard/mocket/resource.json&query=%24.meta_info.version&label=mooncakes&color=yellow)](https://mooncakes.io/docs/oboard/mocket) 7 | 8 | A web framework for MoonBit. 9 | 10 | ## Quick Start 11 | 12 | 13 | ```bash 14 | moon add oboard/mocket 15 | ``` 16 | 17 | ```moonbit 18 | let app = @mocket.new() 19 | app.get("/", _ => "Hello, Mocket!") 20 | app.group("/api", group => { 21 | group.get("/status", _ => ({ "status": "ok" } : Json)) 22 | }) 23 | app.serve(port=4000) 24 | ``` 25 | 26 | --- 27 | 28 | 29 | Mocket supports both `js` and `native` backends. 30 | 31 | ### JavaScript Backend 32 | 33 | Set the backend of MoonBit to `js` in `Visual Studio Code` 34 | 35 | Command: `MoonBit: Select Backend` -> `js` 36 | 37 | ```bash 38 | moon run src/example --target js 39 | ``` 40 | 41 | ### Native Backend 42 | 43 | Set the backend of MoonBit to `native` in `Visual Studio Code` 44 | 45 | Command: `MoonBit: Select Backend` -> `native` 46 | 47 | ```bash 48 | moon run src/example --target native 49 | ``` 50 | 51 | Then visit `http://localhost:4000` 52 | -------------------------------------------------------------------------------- /docs/guide/responder.md: -------------------------------------------------------------------------------- 1 | # Responder Guide 2 | 3 | Responder is Mocket’s unified response protocol. Route handlers and middlewares return an object that implements `Responder`. The runtime uses it to populate `HttpResponse` headers and status, and to serialize the body. 4 | 5 | ## Responder Trait 6 | ```moonbit 7 | trait Responder { 8 | options(Self, res: HttpResponse) -> Unit 9 | output(Self, buf: @buffer.Buffer) -> Unit 10 | } 11 | ``` 12 | 13 | Common constructs: 14 | 15 | - Text: return `String` / `StringView`. 16 | - JSON: return `Json` or an object’s `.to_json()`; or `HttpResponse::json(...)`. 17 | - Binary: return `Bytes`. 18 | - HTML: use `html(showable)`. 19 | - Full response: return `HttpResponse::new(...).to_responder()`. 20 | 21 | ## Custom Responder 22 | 23 | Implement `Responder` for your own type to control headers and serialization, e.g., CSV: 24 | 25 | ```moonbit 26 | struct Csv(String) 27 | 28 | impl @mocket.Responder for Csv with options(_, res) -> Unit { 29 | res.headers["Content-Type"] = "text/csv; charset=utf-8" 30 | } 31 | 32 | impl @mocket.Responder for Csv with output(self, buf) -> Unit { 33 | buf.write_bytes(@encoding/utf8.encode(self.0)) 34 | } 35 | 36 | @mocket.HttpResponse::new(OK).body(Csv("a,b,c\n1,2,3")) 37 | ``` 38 | 39 | ## Usage Example 40 | 41 | ```moonbit 42 | // Text Response 43 | app.get("/", _event => "⚡️ Tadaa!") 44 | 45 | // JSON Request 46 | // curl --location 'localhost:4000/json' \ 47 | // --header 'Content-Type: application/json' \ 48 | // --data '{ 49 | // "name": "oboard", 50 | // "age": 21 51 | // }' 52 | app.post("/json", event => try { 53 | let person : Person = event.req.body() 54 | HttpResponse::new(OK).body( 55 | "Hello, \{person.name}. You are \{person.age} years old.", 56 | ) 57 | } catch { 58 | _ => HttpResponse::new(BadRequest).body("Invalid JSON") 59 | }) 60 | 61 | // Echo Server 62 | app.post("/echo", e => e.req) 63 | ``` 64 | -------------------------------------------------------------------------------- /docs/guide/cors.md: -------------------------------------------------------------------------------- 1 | # CORS 2 | 3 | Mocket provides built-in support for Cross-Origin Resource Sharing (CORS) through the `handle_cors` middleware. 4 | 5 | ## Usage 6 | 7 | To enable CORS, use the `handle_cors` middleware in your application or route group. 8 | 9 | ```moonbit 10 | let app = @mocket.new() 11 | 12 | // Enable CORS for all routes with default settings 13 | app.use_middleware(@cors.handle_cors()) 14 | 15 | // Or configure specific CORS options 16 | app.use_middleware(@cors.handle_cors(origin="https://example.com")) 17 | 18 | app.get("/api/data", _ => ({ "data": "protected data" } : Json)) 19 | ``` 20 | 21 | ## Configuration 22 | 23 | The `handle_cors` function accepts the following optional arguments: 24 | 25 | | Parameter | Type | Default | Description | 26 | | :--------------- | :------- | :------ | :----------------------------------------------------------- | 27 | | `origin` | `String` | `"*"` | The value for `Access-Control-Allow-Origin` header. | 28 | | `methods` | `String` | `"*"` | The value for `Access-Control-Allow-Methods` header. | 29 | | `allow_headers` | `String` | `"*"` | The value for `Access-Control-Allow-Headers` header. | 30 | | `expose_headers` | `String` | `"*"` | The value for `Access-Control-Expose-Headers` header. | 31 | | `credentials` | `Bool` | `false` | Whether to set `Access-Control-Allow-Credentials` to "true". | 32 | | `max_age` | `Int` | `86400` | The value for `Access-Control-Max-Age` header (in seconds). | 33 | 34 | ## Preflight Requests 35 | 36 | The middleware automatically handles `OPTIONS` requests (preflight requests). 37 | 38 | - If it detects a preflight request, it sets the appropriate headers and returns an empty response, stopping further middleware execution. 39 | - For normal requests, it sets the CORS headers and proceeds to the next middleware or handler. 40 | 41 | -------------------------------------------------------------------------------- /docs/0.5.8/guide/cors.md: -------------------------------------------------------------------------------- 1 | # CORS (0.5.8) 2 | 3 | Mocket provides built-in support for Cross-Origin Resource Sharing (CORS) through the `handle_cors` middleware. 4 | 5 | ## Usage 6 | 7 | To enable CORS, use the `handle_cors` middleware in your application or route group. 8 | 9 | ```moonbit 10 | let app = @mocket.new() 11 | 12 | // Enable CORS for all routes with default settings 13 | app.use_middleware(@cors.handle_cors()) 14 | 15 | // Or configure specific CORS options 16 | app.use_middleware(@cors.handle_cors(origin="https://example.com")) 17 | 18 | app.get("/api/data", _ => Json({ "data": "protected data" })) 19 | ``` 20 | 21 | ## Configuration 22 | 23 | The `handle_cors` function accepts the following optional arguments: 24 | 25 | | Parameter | Type | Default | Description | 26 | | :--------------- | :------- | :------ | :----------------------------------------------------------- | 27 | | `origin` | `String` | `"*"` | The value for `Access-Control-Allow-Origin` header. | 28 | | `methods` | `String` | `"*"` | The value for `Access-Control-Allow-Methods` header. | 29 | | `allow_headers` | `String` | `"*"` | The value for `Access-Control-Allow-Headers` header. | 30 | | `expose_headers` | `String` | `"*"` | The value for `Access-Control-Expose-Headers` header. | 31 | | `credentials` | `Bool` | `false` | Whether to set `Access-Control-Allow-Credentials` to "true". | 32 | | `max_age` | `Int` | `86400` | The value for `Access-Control-Max-Age` header (in seconds). | 33 | 34 | ## Preflight Requests 35 | 36 | The middleware automatically handles `OPTIONS` requests (preflight requests). 37 | 38 | - If it detects a preflight request, it sets the appropriate headers and returns an empty response, stopping further middleware execution. 39 | - For normal requests, it sets the CORS headers and proceeds to the next middleware or handler. 40 | 41 | -------------------------------------------------------------------------------- /docs/0.5.8/guide/websocket.md: -------------------------------------------------------------------------------- 1 | # WebSocket (0.5.8) 2 | 3 | Mocket supports WebSocket connections, allowing you to build real-time applications. 4 | 5 | ## Usage 6 | 7 | Use the `ws` method on your application instance to register a WebSocket route. 8 | 9 | ```moonbit 10 | let app = @mocket.new() 11 | 12 | app.ws("/ws", event => match event { 13 | Open(peer) => println("Client connected: " + peer.to_string()) 14 | Message(peer, body) => { 15 | match body { 16 | Text(msg) => { 17 | println("Received: " + msg) 18 | peer.send("Echo: " + msg) 19 | } 20 | _ => () 21 | } 22 | } 23 | Close(peer) => println("Client disconnected: " + peer.to_string()) 24 | }) 25 | 26 | app.serve(port=8080) 27 | ``` 28 | 29 | ## WebSocket Events 30 | 31 | The handler function receives a `WebSocketEvent` enum: 32 | 33 | - `Open(WebSocketPeer)`: Triggered when a new connection is established. 34 | - `Message(WebSocketPeer, HttpBody)`: Triggered when a message is received. The body can be `Text` or other types. 35 | - `Close(WebSocketPeer)`: Triggered when the connection is closed. 36 | 37 | ## WebSocketPeer 38 | 39 | The `WebSocketPeer` struct represents a connected client and provides methods to interact with it. 40 | 41 | ### Methods 42 | 43 | - `send(message: String)`: Sends a text message to the client. 44 | - `subscribe(channel: String)`: Subscribes the client to a pub/sub channel. 45 | - `unsubscribe(channel: String)`: Unsubscribes the client from a channel. 46 | - `publish(channel: String, message: String)`: Publishes a message to a channel (broadcasts to all subscribers). 47 | 48 | ## Pub/Sub Example 49 | 50 | You can use the built-in pub/sub mechanism to broadcast messages to multiple clients. 51 | 52 | ```moonbit 53 | app.ws("/chat", event => match event { 54 | Open(peer) => { 55 | peer.subscribe("chat_room") 56 | @mocket.WebSocketPeer::publish("chat_room", "User joined") 57 | } 58 | Message(peer, body) => { 59 | match body { 60 | Text(msg) => @mocket.WebSocketPeer::publish("chat_room", msg) 61 | _ => () 62 | } 63 | } 64 | Close(peer) => { 65 | peer.unsubscribe("chat_room") 66 | } 67 | }) 68 | ``` 69 | 70 | -------------------------------------------------------------------------------- /docs/guide/cookie.md: -------------------------------------------------------------------------------- 1 | # Cookies 2 | 3 | Mocket provides methods to read and write cookies in your handlers. 4 | 5 | ## Usage 6 | 7 | ### Setting Cookies 8 | 9 | Use `res.set_cookie` to set a cookie on the response. 10 | 11 | ```moonbit 12 | app.get("/login", event => { 13 | event.res.set_cookie("session_id", "12345", max_age=3600, http_only=true) 14 | "Logged in" 15 | }) 16 | ``` 17 | 18 | ### Getting Cookies 19 | 20 | Use `req.get_cookie` to retrieve a cookie from the request. 21 | 22 | ```moonbit 23 | app.get("/dashboard", event => { 24 | match event.req.get_cookie("session_id") { 25 | Some(cookie) => "Session ID: " + cookie.value 26 | None => "Not logged in" 27 | } 28 | }) 29 | ``` 30 | 31 | ### Deleting Cookies 32 | 33 | Use `res.delete_cookie` to delete a cookie (by setting its expiration date to the past). 34 | 35 | ```moonbit 36 | app.get("/logout", event => { 37 | event.res.delete_cookie("session_id") 38 | "Logged out" 39 | }) 40 | ``` 41 | 42 | ## API Reference 43 | 44 | ### `HttpResponse::set_cookie` 45 | 46 | ```moonbit 47 | pub fn set_cookie( 48 | self : HttpResponse, 49 | name : String, 50 | value : String, 51 | max_age? : Int, 52 | path? : String, 53 | domain? : String, 54 | secure? : Bool, 55 | http_only? : Bool, 56 | same_site? : SameSiteOption, 57 | ) -> Unit 58 | ``` 59 | 60 | - `name`: The name of the cookie. 61 | - `value`: The value of the cookie. 62 | - `max_age`: Max age in seconds. 63 | - `path`: The path for the cookie. 64 | - `domain`: The domain for the cookie. 65 | - `secure`: If true, the cookie is only sent over HTTPS. 66 | - `http_only`: If true, the cookie is not accessible via JavaScript. 67 | - `same_site`: Controls the `SameSite` attribute (`Lax`, `Strict`, or `None`). 68 | 69 | ### `HttpRequest::get_cookie` 70 | 71 | ```moonbit 72 | pub fn get_cookie(self : HttpRequest, name : String) -> CookieItem? 73 | ``` 74 | 75 | Returns `Some(CookieItem)` if the cookie exists, or `None`. 76 | 77 | ### `CookieItem` 78 | 79 | The `CookieItem` struct contains the details of a cookie: 80 | 81 | ```moonbit 82 | pub struct CookieItem { 83 | name : String 84 | value : String 85 | max_age : Int? 86 | path : String? 87 | domain : String? 88 | secure : Bool? 89 | http_only : Bool? 90 | same_site : SameSiteOption? 91 | } 92 | ``` 93 | -------------------------------------------------------------------------------- /docs/0.5.8/guide/cookie.md: -------------------------------------------------------------------------------- 1 | # Cookies (0.5.8) 2 | 3 | Mocket provides methods to read and write cookies in your handlers. 4 | 5 | ## Usage 6 | 7 | ### Setting Cookies 8 | 9 | Use `res.set_cookie` to set a cookie on the response. 10 | 11 | ```moonbit 12 | app.get("/login", event => { 13 | event.res.set_cookie("session_id", "12345", max_age=3600, http_only=true) 14 | Text("Logged in") 15 | }) 16 | ``` 17 | 18 | ### Getting Cookies 19 | 20 | Use `req.get_cookie` to retrieve a cookie from the request. 21 | 22 | ```moonbit 23 | app.get("/dashboard", event => { 24 | match event.req.get_cookie("session_id") { 25 | Some(cookie) => Text("Session ID: " + cookie.value) 26 | None => Text("Not logged in") 27 | } 28 | }) 29 | ``` 30 | 31 | ### Deleting Cookies 32 | 33 | Use `res.delete_cookie` to delete a cookie (by setting its expiration date to the past). 34 | 35 | ```moonbit 36 | app.get("/logout", event => { 37 | event.res.delete_cookie("session_id") 38 | Text("Logged out") 39 | }) 40 | ``` 41 | 42 | ## API Reference 43 | 44 | ### `HttpResponse::set_cookie` 45 | 46 | ```moonbit 47 | pub fn set_cookie( 48 | self : HttpResponse, 49 | name : String, 50 | value : String, 51 | max_age? : Int, 52 | path? : String, 53 | domain? : String, 54 | secure? : Bool, 55 | http_only? : Bool, 56 | same_site? : SameSiteOption, 57 | ) -> Unit 58 | ``` 59 | 60 | - `name`: The name of the cookie. 61 | - `value`: The value of the cookie. 62 | - `max_age`: Max age in seconds. 63 | - `path`: The path for the cookie. 64 | - `domain`: The domain for the cookie. 65 | - `secure`: If true, the cookie is only sent over HTTPS. 66 | - `http_only`: If true, the cookie is not accessible via JavaScript. 67 | - `same_site`: Controls the `SameSite` attribute (`Lax`, `Strict`, or `None`). 68 | 69 | ### `HttpRequest::get_cookie` 70 | 71 | ```moonbit 72 | pub fn get_cookie(self : HttpRequest, name : String) -> CookieItem? 73 | ``` 74 | 75 | Returns `Some(CookieItem)` if the cookie exists, or `None`. 76 | 77 | ### `CookieItem` 78 | 79 | The `CookieItem` struct contains the details of a cookie: 80 | 81 | ```moonbit 82 | pub struct CookieItem { 83 | name : String 84 | value : String 85 | max_age : Int? 86 | path : String? 87 | domain : String? 88 | secure : Bool? 89 | http_only : Bool? 90 | same_site : SameSiteOption? 91 | } 92 | ``` 93 | 94 | -------------------------------------------------------------------------------- /docs/guide/websocket.md: -------------------------------------------------------------------------------- 1 | # WebSocket 2 | 3 | Mocket supports WebSocket connections, allowing you to build real-time applications. 4 | 5 | ## Usage 6 | 7 | Use the `ws` method on your application instance to register a WebSocket route. 8 | 9 | ```moonbit 10 | fn main { 11 | let app = @mocket.new() 12 | app.ws("/ws", event => match event { 13 | Open(peer) => println("WS open: " + peer.to_string()) 14 | Message(peer, msg) => 15 | match msg { 16 | Text(s) => { 17 | println("WS message: " + s) 18 | peer.text(s) 19 | } 20 | Binary(bytes) => { 21 | println("WS binary: " + bytes.length().to_string() + " bytes") 22 | peer.binary(bytes) 23 | } 24 | Ping => { 25 | println("WS ping") 26 | peer.pong() 27 | } 28 | } 29 | Close(peer) => println("WS close: " + peer.to_string()) 30 | }) 31 | println("WebSocket echo server listening on ws://localhost:8080/ws") 32 | app.serve(port=8080) 33 | } 34 | ``` 35 | 36 | ## WebSocket Events 37 | 38 | The handler function receives a `WebSocketEvent` enum: 39 | 40 | - `Open(WebSocketPeer)`: Triggered when a new connection is established. 41 | - `Message(WebSocketPeer, WebSocketAggregatedMessage)`: Triggered when a message is received. The body can be `Text` or `Binary` or `Ping`. 42 | - `Close(WebSocketPeer)`: Triggered when the connection is closed. 43 | 44 | ## WebSocketPeer 45 | 46 | The `WebSocketPeer` struct represents a connected client and provides methods to interact with it. 47 | 48 | ### Methods 49 | 50 | - `send(message: String)`: Sends a text message to the client. 51 | - `subscribe(channel: String)`: Subscribes the client to a pub/sub channel. 52 | - `unsubscribe(channel: String)`: Unsubscribes the client from a channel. 53 | - `publish(channel: String, message: String)`: Publishes a message to a channel (broadcasts to all subscribers). 54 | 55 | ## Pub/Sub Example 56 | 57 | You can use the built-in pub/sub mechanism to broadcast messages to multiple clients. 58 | 59 | ```moonbit 60 | app.ws("/chat", event => match event { 61 | Open(peer) => { 62 | peer.subscribe("chat_room") 63 | @mocket.WebSocketPeer::publish("chat_room", "User joined") 64 | } 65 | Message(peer, msg) => { 66 | match msg { 67 | Text(msg) => @mocket.WebSocketPeer::publish("chat_room", msg) 68 | _ => () 69 | } 70 | } 71 | Close(peer) => { 72 | peer.unsubscribe("chat_room") 73 | } 74 | }) 75 | ``` 76 | 77 | -------------------------------------------------------------------------------- /docs/.vitepress/config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vitepress"; 2 | import { withMermaid } from "vitepress-plugin-mermaid"; 3 | 4 | // https://vitepress.dev/reference/site-config 5 | export default withMermaid( 6 | defineConfig({ 7 | title: "Mocket - MoonBit Web Framework", 8 | description: "A multi-target HTTP server framework for MoonBit.", 9 | 10 | head: [["link", { rel: "icon", href: "/logo.jpg" }]], 11 | themeConfig: { 12 | // https://vitepress.dev/reference/default-theme-config 13 | nav: [ 14 | { text: "Home", link: "/" }, 15 | { text: "Guide", link: "/guide/getting-started" }, 16 | { 17 | text: "Version", 18 | items: [ 19 | { text: "0.6.0 (latest)", link: "/" }, 20 | { text: "0.5.8", link: "/0.5.8/" }, 21 | ], 22 | }, 23 | ], 24 | 25 | sidebar: { 26 | "/guide/": [ 27 | { text: "🚀 Getting Started", link: "/guide/getting-started" }, 28 | { text: "🚦 Routing", link: "/guide/routing" }, 29 | { text: "📡 Responder", link: "/guide/responder" }, 30 | { text: "📝 Body Reader", link: "/guide/body-reader" }, 31 | { text: "🧩 Middleware", link: "/guide/middleware" }, 32 | { text: "🍪 Cookie", link: "/guide/cookie" }, 33 | { text: "🛡️ CORS", link: "/guide/cors" }, 34 | { text: "⚡ WebSocket", link: "/guide/websocket" }, 35 | ], 36 | "/0.5.8/guide/": [ 37 | { text: "🚀 Getting Started", link: "/0.5.8/guide/getting-started" }, 38 | { text: "🚦 Routing", link: "/0.5.8/guide/routing" }, 39 | { text: "🧩 Middleware", link: "/0.5.8/guide/middleware" }, 40 | { text: "🍪 Cookie", link: "/0.5.8/guide/cookie" }, 41 | { text: "🛡️ CORS", link: "/0.5.8/guide/cors" }, 42 | { text: "⚡ WebSocket", link: "/0.5.8/guide/websocket" }, 43 | ], 44 | }, 45 | 46 | socialLinks: [ 47 | { icon: "github", link: "https://github.com/oboard/mocket" }, 48 | { 49 | icon: "qq", 50 | link: "https://qm.qq.com/q/VtXeEDJcAg", 51 | ariaLabel: "QQ群 949886784", 52 | }, 53 | ], 54 | 55 | search: { 56 | provider: "local", 57 | }, 58 | 59 | editLink: { 60 | pattern: "https://github.com/oboard/mocket/edit/main/docs/:path", 61 | }, 62 | 63 | footer: { 64 | message: "Released under the Apache 2.0 License.", 65 | copyright: "Copyright © 2025 oboard", 66 | }, 67 | }, 68 | 69 | // Mermaid configuration 70 | mermaid: { 71 | theme: "default", 72 | }, 73 | 74 | // Shiki configuration for syntax highlighting 75 | markdown: { 76 | theme: { 77 | light: "github-light", 78 | dark: "github-dark", 79 | }, 80 | languages: [import("./moonbit.tmLanguage.json") as any], 81 | }, 82 | }) 83 | ); 84 | -------------------------------------------------------------------------------- /docs/0.5.8/guide/middleware.md: -------------------------------------------------------------------------------- 1 | # Middleware (0.5.8) 2 | 3 | Middleware functions are functions that have access to the request object (`req`), the response object (`res`), and the next middleware function in the application’s request-response cycle. 4 | 5 | ## Overview 6 | 7 | Mocket uses an "Onion Model" for middleware execution. When a request comes in, it passes through the middleware layers one by one until it reaches the final route handler. Then, the response bubbles back up through the layers. 8 | 9 | Middleware can perform the following tasks: 10 | 11 | - Execute any code. 12 | - Make changes to the request and the response objects. 13 | - End the request-response cycle. 14 | - Call the next middleware in the stack. 15 | 16 | ## Usage 17 | 18 | You can register middleware using the `use` method on your application instance. 19 | 20 | ```moonbit 21 | let app = @mocket.new() 22 | 23 | // Global middleware 24 | app.use_middleware(my_middleware) 25 | 26 | // Path-specific middleware 27 | app.use_middleware(my_middleware, base_path="/api") 28 | ``` 29 | 30 | ## Writing Middleware 31 | 32 | A middleware function takes a `MocketEvent` and a `next` function as arguments. It must return an `HttpBody`. 33 | 34 | ```moonbit 35 | pub async fn my_middleware( 36 | event : @mocket.MocketEvent, 37 | next : async () -> @mocket.HttpBody noraise 38 | ) -> @mocket.HttpBody noraise { 39 | // Pre-processing 40 | println("Request received: " + event.req.path) 41 | 42 | // Call the next middleware/handler 43 | let result = next() 44 | 45 | // Post-processing 46 | println("Response sent") 47 | 48 | result 49 | } 50 | ``` 51 | 52 | ### Example: Logger Middleware 53 | 54 | Here is a simple logger middleware that logs the request method and path. 55 | 56 | ```moonbit 57 | pub async fn logger_middleware( 58 | event : @mocket.MocketEvent, 59 | next : async () -> @mocket.HttpBody noraise, 60 | ) -> @mocket.HttpBody noraise { 61 | let start_time = @env.now() 62 | let res = next() 63 | let duration = @env.now() - start_time 64 | println("\{event.req.http_method} \{event.req.url} - \{duration}ms") 65 | res 66 | } 67 | ``` 68 | 69 | ### Example: Authentication Middleware 70 | 71 | Middleware can also intercept requests and return a response early, effectively blocking access. 72 | 73 | ```moonbit 74 | pub async fn auth_middleware( 75 | event : @mocket.MocketEvent, 76 | next : async () -> @mocket.HttpBody noraise 77 | ) -> @mocket.HttpBody noraise { 78 | match event.req.headers.get("Authorization") { 79 | Some(token) => { 80 | if validate_token(token) { 81 | next() 82 | } else { 83 | Json({ "error": "Invalid token" }) 84 | } 85 | } 86 | None => Json({ "error": "Unauthorized" }) 87 | } 88 | } 89 | ``` 90 | 91 | ## Built-in Middleware 92 | 93 | Mocket comes with some built-in middleware: 94 | 95 | - **CORS**: Handles Cross-Origin Resource Sharing. See [CORS](./cors.md) for details. 96 | 97 | -------------------------------------------------------------------------------- /docs/guide/middleware.md: -------------------------------------------------------------------------------- 1 | # Middleware 2 | 3 | Middleware functions are functions that have access to the request object (`req`), the response object (`res`), and the next middleware function in the application’s request-response cycle. 4 | 5 | ## Overview 6 | 7 | Mocket uses an "Onion Model" for middleware execution. When a request comes in, it passes through the middleware layers one by one until it reaches the final route handler. Then, the response bubbles back up through the layers. 8 | 9 | Middleware can perform the following tasks: 10 | 11 | - Execute any code. 12 | - Make changes to the request and the response objects. 13 | - End the request-response cycle. 14 | - Call the next middleware in the stack. 15 | 16 | ## Usage 17 | 18 | You can register middleware using the `use` method on your application instance. 19 | 20 | ```moonbit 21 | let app = @mocket.new() 22 | 23 | // Global middleware 24 | app.use_middleware(my_middleware) 25 | 26 | // Path-specific middleware 27 | app.use_middleware(my_middleware, base_path="/api") 28 | ``` 29 | 30 | ## Writing Middleware 31 | 32 | A middleware function takes a `MocketEvent` and a `next` function as arguments. It must return an `HttpBody`. 33 | 34 | ```moonbit 35 | pub async fn my_middleware( 36 | event : @mocket.MocketEvent, 37 | next : async () -> &@mocket.Responder noraise, 38 | ) -> &@mocket.Responder noraise { 39 | // Pre-processing 40 | println("Request received: " + event.req.path) 41 | 42 | // Call the next middleware/handler 43 | let result = next() 44 | 45 | // Post-processing 46 | println("Response sent") 47 | 48 | result 49 | } 50 | ``` 51 | 52 | ### Example: Logger Middleware 53 | 54 | Here is a simple logger middleware that logs the request method and path. 55 | 56 | ```moonbit 57 | pub async fn logger_middleware( 58 | event : @mocket.MocketEvent, 59 | next : async () -> &@mocket.Responder noraise, 60 | ) -> &@mocket.Responder noraise { 61 | let start_time = @env.now() 62 | let res = next() 63 | let duration = @env.now() - start_time 64 | println("\{event.req.http_method} \{event.req.url} - \{duration}ms") 65 | res 66 | } 67 | 68 | ``` 69 | 70 | ### Example: Authentication Middleware 71 | 72 | Middleware can also intercept requests and return a response early, effectively blocking access. 73 | 74 | ```moonbit 75 | pub async fn auth_middleware( 76 | event : @mocket.MocketEvent, 77 | next : async () -> &@mocket.Responder noraise, 78 | ) -> &@mocket.Responder noraise { 79 | match event.req.headers.get("Authorization") { 80 | Some(token) => { 81 | if validate_token(token) { 82 | next() 83 | } else { 84 | HttpResponse::new(Unauthorized).json({ "error": "Invalid token" }) 85 | } 86 | } 87 | None => HttpResponse::new(Unauthorized).json({ "error": "Unauthorized" }) 88 | } 89 | } 90 | ``` 91 | 92 | ## Built-in Middleware 93 | 94 | Mocket comes with some built-in middleware: 95 | 96 | - **CORS**: Handles Cross-Origin Resource Sharing. See [CORS](./cors.md) for details. 97 | -------------------------------------------------------------------------------- /docs/guide/routing.md: -------------------------------------------------------------------------------- 1 | # Routing 2 | 3 | Mocket's routing system maps incoming HTTP requests to handler functions. It provides an Express.js-like API with optimized performance for both static and dynamic routes. 4 | 5 | ## Basic Routing 6 | 7 | ### HTTP Methods 8 | 9 | Register routes using HTTP method functions: 10 | 11 | ```moonbit 12 | let app = @mocket.new(logger=mocket.new_production_logger()) 13 | 14 | app.get("/", _event => "GET request") 15 | 16 | app.post("/users", _event => ({ "message": "User created" } : Json)) 17 | 18 | app.put("/users/:id", _event => "User updated") 19 | 20 | app.delete("/users/:id", _event => "User deleted") 21 | ``` 22 | 23 | Available methods: `get`, `post`, `put`, `patch`, `delete`, `head`, `options`, `trace`, `connect` 24 | 25 | ### Catch-All Routes 26 | 27 | Use `all()` to handle any HTTP method: 28 | 29 | ```moonbit 30 | app.all("/api/*", _event => "API endpoint") 31 | ``` 32 | 33 | ## Route Patterns 34 | 35 | ### Static Routes 36 | 37 | Static routes match exact paths: 38 | 39 | ```moonbit 40 | app.get("/about", handler) 41 | app.get("/contact", handler) 42 | app.get("/api/status", handler) 43 | ``` 44 | 45 | ### Dynamic Routes 46 | 47 | Dynamic routes use parameters and wildcards: 48 | 49 | #### Path Parameters 50 | 51 | Use `:parameter` to capture path segments: 52 | 53 | ```moonbit 54 | app.get("/users/:id", fn(event) { 55 | let user_id = event.params["id"] 56 | "User ID: " + user_id 57 | }) 58 | 59 | app.get("/users/:id/posts/:post_id", event => { 60 | let user_id = event.params.get("id").unwrap_or("unknown") 61 | let post_id = event.params.get("post_id").unwrap_or("unknown") 62 | ({ "user_id": user_id, "post_id": post_id } : Json) 63 | }) 64 | ``` 65 | 66 | #### Wildcards 67 | 68 | Use `*` to match any path segment: 69 | 70 | ```moonbit 71 | app.get("/files/*", event => { 72 | let file_path = event.params.get("_").unwrap_or("") 73 | "File path: " + file_path 74 | }) 75 | ``` 76 | 77 | ## Route Matching 78 | 79 | ### Matching Priority 80 | 81 | Routes are matched in the order they are registered: 82 | 83 | ```moonbit 84 | app.get("/users/admin", _event => "Admin user") // This will match first 85 | 86 | app.get("/users/:id", _event => "Regular user") // This won't match for /users/admin 87 | ``` 88 | 89 | 90 | 91 | ### Performance Characteristics 92 | 93 | ## Route Groups 94 | 95 | Group related routes with common prefixes: 96 | 97 | ```moonbit 98 | // API v1 routes 99 | let api_v1 = mocket.group("/api/v1") 100 | api_v1.get("/users", get_users_handler) 101 | api_v1.post("/users", create_user_handler) 102 | api_v1.get("/users/:id", get_user_handler) 103 | 104 | // API v2 routes 105 | let api_v2 = mocket.group("/api/v2") 106 | api_v2.get("/users", get_users_v2_handler) 107 | api_v2.post("/users", create_user_v2_handler) 108 | ``` 109 | 110 | ## Advanced Patterns 111 | 112 | ### Optional Parameters 113 | 114 | ```moonbit 115 | app.get("/posts/:id?", event => { 116 | match event.params.get("id") { 117 | Some(id) => "Post ID: " + id 118 | None => "All posts" 119 | } 120 | }) 121 | ``` 122 | 123 | ### Multiple Parameters 124 | 125 | ```moonbit 126 | app.get("/api/:version/users/:id/posts/:post_id", event => { 127 | event.params 128 | }) 129 | ``` 130 | -------------------------------------------------------------------------------- /docs/0.5.8/guide/routing.md: -------------------------------------------------------------------------------- 1 | # Routing (0.5.8) 2 | 3 | Mocket's routing system maps incoming HTTP requests to handler functions. It provides an Express.js-like API with optimized performance for both static and dynamic routes. 4 | 5 | ## Basic Routing 6 | 7 | ### HTTP Methods 8 | 9 | Register routes using HTTP method functions: 10 | 11 | ```moonbit 12 | let app = @mocket.new(logger=mocket.new_production_logger()) 13 | 14 | app.get("/", _event => Text("GET request")) 15 | 16 | app.post("/users", _event => Json({ "message": "User created" })) 17 | 18 | app.put("/users/:id", _event => Text("User updated")) 19 | 20 | app.delete("/users/:id", _event => Text("User deleted")) 21 | ``` 22 | 23 | Available methods: `get`, `post`, `put`, `patch`, `delete`, `head`, `options`, `trace`, `connect` 24 | 25 | ### Catch-All Routes 26 | 27 | Use `all()` to handle any HTTP method: 28 | 29 | ```moonbit 30 | app.all("/api/*", _event => Text("API endpoint")) 31 | ``` 32 | 33 | ## Route Patterns 34 | 35 | ### Static Routes 36 | 37 | Static routes match exact paths: 38 | 39 | ```moonbit 40 | app.get("/about", handler) 41 | app.get("/contact", handler) 42 | app.get("/api/status", handler) 43 | ``` 44 | 45 | ### Dynamic Routes 46 | 47 | Dynamic routes use parameters and wildcards: 48 | 49 | #### Path Parameters 50 | 51 | Use `:parameter` to capture path segments: 52 | 53 | ```moonbit 54 | app.get("/users/:id", fn(event) { 55 | let user_id = event.params["id"] 56 | event.text("User ID: " + user_id) 57 | }) 58 | 59 | app.get("/users/:id/posts/:post_id", event => { 60 | let user_id = event.params.get("id").unwrap_or("unknown") 61 | let post_id = event.params.get("post_id").unwrap_or("unknown") 62 | Json({ "user_id": user_id, "post_id": post_id }) 63 | }) 64 | ``` 65 | 66 | #### Wildcards 67 | 68 | Use `*` to match any path segment: 69 | 70 | ```moonbit 71 | app.get("/files/*", event => { 72 | let file_path = event.params.get("_").unwrap_or("") 73 | Text("File path: " + file_path) 74 | }) 75 | ``` 76 | 77 | ## Route Matching 78 | 79 | ### Matching Priority 80 | 81 | Routes are matched in the order they are registered: 82 | 83 | ```moonbit 84 | app.get("/users/admin", _event => Text("Admin user")) // This will match first 85 | 86 | app.get("/users/:id", _event => Text("Regular user")) // This won't match for /users/admin 87 | ``` 88 | 89 | ### Performance Characteristics 90 | 91 | ## Route Groups 92 | 93 | Group related routes with common prefixes: 94 | 95 | ```moonbit 96 | // API v1 routes 97 | let api_v1 = mocket.group("/api/v1") 98 | api_v1.get("/users", get_users_handler) 99 | api_v1.post("/users", create_user_handler) 100 | api_v1.get("/users/:id", get_user_handler) 101 | 102 | // API v2 routes 103 | let api_v2 = mocket.group("/api/v2") 104 | api_v2.get("/users", get_users_v2_handler) 105 | api_v2.post("/users", create_user_v2_handler) 106 | ``` 107 | 108 | ## Advanced Patterns 109 | 110 | ### Optional Parameters 111 | 112 | ```moonbit 113 | app.get("/posts/:id?", event => { 114 | match event.params.get("id") { 115 | Some(id) => Text("Post ID: " + id) 116 | None => Text("All posts") 117 | } 118 | }) 119 | ``` 120 | 121 | ### Multiple Parameters 122 | 123 | ```moonbit 124 | app.get("/api/:version/users/:id/posts/:post_id", event => { 125 | Json(event.params) 126 | }) 127 | ``` 128 | 129 | -------------------------------------------------------------------------------- /docs/.vitepress/moonbit.tmLanguage.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", 3 | "name": "moonbit", 4 | "scopeName": "source.moonbit", 5 | "fileTypes": ["mbt"], 6 | "patterns": [ 7 | { 8 | "include": "#strings" 9 | }, 10 | { 11 | "include": "#comments" 12 | }, 13 | { 14 | "include": "#constants" 15 | }, 16 | { 17 | "include": "#keywords" 18 | }, 19 | { 20 | "include": "#functions" 21 | }, 22 | { 23 | "include": "#support" 24 | }, 25 | { 26 | "include": "#types" 27 | }, 28 | { 29 | "include": "#modules" 30 | }, 31 | { 32 | "include": "#variables" 33 | } 34 | ], 35 | "repository": { 36 | "support": { 37 | "patterns": [ 38 | { 39 | "name": "support.class.moonbit", 40 | "match": "\\b(Eq|Compare|Hash|Show|Default|ToJson|FromJson)\\b" 41 | } 42 | ] 43 | }, 44 | "keywords": { 45 | "patterns": [ 46 | { 47 | "name": "keyword.control.moonbit", 48 | "match": "\\b(guard|if|while|break|continue|return|try|catch|except|raise|match|else|as|in|loop|for)\\b" 49 | }, 50 | { 51 | "name": "keyword.moonbit", 52 | "match": "\\b(type!|(type|typealias|let|const|enum|struct|import|trait|derive|test|impl|with)\\b)" 53 | }, 54 | { 55 | "name": "variable.language.moonbit", 56 | "match": "\\b(self)\\b" 57 | }, 58 | { 59 | "name": "storage.modifier.moonbit", 60 | "match": "\\b(mut|pub|priv|readonly|extern)\\b" 61 | }, 62 | { 63 | "name": "storage.type.function.arrow.moonbit", 64 | "match": "->" 65 | }, 66 | { 67 | "name": "storage.type.function.arrow.moonbit", 68 | "match": "=>" 69 | }, 70 | { 71 | "name": "keyword.operator.assignment.moonbit", 72 | "match": "=" 73 | }, 74 | { 75 | "name": "keyword.operator.other.moonbit", 76 | "match": "\\|>" 77 | }, 78 | { 79 | "name": "keyword.operator.comparison.moonbit", 80 | "match": "(===|==|!=|>=|<=|(?|<)" 81 | }, 82 | { 83 | "name": "keyword.operator.logical.moonbit", 84 | "match": "(\\bnot\\b|&&|\\|\\|)" 85 | }, 86 | { 87 | "name": "keyword.operator.math.moonbit", 88 | "match": "(\\+|-(?!>)|\\*|%|/)" 89 | } 90 | ] 91 | }, 92 | "comments": { 93 | "patterns": [ 94 | { 95 | "name": "comment.line", 96 | "match": "//.*" 97 | } 98 | ] 99 | }, 100 | "interpolation": { 101 | "patterns": [ 102 | { 103 | "begin": "\\\\{", 104 | "beginCaptures": { 105 | "0": { 106 | "name": "punctuation.section.embedded.begin.moonbit" 107 | } 108 | }, 109 | "contentName": "source.moonbit", 110 | "end": "}", 111 | "endCaptures": { 112 | "0": { 113 | "name": "punctuation.section.embedded.end.moonbit" 114 | } 115 | }, 116 | "patterns": [ 117 | { 118 | "include": "$self" 119 | } 120 | ], 121 | "name": "meta.embedded.line.moonbit" 122 | } 123 | ] 124 | }, 125 | "escape": { 126 | "patterns": [ 127 | { 128 | "match": "\\\\[0\\\\tnrb\"']", 129 | "name": "constant.character.escape.moonbit" 130 | }, 131 | { 132 | "name": "constant.character.escape.moonbit", 133 | "match": "\\\\x[0-9a-fA-F]{2}" 134 | }, 135 | { 136 | "name": "constant.character.escape.moonbit", 137 | "match": "\\\\o[0-3][0-7]{2}" 138 | }, 139 | { 140 | "match": "\\\\u[0-9a-fA-F]{4}", 141 | "name": "constant.character.escape.unicode.moonbit" 142 | }, 143 | { 144 | "match": "\\\\u{[0-9a-fA-F]*}", 145 | "name": "constant.character.escape.unicode.moonbit" 146 | } 147 | ] 148 | }, 149 | "strings": { 150 | "patterns": [ 151 | { 152 | "name": "string.line", 153 | "match": "(#\\|).*", 154 | "captures": { 155 | "1": { 156 | "name": "keyword.operator.other.moonbit" 157 | } 158 | } 159 | }, 160 | { 161 | "name": "string.line", 162 | "match": "(\\$\\|)(.*)", 163 | "captures": { 164 | "1": { 165 | "name": "keyword.operator.other.moonbit" 166 | }, 167 | "2": { 168 | "patterns": [ 169 | { 170 | "include": "#escape" 171 | }, 172 | { 173 | "include": "#interpolation" 174 | } 175 | ] 176 | } 177 | } 178 | }, 179 | { 180 | "name": "string.quoted.single.moonbit", 181 | "begin": "'", 182 | "end": "'", 183 | "patterns": [ 184 | { 185 | "include": "#escape" 186 | } 187 | ] 188 | }, 189 | { 190 | "name": "string.quoted.double.moonbit", 191 | "begin": "\"", 192 | "end": "\"", 193 | "patterns": [ 194 | { 195 | "include": "#escape" 196 | }, 197 | { 198 | "include": "#interpolation" 199 | } 200 | ] 201 | } 202 | ] 203 | }, 204 | "constants": { 205 | "patterns": [ 206 | { 207 | "name": "constant.numeric.moonbit", 208 | "match": "\\b\\d(\\d|_)*(?!\\.)(U)?(L)?\\b" 209 | }, 210 | { 211 | "name": "constant.numeric.moonbit", 212 | "match": "(?<=\\.)\\d((?=\\.)|\\b)" 213 | }, 214 | { 215 | "name": "constant.numeric.moonbit", 216 | "match": "\\b\\d+(\\.)\\d+\\b" 217 | }, 218 | { 219 | "name": "constant.numeric.moonbit", 220 | "match": "\\b0[XxOoBb][\\dAaBbCcDdEeFf]+(U)?(L)?\\b" 221 | }, 222 | { 223 | "name": "constant.language.moonbit", 224 | "match": "\\b(true|false|\\(\\))\\b" 225 | } 226 | ] 227 | }, 228 | "modules": { 229 | "patterns": [ 230 | { 231 | "name": "entity.name.namespace.moonbit", 232 | "match": "@[A-Za-z][A-Za-z0-9_/]*" 233 | } 234 | ] 235 | }, 236 | "variables": { 237 | "patterns": [ 238 | { 239 | "comment": "variables", 240 | "name": "variable.other.moonbit", 241 | "match": "\\b(?= 1 < 3" } }, "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A=="], 16 | 17 | "@algolia/autocomplete-preset-algolia": ["@algolia/autocomplete-preset-algolia@1.17.7", "https://registry.npmmirror.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA=="], 18 | 19 | "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.17.7", "https://registry.npmmirror.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg=="], 20 | 21 | "@algolia/client-abtesting": ["@algolia/client-abtesting@5.42.0", "https://registry.npmmirror.com/@algolia/client-abtesting/-/client-abtesting-5.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", "@algolia/requester-fetch": "5.42.0", "@algolia/requester-node-http": "5.42.0" } }, "sha512-JLyyG7bb7XOda+w/sp8ch7rEVy6LnWs3qtxr6VJJ2XIINqGsY6U+0L3aJ6QFliBRNUeEAr2QBDxSm8u9Sal5uA=="], 22 | 23 | "@algolia/client-analytics": ["@algolia/client-analytics@5.42.0", "https://registry.npmmirror.com/@algolia/client-analytics/-/client-analytics-5.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", "@algolia/requester-fetch": "5.42.0", "@algolia/requester-node-http": "5.42.0" } }, "sha512-SkCrvtZpdSWjNq9NGu/TtOg4TbzRuUToXlQqV6lLePa2s/WQlEyFw7QYjrz4itprWG9ASuH+StDlq7n49F2sBA=="], 24 | 25 | "@algolia/client-common": ["@algolia/client-common@5.42.0", "https://registry.npmmirror.com/@algolia/client-common/-/client-common-5.42.0.tgz", {}, "sha512-6iiFbm2tRn6B2OqFv9XDTcw5LdWPudiJWIbRk+fsTX+hkPrPm4e1/SbU+lEYBciPoaTShLkDbRge4UePEyCPMQ=="], 26 | 27 | "@algolia/client-insights": ["@algolia/client-insights@5.42.0", "https://registry.npmmirror.com/@algolia/client-insights/-/client-insights-5.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", "@algolia/requester-fetch": "5.42.0", "@algolia/requester-node-http": "5.42.0" } }, "sha512-iEokmw2k6FBa8g/TT7ClyEriaP/FUEmz3iczRoCklEHWSgoABMkaeYrxRXrA2yx76AN+gyZoC8FX0iCJ55dsOg=="], 28 | 29 | "@algolia/client-personalization": ["@algolia/client-personalization@5.42.0", "https://registry.npmmirror.com/@algolia/client-personalization/-/client-personalization-5.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", "@algolia/requester-fetch": "5.42.0", "@algolia/requester-node-http": "5.42.0" } }, "sha512-ivVniRqX2ARd+jGvRHTxpWeOtO9VT+rK+OmiuRgkSunoTyxk0vjeDO7QkU7+lzBOXiYgakNjkZrBtIpW9c+muw=="], 30 | 31 | "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.42.0", "https://registry.npmmirror.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", "@algolia/requester-fetch": "5.42.0", "@algolia/requester-node-http": "5.42.0" } }, "sha512-9+BIw6rerUfA+eLMIS2lF4mgoeBGTCIHiqb35PLn3699Rm3CaJXz03hChdwAWcA6SwGw0haYXYJa7LF0xI6EpA=="], 32 | 33 | "@algolia/client-search": ["@algolia/client-search@5.42.0", "https://registry.npmmirror.com/@algolia/client-search/-/client-search-5.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", "@algolia/requester-fetch": "5.42.0", "@algolia/requester-node-http": "5.42.0" } }, "sha512-NZR7yyHj2WzK6D5X8gn+/KOxPdzYEXOqVdSaK/biU8QfYUpUuEA0sCWg/XlO05tPVEcJelF/oLrrNY3UjRbOww=="], 34 | 35 | "@algolia/ingestion": ["@algolia/ingestion@1.42.0", "https://registry.npmmirror.com/@algolia/ingestion/-/ingestion-1.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", "@algolia/requester-fetch": "5.42.0", "@algolia/requester-node-http": "5.42.0" } }, "sha512-MBkjRymf4BT6VOvMpJlg6kq8K+PkH9q+N+K4YMNdzTXlL40YwOa1wIWQ5LxP/Jhlz64kW5g9/oaMWY06Sy9dcw=="], 36 | 37 | "@algolia/monitoring": ["@algolia/monitoring@1.42.0", "https://registry.npmmirror.com/@algolia/monitoring/-/monitoring-1.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", "@algolia/requester-fetch": "5.42.0", "@algolia/requester-node-http": "5.42.0" } }, "sha512-kmLs7YfjT4cpr4FnhhRmnoSX4psh9KYZ9NAiWt/YcUV33m0B/Os5L4QId30zVXkOqAPAEpV5VbDPWep+/aoJdQ=="], 38 | 39 | "@algolia/recommend": ["@algolia/recommend@5.42.0", "https://registry.npmmirror.com/@algolia/recommend/-/recommend-5.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", "@algolia/requester-fetch": "5.42.0", "@algolia/requester-node-http": "5.42.0" } }, "sha512-U5yZ8+Jj+A4ZC0IMfElpPcddQ9NCoawD1dKyWmjHP49nzN2Z4284IFVMAJWR6fq/0ddGf4OMjjYO9cnF8L+5tw=="], 40 | 41 | "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.42.0", "https://registry.npmmirror.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0" } }, "sha512-EbuxgteaYBlKgc2Fs3JzoPIKAIaevAIwmv1F+fakaEXeibG4pkmVNsyTUjpOZIgJ1kXeqNvDrcjRb6g3vYBJ9A=="], 42 | 43 | "@algolia/requester-fetch": ["@algolia/requester-fetch@5.42.0", "https://registry.npmmirror.com/@algolia/requester-fetch/-/requester-fetch-5.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0" } }, "sha512-4vnFvY5Q8QZL9eDNkywFLsk/eQCRBXCBpE8HWs8iUsFNHYoamiOxAeYMin0W/nszQj6abc+jNxMChHmejO+ftQ=="], 44 | 45 | "@algolia/requester-node-http": ["@algolia/requester-node-http@5.42.0", "https://registry.npmmirror.com/@algolia/requester-node-http/-/requester-node-http-5.42.0.tgz", { "dependencies": { "@algolia/client-common": "5.42.0" } }, "sha512-gkLNpU+b1pCIwk1hKTJz2NWQPT8gsfGhQasnZ5QVv4jd79fKRL/1ikd86P0AzuIQs9tbbhlMwxsSTyJmlq502w=="], 46 | 47 | "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], 48 | 49 | "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], 50 | 51 | "@babel/parser": ["@babel/parser@7.28.5", "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], 52 | 53 | "@babel/types": ["@babel/types@7.28.5", "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], 54 | 55 | "@docsearch/css": ["@docsearch/css@3.8.2", "https://registry.npmmirror.com/@docsearch/css/-/css-3.8.2.tgz", {}, "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ=="], 56 | 57 | "@docsearch/js": ["@docsearch/js@3.8.2", "https://registry.npmmirror.com/@docsearch/js/-/js-3.8.2.tgz", { "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" } }, "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ=="], 58 | 59 | "@docsearch/react": ["@docsearch/react@3.8.2", "https://registry.npmmirror.com/@docsearch/react/-/react-3.8.2.tgz", { "dependencies": { "@algolia/autocomplete-core": "1.17.7", "@algolia/autocomplete-preset-algolia": "1.17.7", "@docsearch/css": "3.8.2", "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0", "search-insights": ">= 1 < 3" }, "optionalPeers": ["@types/react", "react", "react-dom", "search-insights"] }, "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg=="], 60 | 61 | "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], 62 | 63 | "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], 64 | 65 | "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], 66 | 67 | "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], 68 | 69 | "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], 70 | 71 | "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], 72 | 73 | "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], 74 | 75 | "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], 76 | 77 | "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], 78 | 79 | "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], 80 | 81 | "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], 82 | 83 | "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], 84 | 85 | "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], 86 | 87 | "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], 88 | 89 | "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], 90 | 91 | "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], 92 | 93 | "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], 94 | 95 | "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], 96 | 97 | "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], 98 | 99 | "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], 100 | 101 | "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], 102 | 103 | "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], 104 | 105 | "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], 106 | 107 | "@iconify-json/simple-icons": ["@iconify-json/simple-icons@1.2.56", "https://registry.npmmirror.com/@iconify-json/simple-icons/-/simple-icons-1.2.56.tgz", { "dependencies": { "@iconify/types": "*" } }, "sha512-oAvxOzgSjfvdj/Jsi3S7HDUCxO8/n2j8e1w1e/FktHUAXiWjNX00n3Tu3AP+n1ayKrypcUDXCzxn+0ENMl6ouw=="], 108 | 109 | "@iconify/types": ["@iconify/types@2.0.0", "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], 110 | 111 | "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], 112 | 113 | "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", { "os": "android", "cpu": "arm" }, "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ=="], 114 | 115 | "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", { "os": "android", "cpu": "arm64" }, "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA=="], 116 | 117 | "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA=="], 118 | 119 | "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA=="], 120 | 121 | "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", { "os": "freebsd", "cpu": "arm64" }, "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA=="], 122 | 123 | "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ=="], 124 | 125 | "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", { "os": "linux", "cpu": "arm" }, "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ=="], 126 | 127 | "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", { "os": "linux", "cpu": "arm" }, "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ=="], 128 | 129 | "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg=="], 130 | 131 | "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q=="], 132 | 133 | "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", { "os": "linux", "cpu": "none" }, "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA=="], 134 | 135 | "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw=="], 136 | 137 | "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", { "os": "linux", "cpu": "none" }, "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw=="], 138 | 139 | "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", { "os": "linux", "cpu": "none" }, "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg=="], 140 | 141 | "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ=="], 142 | 143 | "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", { "os": "linux", "cpu": "x64" }, "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q=="], 144 | 145 | "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", { "os": "linux", "cpu": "x64" }, "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg=="], 146 | 147 | "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", { "os": "none", "cpu": "arm64" }, "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw=="], 148 | 149 | "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w=="], 150 | 151 | "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg=="], 152 | 153 | "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", { "os": "win32", "cpu": "x64" }, "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ=="], 154 | 155 | "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.52.5", "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", { "os": "win32", "cpu": "x64" }, "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg=="], 156 | 157 | "@shikijs/core": ["@shikijs/core@2.5.0", "https://registry.npmmirror.com/@shikijs/core/-/core-2.5.0.tgz", { "dependencies": { "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg=="], 158 | 159 | "@shikijs/engine-javascript": ["@shikijs/engine-javascript@2.5.0", "https://registry.npmmirror.com/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^3.1.0" } }, "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w=="], 160 | 161 | "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@2.5.0", "https://registry.npmmirror.com/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw=="], 162 | 163 | "@shikijs/langs": ["@shikijs/langs@2.5.0", "https://registry.npmmirror.com/@shikijs/langs/-/langs-2.5.0.tgz", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w=="], 164 | 165 | "@shikijs/themes": ["@shikijs/themes@2.5.0", "https://registry.npmmirror.com/@shikijs/themes/-/themes-2.5.0.tgz", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw=="], 166 | 167 | "@shikijs/transformers": ["@shikijs/transformers@2.5.0", "https://registry.npmmirror.com/@shikijs/transformers/-/transformers-2.5.0.tgz", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/types": "2.5.0" } }, "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg=="], 168 | 169 | "@shikijs/types": ["@shikijs/types@2.5.0", "https://registry.npmmirror.com/@shikijs/types/-/types-2.5.0.tgz", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw=="], 170 | 171 | "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "https://registry.npmmirror.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], 172 | 173 | "@types/estree": ["@types/estree@1.0.8", "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], 174 | 175 | "@types/hast": ["@types/hast@3.0.4", "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], 176 | 177 | "@types/linkify-it": ["@types/linkify-it@5.0.0", "https://registry.npmmirror.com/@types/linkify-it/-/linkify-it-5.0.0.tgz", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="], 178 | 179 | "@types/markdown-it": ["@types/markdown-it@14.1.2", "https://registry.npmmirror.com/@types/markdown-it/-/markdown-it-14.1.2.tgz", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="], 180 | 181 | "@types/mdast": ["@types/mdast@4.0.4", "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], 182 | 183 | "@types/mdurl": ["@types/mdurl@2.0.0", "https://registry.npmmirror.com/@types/mdurl/-/mdurl-2.0.0.tgz", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="], 184 | 185 | "@types/unist": ["@types/unist@3.0.3", "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], 186 | 187 | "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="], 188 | 189 | "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], 190 | 191 | "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="], 192 | 193 | "@vue/compiler-core": ["@vue/compiler-core@3.5.22", "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.22.tgz", { "dependencies": { "@babel/parser": "^7.28.4", "@vue/shared": "3.5.22", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ=="], 194 | 195 | "@vue/compiler-dom": ["@vue/compiler-dom@3.5.22", "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", { "dependencies": { "@vue/compiler-core": "3.5.22", "@vue/shared": "3.5.22" } }, "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA=="], 196 | 197 | "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.22", "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", { "dependencies": { "@babel/parser": "^7.28.4", "@vue/compiler-core": "3.5.22", "@vue/compiler-dom": "3.5.22", "@vue/compiler-ssr": "3.5.22", "@vue/shared": "3.5.22", "estree-walker": "^2.0.2", "magic-string": "^0.30.19", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ=="], 198 | 199 | "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.22", "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", { "dependencies": { "@vue/compiler-dom": "3.5.22", "@vue/shared": "3.5.22" } }, "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww=="], 200 | 201 | "@vue/devtools-api": ["@vue/devtools-api@7.7.7", "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz", { "dependencies": { "@vue/devtools-kit": "^7.7.7" } }, "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg=="], 202 | 203 | "@vue/devtools-kit": ["@vue/devtools-kit@7.7.7", "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", { "dependencies": { "@vue/devtools-shared": "^7.7.7", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA=="], 204 | 205 | "@vue/devtools-shared": ["@vue/devtools-shared@7.7.7", "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw=="], 206 | 207 | "@vue/reactivity": ["@vue/reactivity@3.5.22", "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.22.tgz", { "dependencies": { "@vue/shared": "3.5.22" } }, "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A=="], 208 | 209 | "@vue/runtime-core": ["@vue/runtime-core@3.5.22", "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.22.tgz", { "dependencies": { "@vue/reactivity": "3.5.22", "@vue/shared": "3.5.22" } }, "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ=="], 210 | 211 | "@vue/runtime-dom": ["@vue/runtime-dom@3.5.22", "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz", { "dependencies": { "@vue/reactivity": "3.5.22", "@vue/runtime-core": "3.5.22", "@vue/shared": "3.5.22", "csstype": "^3.1.3" } }, "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww=="], 212 | 213 | "@vue/server-renderer": ["@vue/server-renderer@3.5.22", "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.22.tgz", { "dependencies": { "@vue/compiler-ssr": "3.5.22", "@vue/shared": "3.5.22" }, "peerDependencies": { "vue": "3.5.22" } }, "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ=="], 214 | 215 | "@vue/shared": ["@vue/shared@3.5.22", "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.22.tgz", {}, "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w=="], 216 | 217 | "@vueuse/core": ["@vueuse/core@12.8.2", "https://registry.npmmirror.com/@vueuse/core/-/core-12.8.2.tgz", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ=="], 218 | 219 | "@vueuse/integrations": ["@vueuse/integrations@12.8.2", "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-12.8.2.tgz", { "dependencies": { "@vueuse/core": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "peerDependencies": { "async-validator": "^4", "axios": "^1", "change-case": "^5", "drauu": "^0.4", "focus-trap": "^7", "fuse.js": "^7", "idb-keyval": "^6", "jwt-decode": "^4", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", "universal-cookie": "^7" }, "optionalPeers": ["async-validator", "axios", "change-case", "drauu", "focus-trap", "fuse.js", "idb-keyval", "jwt-decode", "nprogress", "qrcode", "sortablejs", "universal-cookie"] }, "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g=="], 220 | 221 | "@vueuse/metadata": ["@vueuse/metadata@12.8.2", "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-12.8.2.tgz", {}, "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A=="], 222 | 223 | "@vueuse/shared": ["@vueuse/shared@12.8.2", "https://registry.npmmirror.com/@vueuse/shared/-/shared-12.8.2.tgz", { "dependencies": { "vue": "^3.5.13" } }, "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w=="], 224 | 225 | "algoliasearch": ["algoliasearch@5.42.0", "https://registry.npmmirror.com/algoliasearch/-/algoliasearch-5.42.0.tgz", { "dependencies": { "@algolia/abtesting": "1.8.0", "@algolia/client-abtesting": "5.42.0", "@algolia/client-analytics": "5.42.0", "@algolia/client-common": "5.42.0", "@algolia/client-insights": "5.42.0", "@algolia/client-personalization": "5.42.0", "@algolia/client-query-suggestions": "5.42.0", "@algolia/client-search": "5.42.0", "@algolia/ingestion": "1.42.0", "@algolia/monitoring": "1.42.0", "@algolia/recommend": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", "@algolia/requester-fetch": "5.42.0", "@algolia/requester-node-http": "5.42.0" } }, "sha512-X5+PtWc9EJIPafT/cj8ZG+6IU3cjRRnlHGtqMHK/9gsiupQbAyYlH5y7qt/FtsAhfX5AICHffZy69ZAsVrxWkQ=="], 226 | 227 | "birpc": ["birpc@2.6.1", "https://registry.npmmirror.com/birpc/-/birpc-2.6.1.tgz", {}, "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ=="], 228 | 229 | "ccount": ["ccount@2.0.1", "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], 230 | 231 | "character-entities-html4": ["character-entities-html4@2.1.0", "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], 232 | 233 | "character-entities-legacy": ["character-entities-legacy@3.0.0", "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], 234 | 235 | "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], 236 | 237 | "copy-anything": ["copy-anything@4.0.5", "https://registry.npmmirror.com/copy-anything/-/copy-anything-4.0.5.tgz", { "dependencies": { "is-what": "^5.2.0" } }, "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA=="], 238 | 239 | "csstype": ["csstype@3.1.3", "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], 240 | 241 | "dequal": ["dequal@2.0.3", "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], 242 | 243 | "devlop": ["devlop@1.1.0", "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], 244 | 245 | "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "https://registry.npmmirror.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], 246 | 247 | "entities": ["entities@4.5.0", "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], 248 | 249 | "esbuild": ["esbuild@0.21.5", "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], 250 | 251 | "estree-walker": ["estree-walker@2.0.2", "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], 252 | 253 | "focus-trap": ["focus-trap@7.6.6", "https://registry.npmmirror.com/focus-trap/-/focus-trap-7.6.6.tgz", { "dependencies": { "tabbable": "^6.3.0" } }, "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q=="], 254 | 255 | "fsevents": ["fsevents@2.3.3", "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 256 | 257 | "hast-util-to-html": ["hast-util-to-html@9.0.5", "https://registry.npmmirror.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], 258 | 259 | "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], 260 | 261 | "hookable": ["hookable@5.5.3", "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], 262 | 263 | "html-void-elements": ["html-void-elements@3.0.0", "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], 264 | 265 | "is-what": ["is-what@5.5.0", "https://registry.npmmirror.com/is-what/-/is-what-5.5.0.tgz", {}, "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw=="], 266 | 267 | "magic-string": ["magic-string@0.30.21", "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], 268 | 269 | "mark.js": ["mark.js@8.11.1", "https://registry.npmmirror.com/mark.js/-/mark.js-8.11.1.tgz", {}, "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ=="], 270 | 271 | "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], 272 | 273 | "micromark-util-character": ["micromark-util-character@2.1.1", "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], 274 | 275 | "micromark-util-encode": ["micromark-util-encode@2.0.1", "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], 276 | 277 | "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], 278 | 279 | "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], 280 | 281 | "micromark-util-types": ["micromark-util-types@2.0.2", "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], 282 | 283 | "minisearch": ["minisearch@7.2.0", "https://registry.npmmirror.com/minisearch/-/minisearch-7.2.0.tgz", {}, "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg=="], 284 | 285 | "mitt": ["mitt@3.0.1", "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], 286 | 287 | "nanoid": ["nanoid@3.3.11", "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 288 | 289 | "oniguruma-to-es": ["oniguruma-to-es@3.1.1", "https://registry.npmmirror.com/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="], 290 | 291 | "perfect-debounce": ["perfect-debounce@1.0.0", "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], 292 | 293 | "picocolors": ["picocolors@1.1.1", "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], 294 | 295 | "postcss": ["postcss@8.5.6", "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], 296 | 297 | "preact": ["preact@10.27.2", "https://registry.npmmirror.com/preact/-/preact-10.27.2.tgz", {}, "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg=="], 298 | 299 | "property-information": ["property-information@7.1.0", "https://registry.npmmirror.com/property-information/-/property-information-7.1.0.tgz", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], 300 | 301 | "regex": ["regex@6.0.1", "https://registry.npmmirror.com/regex/-/regex-6.0.1.tgz", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA=="], 302 | 303 | "regex-recursion": ["regex-recursion@6.0.2", "https://registry.npmmirror.com/regex-recursion/-/regex-recursion-6.0.2.tgz", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], 304 | 305 | "regex-utilities": ["regex-utilities@2.3.0", "https://registry.npmmirror.com/regex-utilities/-/regex-utilities-2.3.0.tgz", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], 306 | 307 | "rfdc": ["rfdc@1.4.1", "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], 308 | 309 | "rollup": ["rollup@4.52.5", "https://registry.npmmirror.com/rollup/-/rollup-4.52.5.tgz", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.5", "@rollup/rollup-android-arm64": "4.52.5", "@rollup/rollup-darwin-arm64": "4.52.5", "@rollup/rollup-darwin-x64": "4.52.5", "@rollup/rollup-freebsd-arm64": "4.52.5", "@rollup/rollup-freebsd-x64": "4.52.5", "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", "@rollup/rollup-linux-arm-musleabihf": "4.52.5", "@rollup/rollup-linux-arm64-gnu": "4.52.5", "@rollup/rollup-linux-arm64-musl": "4.52.5", "@rollup/rollup-linux-loong64-gnu": "4.52.5", "@rollup/rollup-linux-ppc64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-musl": "4.52.5", "@rollup/rollup-linux-s390x-gnu": "4.52.5", "@rollup/rollup-linux-x64-gnu": "4.52.5", "@rollup/rollup-linux-x64-musl": "4.52.5", "@rollup/rollup-openharmony-arm64": "4.52.5", "@rollup/rollup-win32-arm64-msvc": "4.52.5", "@rollup/rollup-win32-ia32-msvc": "4.52.5", "@rollup/rollup-win32-x64-gnu": "4.52.5", "@rollup/rollup-win32-x64-msvc": "4.52.5", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw=="], 310 | 311 | "search-insights": ["search-insights@2.17.3", "https://registry.npmmirror.com/search-insights/-/search-insights-2.17.3.tgz", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="], 312 | 313 | "shiki": ["shiki@2.5.0", "https://registry.npmmirror.com/shiki/-/shiki-2.5.0.tgz", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/langs": "2.5.0", "@shikijs/themes": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ=="], 314 | 315 | "source-map-js": ["source-map-js@1.2.1", "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], 316 | 317 | "space-separated-tokens": ["space-separated-tokens@2.0.2", "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], 318 | 319 | "speakingurl": ["speakingurl@14.0.1", "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", {}, "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="], 320 | 321 | "stringify-entities": ["stringify-entities@4.0.4", "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], 322 | 323 | "superjson": ["superjson@2.2.5", "https://registry.npmmirror.com/superjson/-/superjson-2.2.5.tgz", { "dependencies": { "copy-anything": "^4" } }, "sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w=="], 324 | 325 | "tabbable": ["tabbable@6.3.0", "https://registry.npmmirror.com/tabbable/-/tabbable-6.3.0.tgz", {}, "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ=="], 326 | 327 | "trim-lines": ["trim-lines@3.0.1", "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], 328 | 329 | "unist-util-is": ["unist-util-is@6.0.1", "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.1.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], 330 | 331 | "unist-util-position": ["unist-util-position@5.0.0", "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], 332 | 333 | "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], 334 | 335 | "unist-util-visit": ["unist-util-visit@5.0.0", "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], 336 | 337 | "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], 338 | 339 | "vfile": ["vfile@6.0.3", "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], 340 | 341 | "vfile-message": ["vfile-message@4.0.3", "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.3.tgz", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], 342 | 343 | "vite": ["vite@5.4.21", "https://registry.npmmirror.com/vite/-/vite-5.4.21.tgz", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw=="], 344 | 345 | "vitepress": ["vitepress@1.6.4", "https://registry.npmmirror.com/vitepress/-/vitepress-1.6.4.tgz", { "dependencies": { "@docsearch/css": "3.8.2", "@docsearch/js": "3.8.2", "@iconify-json/simple-icons": "^1.2.21", "@shikijs/core": "^2.1.0", "@shikijs/transformers": "^2.1.0", "@shikijs/types": "^2.1.0", "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^5.2.1", "@vue/devtools-api": "^7.7.0", "@vue/shared": "^3.5.13", "@vueuse/core": "^12.4.0", "@vueuse/integrations": "^12.4.0", "focus-trap": "^7.6.4", "mark.js": "8.11.1", "minisearch": "^7.1.1", "shiki": "^2.1.0", "vite": "^5.4.14", "vue": "^3.5.13" }, "peerDependencies": { "markdown-it-mathjax3": "^4", "postcss": "^8" }, "optionalPeers": ["markdown-it-mathjax3", "postcss"], "bin": { "vitepress": "bin/vitepress.js" } }, "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg=="], 346 | 347 | "vue": ["vue@3.5.22", "https://registry.npmmirror.com/vue/-/vue-3.5.22.tgz", { "dependencies": { "@vue/compiler-dom": "3.5.22", "@vue/compiler-sfc": "3.5.22", "@vue/runtime-dom": "3.5.22", "@vue/server-renderer": "3.5.22", "@vue/shared": "3.5.22" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ=="], 348 | 349 | "zwitch": ["zwitch@2.0.4", "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], 350 | } 351 | } 352 | --------------------------------------------------------------------------------