Last active
April 22, 2025 21:41
-
-
Save flight505/d3e38b09bf563416fe78f775974cc61d to your computer and use it in GitHub Desktop.
fastMCP <v2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Directory structure: | |
| └── punkpeye-fastmcp/ | |
| ├── README.md | |
| ├── eslint.config.js | |
| ├── jsr.json | |
| ├── LICENSE | |
| ├── package.json | |
| ├── pnpm-lock.yaml | |
| ├── tsconfig.json | |
| ├── vitest.config.js | |
| ├── src/ | |
| │ ├── FastMCP.test.ts | |
| │ ├── FastMCP.ts | |
| │ ├── bin/ | |
| │ │ └── fastmcp.ts | |
| │ └── examples/ | |
| │ └── addition.ts | |
| └── .github/ | |
| └── workflows/ | |
| ├── feature.yaml | |
| └── main.yaml | |
| Files Content: | |
| ================================================ | |
| FILE: README.md | |
| ================================================ | |
| # FastMCP | |
| A TypeScript framework for building [MCP](https://glama.ai/mcp) servers capable of handling client sessions. | |
| > [!NOTE] | |
| > | |
| > For a Python implementation, see [FastMCP](https://github.com/jlowin/fastmcp). | |
| ## Features | |
| - Simple Tool, Resource, Prompt definition | |
| - [Authentication](#authentication) | |
| - [Sessions](#sessions) | |
| - [Image content](#returning-an-image) | |
| - [Audio content](#returning-an-audio) | |
| - [Logging](#logging) | |
| - [Error handling](#errors) | |
| - [SSE](#sse) | |
| - CORS (enabled by default) | |
| - [Progress notifications](#progress) | |
| - [Typed server events](#typed-server-events) | |
| - [Prompt argument auto-completion](#prompt-argument-auto-completion) | |
| - [Sampling](#requestsampling) | |
| - Automated SSE pings | |
| - Roots | |
| - CLI for [testing](#test-with-mcp-cli) and [debugging](#inspect-with-mcp-inspector) | |
| ## Installation | |
| ```bash | |
| npm install fastmcp | |
| ``` | |
| ## Quickstart | |
| > [!NOTE] | |
| > | |
| > There are many real-world examples of using FastMCP in the wild. See the [Showcase](#showcase) for examples. | |
| ```ts | |
| import { FastMCP } from "fastmcp"; | |
| import { z } from "zod"; // Or any validation library that supports Standard Schema | |
| const server = new FastMCP({ | |
| name: "My Server", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async (args) => { | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| server.start({ | |
| transportType: "stdio", | |
| }); | |
| ``` | |
| _That's it!_ You have a working MCP server. | |
| You can test the server in terminal with: | |
| ```bash | |
| git clone https://github.com/punkpeye/fastmcp.git | |
| cd fastmcp | |
| pnpm install | |
| pnpm build | |
| # Test the addition server example using CLI: | |
| npx fastmcp dev src/examples/addition.ts | |
| # Test the addition server example using MCP Inspector: | |
| npx fastmcp inspect src/examples/addition.ts | |
| ``` | |
| ### SSE | |
| [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) (SSE) provide a mechanism for servers to send real-time updates to clients over an HTTPS connection. In the context of MCP, SSE is primarily used to enable remote MCP communication, allowing an MCP hosted on a remote machine to be accessed and relay updates over the network. | |
| You can also run the server with SSE support: | |
| ```ts | |
| server.start({ | |
| transportType: "sse", | |
| sse: { | |
| endpoint: "/sse", | |
| port: 8080, | |
| }, | |
| }); | |
| ``` | |
| This will start the server and listen for SSE connections on `http://localhost:8080/sse`. | |
| You can then use `SSEClientTransport` to connect to the server: | |
| ```ts | |
| import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js"; | |
| const client = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: {}, | |
| }, | |
| ); | |
| const transport = new SSEClientTransport(new URL(`http://localhost:8080/sse`)); | |
| await client.connect(transport); | |
| ``` | |
| ## Core Concepts | |
| ### Tools | |
| [Tools](https://modelcontextprotocol.io/docs/concepts/tools) in MCP allow servers to expose executable functions that can be invoked by clients and used by LLMs to perform actions. | |
| FastMCP uses the [Standard Schema](https://standardschema.dev) specification for defining tool parameters. This allows you to use your preferred schema validation library (like Zod, ArkType, or Valibot) as long as it implements the spec. | |
| **Zod Example:** | |
| ```typescript | |
| import { z } from "zod"; | |
| server.addTool({ | |
| name: "fetch-zod", | |
| description: "Fetch the content of a url (using Zod)", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args) => { | |
| return await fetchWebpageContent(args.url); | |
| }, | |
| }); | |
| ``` | |
| **ArkType Example:** | |
| ```typescript | |
| import { type } from "arktype"; | |
| server.addTool({ | |
| name: "fetch-arktype", | |
| description: "Fetch the content of a url (using ArkType)", | |
| parameters: type({ | |
| url: "string", | |
| }), | |
| execute: async (args) => { | |
| return await fetchWebpageContent(args.url); | |
| }, | |
| }); | |
| ``` | |
| **Valibot Example:** | |
| Valibot requires the peer dependency @valibot/to-json-schema. | |
| ```typescript | |
| import * as v from "valibot"; | |
| server.addTool({ | |
| name: "fetch-valibot", | |
| description: "Fetch the content of a url (using Valibot)", | |
| parameters: v.object({ | |
| url: v.string(), | |
| }), | |
| execute: async (args) => { | |
| return await fetchWebpageContent(args.url); | |
| }, | |
| }); | |
| ``` | |
| #### Returning a string | |
| `execute` can return a string: | |
| ```js | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args) => { | |
| return "Hello, world!"; | |
| }, | |
| }); | |
| ``` | |
| The latter is equivalent to: | |
| ```js | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args) => { | |
| return { | |
| content: [ | |
| { | |
| type: "text", | |
| text: "Hello, world!", | |
| }, | |
| ], | |
| }; | |
| }, | |
| }); | |
| ``` | |
| #### Returning a list | |
| If you want to return a list of messages, you can return an object with a `content` property: | |
| ```js | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args) => { | |
| return { | |
| content: [ | |
| { type: "text", text: "First message" }, | |
| { type: "text", text: "Second message" }, | |
| ], | |
| }; | |
| }, | |
| }); | |
| ``` | |
| #### Returning an image | |
| Use the `imageContent` to create a content object for an image: | |
| ```js | |
| import { imageContent } from "fastmcp"; | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args) => { | |
| return imageContent({ | |
| url: "https://example.com/image.png", | |
| }); | |
| // or... | |
| // return imageContent({ | |
| // path: "/path/to/image.png", | |
| // }); | |
| // or... | |
| // return imageContent({ | |
| // buffer: Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", "base64"), | |
| // }); | |
| // or... | |
| // return { | |
| // content: [ | |
| // await imageContent(...) | |
| // ], | |
| // }; | |
| }, | |
| }); | |
| ``` | |
| The `imageContent` function takes the following options: | |
| - `url`: The URL of the image. | |
| - `path`: The path to the image file. | |
| - `buffer`: The image data as a buffer. | |
| Only one of `url`, `path`, or `buffer` must be specified. | |
| The above example is equivalent to: | |
| ```js | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args) => { | |
| return { | |
| content: [ | |
| { | |
| type: "image", | |
| data: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", | |
| mimeType: "image/png", | |
| }, | |
| ], | |
| }; | |
| }, | |
| }); | |
| ``` | |
| #### Returning an audio | |
| Use the `audioContent` to create a content object for an audio: | |
| ```js | |
| import { audioContent } from "fastmcp"; | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args) => { | |
| return audioContent({ | |
| url: "https://example.com/audio.mp3", | |
| }); | |
| // or... | |
| // return audioContent({ | |
| // path: "/path/to/audio.mp3", | |
| // }); | |
| // or... | |
| // return audioContent({ | |
| // buffer: Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", "base64"), | |
| // }); | |
| // or... | |
| // return { | |
| // content: [ | |
| // await audioContent(...) | |
| // ], | |
| // }; | |
| }, | |
| }); | |
| ``` | |
| The `audioContent` function takes the following options: | |
| - `url`: The URL of the audio. | |
| - `path`: The path to the audio file. | |
| - `buffer`: The audio data as a buffer. | |
| Only one of `url`, `path`, or `buffer` must be specified. | |
| The above example is equivalent to: | |
| ```js | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args) => { | |
| return { | |
| content: [ | |
| { | |
| type: "audio", | |
| data: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", | |
| mimeType: "audio/mpeg", | |
| }, | |
| ], | |
| }; | |
| }, | |
| }); | |
| ``` | |
| #### Return combination type | |
| You can combine various types in this way and send them back to AI | |
| ```js | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args) => { | |
| return { | |
| content: [ | |
| { | |
| type: "text", | |
| text: "Hello, world!", | |
| }, | |
| { | |
| type: "image", | |
| data: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", | |
| mimeType: "image/png", | |
| }, | |
| { | |
| type: "audio", | |
| data: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", | |
| mimeType: "audio/mpeg", | |
| }, | |
| ], | |
| }; | |
| }, | |
| // or... | |
| // execute: async (args) => { | |
| // const imgContent = imageContent({ | |
| // url: "https://example.com/image.png", | |
| // }); | |
| // const audContent = audioContent({ | |
| // url: "https://example.com/audio.mp3", | |
| // }); | |
| // return { | |
| // content: [ | |
| // { | |
| // type: "text", | |
| // text: "Hello, world!", | |
| // }, | |
| // imgContent, | |
| // audContent, | |
| // ], | |
| // }; | |
| // }, | |
| }); | |
| ``` | |
| #### Logging | |
| Tools can log messages to the client using the `log` object in the context object: | |
| ```js | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args, { log }) => { | |
| log.info("Downloading file...", { | |
| url, | |
| }); | |
| // ... | |
| log.info("Downloaded file"); | |
| return "done"; | |
| }, | |
| }); | |
| ``` | |
| The `log` object has the following methods: | |
| - `debug(message: string, data?: SerializableValue)` | |
| - `error(message: string, data?: SerializableValue)` | |
| - `info(message: string, data?: SerializableValue)` | |
| - `warn(message: string, data?: SerializableValue)` | |
| #### Errors | |
| The errors that are meant to be shown to the user should be thrown as `UserError` instances: | |
| ```js | |
| import { UserError } from "fastmcp"; | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args) => { | |
| if (args.url.startsWith("https://example.com")) { | |
| throw new UserError("This URL is not allowed"); | |
| } | |
| return "done"; | |
| }, | |
| }); | |
| ``` | |
| #### Progress | |
| Tools can report progress by calling `reportProgress` in the context object: | |
| ```js | |
| server.addTool({ | |
| name: "download", | |
| description: "Download a file", | |
| parameters: z.object({ | |
| url: z.string(), | |
| }), | |
| execute: async (args, { reportProgress }) => { | |
| reportProgress({ | |
| progress: 0, | |
| total: 100, | |
| }); | |
| // ... | |
| reportProgress({ | |
| progress: 100, | |
| total: 100, | |
| }); | |
| return "done"; | |
| }, | |
| }); | |
| ``` | |
| ### Resources | |
| [Resources](https://modelcontextprotocol.io/docs/concepts/resources) represent any kind of data that an MCP server wants to make available to clients. This can include: | |
| - File contents | |
| - Screenshots and images | |
| - Log files | |
| - And more | |
| Each resource is identified by a unique URI and can contain either text or binary data. | |
| ```ts | |
| server.addResource({ | |
| uri: "file:///logs/app.log", | |
| name: "Application Logs", | |
| mimeType: "text/plain", | |
| async load() { | |
| return { | |
| text: await readLogFile(), | |
| }; | |
| }, | |
| }); | |
| ``` | |
| > [!NOTE] | |
| > | |
| > `load` can return multiple resources. This could be used, for example, to return a list of files inside a directory when the directory is read. | |
| > | |
| > ```ts | |
| > async load() { | |
| > return [ | |
| > { | |
| > text: "First file content", | |
| > }, | |
| > { | |
| > text: "Second file content", | |
| > }, | |
| > ]; | |
| > } | |
| > ``` | |
| You can also return binary contents in `load`: | |
| ```ts | |
| async load() { | |
| return { | |
| blob: 'base64-encoded-data' | |
| }; | |
| } | |
| ``` | |
| ### Resource templates | |
| You can also define resource templates: | |
| ```ts | |
| server.addResourceTemplate({ | |
| uriTemplate: "file:///logs/{name}.log", | |
| name: "Application Logs", | |
| mimeType: "text/plain", | |
| arguments: [ | |
| { | |
| name: "name", | |
| description: "Name of the log", | |
| required: true, | |
| }, | |
| ], | |
| async load({ name }) { | |
| return { | |
| text: `Example log content for ${name}`, | |
| }; | |
| }, | |
| }); | |
| ``` | |
| #### Resource template argument auto-completion | |
| Provide `complete` functions for resource template arguments to enable automatic completion: | |
| ```ts | |
| server.addResourceTemplate({ | |
| uriTemplate: "file:///logs/{name}.log", | |
| name: "Application Logs", | |
| mimeType: "text/plain", | |
| arguments: [ | |
| { | |
| name: "name", | |
| description: "Name of the log", | |
| required: true, | |
| complete: async (value) => { | |
| if (value === "Example") { | |
| return { | |
| values: ["Example Log"], | |
| }; | |
| } | |
| return { | |
| values: [], | |
| }; | |
| }, | |
| }, | |
| ], | |
| async load({ name }) { | |
| return { | |
| text: `Example log content for ${name}`, | |
| }; | |
| }, | |
| }); | |
| ``` | |
| ### Prompts | |
| [Prompts](https://modelcontextprotocol.io/docs/concepts/prompts) enable servers to define reusable prompt templates and workflows that clients can easily surface to users and LLMs. They provide a powerful way to standardize and share common LLM interactions. | |
| ```ts | |
| server.addPrompt({ | |
| name: "git-commit", | |
| description: "Generate a Git commit message", | |
| arguments: [ | |
| { | |
| name: "changes", | |
| description: "Git diff or description of changes", | |
| required: true, | |
| }, | |
| ], | |
| load: async (args) => { | |
| return `Generate a concise but descriptive commit message for these changes:\n\n${args.changes}`; | |
| }, | |
| }); | |
| ``` | |
| #### Prompt argument auto-completion | |
| Prompts can provide auto-completion for their arguments: | |
| ```js | |
| server.addPrompt({ | |
| name: "countryPoem", | |
| description: "Writes a poem about a country", | |
| load: async ({ name }) => { | |
| return `Hello, ${name}!`; | |
| }, | |
| arguments: [ | |
| { | |
| name: "name", | |
| description: "Name of the country", | |
| required: true, | |
| complete: async (value) => { | |
| if (value === "Germ") { | |
| return { | |
| values: ["Germany"], | |
| }; | |
| } | |
| return { | |
| values: [], | |
| }; | |
| }, | |
| }, | |
| ], | |
| }); | |
| ``` | |
| #### Prompt argument auto-completion using `enum` | |
| If you provide an `enum` array for an argument, the server will automatically provide completions for the argument. | |
| ```js | |
| server.addPrompt({ | |
| name: "countryPoem", | |
| description: "Writes a poem about a country", | |
| load: async ({ name }) => { | |
| return `Hello, ${name}!`; | |
| }, | |
| arguments: [ | |
| { | |
| name: "name", | |
| description: "Name of the country", | |
| required: true, | |
| enum: ["Germany", "France", "Italy"], | |
| }, | |
| ], | |
| }); | |
| ``` | |
| ### Authentication | |
| FastMCP allows you to `authenticate` clients using a custom function: | |
| ```ts | |
| import { AuthError } from "fastmcp"; | |
| const server = new FastMCP({ | |
| name: "My Server", | |
| version: "1.0.0", | |
| authenticate: ({request}) => { | |
| const apiKey = request.headers["x-api-key"]; | |
| if (apiKey !== '123') { | |
| throw new Response(null, { | |
| status: 401, | |
| statusText: "Unauthorized", | |
| }); | |
| } | |
| // Whatever you return here will be accessible in the `context.session` object. | |
| return { | |
| id: 1, | |
| } | |
| }, | |
| }); | |
| ``` | |
| Now you can access the authenticated session data in your tools: | |
| ```ts | |
| server.addTool({ | |
| name: "sayHello", | |
| execute: async (args, { session }) => { | |
| return `Hello, ${session.id}!`; | |
| }, | |
| }); | |
| ``` | |
| ### Sessions | |
| The `session` object is an instance of `FastMCPSession` and it describes active client sessions. | |
| ```ts | |
| server.sessions; | |
| ``` | |
| We allocate a new server instance for each client connection to enable 1:1 communication between a client and the server. | |
| ### Typed server events | |
| You can listen to events emitted by the server using the `on` method: | |
| ```ts | |
| server.on("connect", (event) => { | |
| console.log("Client connected:", event.session); | |
| }); | |
| server.on("disconnect", (event) => { | |
| console.log("Client disconnected:", event.session); | |
| }); | |
| ``` | |
| ## `FastMCPSession` | |
| `FastMCPSession` represents a client session and provides methods to interact with the client. | |
| Refer to [Sessions](#sessions) for examples of how to obtain a `FastMCPSession` instance. | |
| ### `requestSampling` | |
| `requestSampling` creates a [sampling](https://modelcontextprotocol.io/docs/concepts/sampling) request and returns the response. | |
| ```ts | |
| await session.requestSampling({ | |
| messages: [ | |
| { | |
| role: "user", | |
| content: { | |
| type: "text", | |
| text: "What files are in the current directory?", | |
| }, | |
| }, | |
| ], | |
| systemPrompt: "You are a helpful file system assistant.", | |
| includeContext: "thisServer", | |
| maxTokens: 100, | |
| }); | |
| ``` | |
| ### `clientCapabilities` | |
| The `clientCapabilities` property contains the client capabilities. | |
| ```ts | |
| session.clientCapabilities; | |
| ``` | |
| ### `loggingLevel` | |
| The `loggingLevel` property describes the logging level as set by the client. | |
| ```ts | |
| session.loggingLevel; | |
| ``` | |
| ### `roots` | |
| The `roots` property contains the roots as set by the client. | |
| ```ts | |
| session.roots; | |
| ``` | |
| ### `server` | |
| The `server` property contains an instance of MCP server that is associated with the session. | |
| ```ts | |
| session.server; | |
| ``` | |
| ### Typed session events | |
| You can listen to events emitted by the session using the `on` method: | |
| ```ts | |
| session.on("rootsChanged", (event) => { | |
| console.log("Roots changed:", event.roots); | |
| }); | |
| session.on("error", (event) => { | |
| console.error("Error:", event.error); | |
| }); | |
| ``` | |
| ## Running Your Server | |
| ### Test with `mcp-cli` | |
| The fastest way to test and debug your server is with `fastmcp dev`: | |
| ```bash | |
| npx fastmcp dev server.js | |
| npx fastmcp dev server.ts | |
| ``` | |
| This will run your server with [`mcp-cli`](https://github.com/wong2/mcp-cli) for testing and debugging your MCP server in the terminal. | |
| ### Inspect with `MCP Inspector` | |
| Another way is to use the official [`MCP Inspector`](https://modelcontextprotocol.io/docs/tools/inspector) to inspect your server with a Web UI: | |
| ```bash | |
| npx fastmcp inspect server.ts | |
| ``` | |
| ## FAQ | |
| ### How to use with Claude Desktop? | |
| Follow the guide https://modelcontextprotocol.io/quickstart/user and add the following configuration: | |
| ```json | |
| { | |
| "mcpServers": { | |
| "my-mcp-server": { | |
| "command": "npx", | |
| "args": [ | |
| "tsx", | |
| "/PATH/TO/YOUR_PROJECT/src/index.ts" | |
| ], | |
| "env": { | |
| "YOUR_ENV_VAR": "value" | |
| } | |
| } | |
| } | |
| } | |
| ``` | |
| ## Showcase | |
| > [!NOTE] | |
| > | |
| > If you've developed a server using FastMCP, please [submit a PR](https://github.com/punkpeye/fastmcp) to showcase it here! | |
| - [apinetwork/piapi-mcp-server](https://github.com/apinetwork/piapi-mcp-server) - generate media using Midjourney/Flux/Kling/LumaLabs/Udio/Chrip/Trellis | |
| - [domdomegg/computer-use-mcp](https://github.com/domdomegg/computer-use-mcp) - controls your computer | |
| - [LiterallyBlah/Dradis-MCP](https://github.com/LiterallyBlah/Dradis-MCP) – manages projects and vulnerabilities in Dradis | |
| - [Meeting-Baas/meeting-mcp](https://github.com/Meeting-Baas/meeting-mcp) - create meeting bots, search transcripts, and manage recording data | |
| - [drumnation/unsplash-smart-mcp-server](https://github.com/drumnation/unsplash-smart-mcp-server) – enables AI agents to seamlessly search, recommend, and deliver professional stock photos from Unsplash | |
| - [ssmanji89/halopsa-workflows-mcp](https://github.com/ssmanji89/halopsa-workflows-mcp) - HaloPSA Workflows integration with AI assistants | |
| - [aiamblichus/mcp-chat-adapter](https://github.com/aiamblichus/mcp-chat-adapter) – provides a clean interface for LLMs to use chat completion | |
| - [cswkim/discogs-mcp-server](https://github.com/cswkim/discogs-mcp-server) - connects to the Discogs API for interacting with your music collection | |
| ## Acknowledgements | |
| - FastMCP is inspired by the [Python implementation](https://github.com/jlowin/fastmcp) by [Jonathan Lowin](https://github.com/jlowin). | |
| - Parts of codebase were adopted from [LiteMCP](https://github.com/wong2/litemcp). | |
| - Parts of codebase were adopted from [Model Context protocolでSSEをやってみる](https://dev.classmethod.jp/articles/mcp-sse/). | |
| ================================================ | |
| FILE: eslint.config.js | |
| ================================================ | |
| import perfectionist from "eslint-plugin-perfectionist"; | |
| export default [perfectionist.configs["recommended-alphabetical"]]; | |
| ================================================ | |
| FILE: jsr.json | |
| ================================================ | |
| { | |
| "name": "@glama/fastmcp", | |
| "version": "1.0.0", | |
| "exports": "./src/FastMCP.ts", | |
| "include": ["src/FastMCP.ts", "src/bin/fastmcp.ts"] | |
| } | |
| ================================================ | |
| FILE: LICENSE | |
| ================================================ | |
| The MIT License (MIT) | |
| ===================== | |
| Copyright © 2024 Frank Fiegel (frank@glama.ai) | |
| Permission is hereby granted, free of charge, to any person | |
| obtaining a copy of this software and associated documentation | |
| files (the “Software”), to deal in the Software without | |
| restriction, including without limitation the rights to use, | |
| copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| copies of the Software, and to permit persons to whom the | |
| Software is furnished to do so, subject to the following | |
| conditions: | |
| The above copyright notice and this permission notice shall be | |
| included in all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, | |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | |
| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |
| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
| OTHER DEALINGS IN THE SOFTWARE. | |
| ================================================ | |
| FILE: package.json | |
| ================================================ | |
| { | |
| "name": "fastmcp", | |
| "version": "1.0.0", | |
| "main": "dist/FastMCP.js", | |
| "scripts": { | |
| "build": "tsup", | |
| "test": "vitest run && tsc && jsr publish --dry-run", | |
| "format": "prettier --write . && eslint --fix ." | |
| }, | |
| "bin": { | |
| "fastmcp": "dist/bin/fastmcp.js" | |
| }, | |
| "keywords": [ | |
| "MCP", | |
| "SSE" | |
| ], | |
| "type": "module", | |
| "author": "Frank Fiegel <frank@glama.ai>", | |
| "license": "MIT", | |
| "description": "A TypeScript framework for building MCP servers.", | |
| "module": "dist/FastMCP.js", | |
| "types": "dist/FastMCP.d.ts", | |
| "dependencies": { | |
| "@modelcontextprotocol/sdk": "^1.10.2", | |
| "@standard-schema/spec": "^1.0.0", | |
| "execa": "^9.5.2", | |
| "file-type": "^20.4.1", | |
| "fuse.js": "^7.1.0", | |
| "mcp-proxy": "^2.12.2", | |
| "strict-event-emitter-types": "^2.0.0", | |
| "undici": "^7.8.0", | |
| "uri-templates": "^0.2.0", | |
| "xsschema": "0.2.0-beta.3", | |
| "yargs": "^17.7.2", | |
| "zod": "^3.24.3", | |
| "zod-to-json-schema": "^3.24.5" | |
| }, | |
| "repository": { | |
| "url": "https://github.com/punkpeye/fastmcp" | |
| }, | |
| "homepage": "https://glama.ai/mcp", | |
| "release": { | |
| "branches": [ | |
| "main" | |
| ], | |
| "plugins": [ | |
| "@semantic-release/commit-analyzer", | |
| "@semantic-release/release-notes-generator", | |
| "@semantic-release/npm", | |
| "@semantic-release/github", | |
| "@sebbo2002/semantic-release-jsr" | |
| ] | |
| }, | |
| "devDependencies": { | |
| "@sebbo2002/semantic-release-jsr": "^2.0.5", | |
| "@tsconfig/node22": "^22.0.1", | |
| "@types/node": "^22.14.1", | |
| "@types/uri-templates": "^0.1.34", | |
| "@types/yargs": "^17.0.33", | |
| "@valibot/to-json-schema": "^1.0.0", | |
| "arktype": "^2.1.20", | |
| "eslint": "^9.25.1", | |
| "eslint-plugin-perfectionist": "^4.12.0", | |
| "eventsource-client": "^1.1.3", | |
| "get-port-please": "^3.1.2", | |
| "jsr": "^0.13.4", | |
| "prettier": "^3.5.3", | |
| "semantic-release": "^24.2.3", | |
| "tsup": "^8.4.0", | |
| "typescript": "^5.8.3", | |
| "valibot": "^1.0.0", | |
| "vitest": "^3.1.2" | |
| }, | |
| "tsup": { | |
| "entry": [ | |
| "src/FastMCP.ts", | |
| "src/bin/fastmcp.ts" | |
| ], | |
| "format": [ | |
| "esm" | |
| ], | |
| "dts": true, | |
| "splitting": true, | |
| "sourcemap": true, | |
| "clean": true | |
| } | |
| } | |
| ================================================ | |
| FILE: pnpm-lock.yaml | |
| ================================================ | |
| lockfileVersion: '9.0' | |
| settings: | |
| autoInstallPeers: true | |
| excludeLinksFromLockfile: false | |
| importers: | |
| .: | |
| dependencies: | |
| '@modelcontextprotocol/sdk': | |
| specifier: ^1.10.2 | |
| version: 1.10.2 | |
| '@standard-schema/spec': | |
| specifier: ^1.0.0 | |
| version: 1.0.0 | |
| execa: | |
| specifier: ^9.5.2 | |
| version: 9.5.2 | |
| file-type: | |
| specifier: ^20.4.1 | |
| version: 20.4.1 | |
| fuse.js: | |
| specifier: ^7.1.0 | |
| version: 7.1.0 | |
| mcp-proxy: | |
| specifier: ^2.12.2 | |
| version: 2.12.2 | |
| strict-event-emitter-types: | |
| specifier: ^2.0.0 | |
| version: 2.0.0 | |
| undici: | |
| specifier: ^7.8.0 | |
| version: 7.8.0 | |
| uri-templates: | |
| specifier: ^0.2.0 | |
| version: 0.2.0 | |
| xsschema: | |
| specifier: 0.2.0-beta.3 | |
| version: 0.2.0-beta.3(@valibot/to-json-schema@1.0.0(valibot@1.0.0(typescript@5.8.3)))(arktype@2.1.20)(zod-to-json-schema@3.24.5(zod@3.24.3)) | |
| yargs: | |
| specifier: ^17.7.2 | |
| version: 17.7.2 | |
| zod: | |
| specifier: ^3.24.3 | |
| version: 3.24.3 | |
| zod-to-json-schema: | |
| specifier: ^3.24.5 | |
| version: 3.24.5(zod@3.24.3) | |
| devDependencies: | |
| '@sebbo2002/semantic-release-jsr': | |
| specifier: ^2.0.5 | |
| version: 2.0.5 | |
| '@tsconfig/node22': | |
| specifier: ^22.0.1 | |
| version: 22.0.1 | |
| '@types/node': | |
| specifier: ^22.14.1 | |
| version: 22.14.1 | |
| '@types/uri-templates': | |
| specifier: ^0.1.34 | |
| version: 0.1.34 | |
| '@types/yargs': | |
| specifier: ^17.0.33 | |
| version: 17.0.33 | |
| '@valibot/to-json-schema': | |
| specifier: ^1.0.0 | |
| version: 1.0.0(valibot@1.0.0(typescript@5.8.3)) | |
| arktype: | |
| specifier: ^2.1.20 | |
| version: 2.1.20 | |
| eslint: | |
| specifier: ^9.25.1 | |
| version: 9.25.1 | |
| eslint-plugin-perfectionist: | |
| specifier: ^4.12.0 | |
| version: 4.12.0(eslint@9.25.1)(typescript@5.8.3) | |
| eventsource-client: | |
| specifier: ^1.1.3 | |
| version: 1.1.3 | |
| get-port-please: | |
| specifier: ^3.1.2 | |
| version: 3.1.2 | |
| jsr: | |
| specifier: ^0.13.4 | |
| version: 0.13.4 | |
| prettier: | |
| specifier: ^3.5.3 | |
| version: 3.5.3 | |
| semantic-release: | |
| specifier: ^24.2.3 | |
| version: 24.2.3(typescript@5.8.3) | |
| tsup: | |
| specifier: ^8.4.0 | |
| version: 8.4.0(postcss@8.5.3)(typescript@5.8.3) | |
| typescript: | |
| specifier: ^5.8.3 | |
| version: 5.8.3 | |
| valibot: | |
| specifier: ^1.0.0 | |
| version: 1.0.0(typescript@5.8.3) | |
| vitest: | |
| specifier: ^3.1.2 | |
| version: 3.1.2(@types/node@22.14.1) | |
| packages: | |
| '@ark/schema@0.46.0': | |
| resolution: {integrity: sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ==} | |
| '@ark/util@0.46.0': | |
| resolution: {integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==} | |
| '@babel/code-frame@7.26.2': | |
| resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} | |
| engines: {node: '>=6.9.0'} | |
| '@babel/helper-validator-identifier@7.25.9': | |
| resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} | |
| engines: {node: '>=6.9.0'} | |
| '@colors/colors@1.5.0': | |
| resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} | |
| engines: {node: '>=0.1.90'} | |
| '@esbuild/aix-ppc64@0.25.0': | |
| resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} | |
| engines: {node: '>=18'} | |
| cpu: [ppc64] | |
| os: [aix] | |
| '@esbuild/aix-ppc64@0.25.2': | |
| resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} | |
| engines: {node: '>=18'} | |
| cpu: [ppc64] | |
| os: [aix] | |
| '@esbuild/android-arm64@0.25.0': | |
| resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [android] | |
| '@esbuild/android-arm64@0.25.2': | |
| resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [android] | |
| '@esbuild/android-arm@0.25.0': | |
| resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} | |
| engines: {node: '>=18'} | |
| cpu: [arm] | |
| os: [android] | |
| '@esbuild/android-arm@0.25.2': | |
| resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} | |
| engines: {node: '>=18'} | |
| cpu: [arm] | |
| os: [android] | |
| '@esbuild/android-x64@0.25.0': | |
| resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [android] | |
| '@esbuild/android-x64@0.25.2': | |
| resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [android] | |
| '@esbuild/darwin-arm64@0.25.0': | |
| resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [darwin] | |
| '@esbuild/darwin-arm64@0.25.2': | |
| resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [darwin] | |
| '@esbuild/darwin-x64@0.25.0': | |
| resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [darwin] | |
| '@esbuild/darwin-x64@0.25.2': | |
| resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [darwin] | |
| '@esbuild/freebsd-arm64@0.25.0': | |
| resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [freebsd] | |
| '@esbuild/freebsd-arm64@0.25.2': | |
| resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [freebsd] | |
| '@esbuild/freebsd-x64@0.25.0': | |
| resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [freebsd] | |
| '@esbuild/freebsd-x64@0.25.2': | |
| resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [freebsd] | |
| '@esbuild/linux-arm64@0.25.0': | |
| resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [linux] | |
| '@esbuild/linux-arm64@0.25.2': | |
| resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [linux] | |
| '@esbuild/linux-arm@0.25.0': | |
| resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} | |
| engines: {node: '>=18'} | |
| cpu: [arm] | |
| os: [linux] | |
| '@esbuild/linux-arm@0.25.2': | |
| resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} | |
| engines: {node: '>=18'} | |
| cpu: [arm] | |
| os: [linux] | |
| '@esbuild/linux-ia32@0.25.0': | |
| resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} | |
| engines: {node: '>=18'} | |
| cpu: [ia32] | |
| os: [linux] | |
| '@esbuild/linux-ia32@0.25.2': | |
| resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} | |
| engines: {node: '>=18'} | |
| cpu: [ia32] | |
| os: [linux] | |
| '@esbuild/linux-loong64@0.25.0': | |
| resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} | |
| engines: {node: '>=18'} | |
| cpu: [loong64] | |
| os: [linux] | |
| '@esbuild/linux-loong64@0.25.2': | |
| resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} | |
| engines: {node: '>=18'} | |
| cpu: [loong64] | |
| os: [linux] | |
| '@esbuild/linux-mips64el@0.25.0': | |
| resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} | |
| engines: {node: '>=18'} | |
| cpu: [mips64el] | |
| os: [linux] | |
| '@esbuild/linux-mips64el@0.25.2': | |
| resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} | |
| engines: {node: '>=18'} | |
| cpu: [mips64el] | |
| os: [linux] | |
| '@esbuild/linux-ppc64@0.25.0': | |
| resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} | |
| engines: {node: '>=18'} | |
| cpu: [ppc64] | |
| os: [linux] | |
| '@esbuild/linux-ppc64@0.25.2': | |
| resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} | |
| engines: {node: '>=18'} | |
| cpu: [ppc64] | |
| os: [linux] | |
| '@esbuild/linux-riscv64@0.25.0': | |
| resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} | |
| engines: {node: '>=18'} | |
| cpu: [riscv64] | |
| os: [linux] | |
| '@esbuild/linux-riscv64@0.25.2': | |
| resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} | |
| engines: {node: '>=18'} | |
| cpu: [riscv64] | |
| os: [linux] | |
| '@esbuild/linux-s390x@0.25.0': | |
| resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} | |
| engines: {node: '>=18'} | |
| cpu: [s390x] | |
| os: [linux] | |
| '@esbuild/linux-s390x@0.25.2': | |
| resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} | |
| engines: {node: '>=18'} | |
| cpu: [s390x] | |
| os: [linux] | |
| '@esbuild/linux-x64@0.25.0': | |
| resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [linux] | |
| '@esbuild/linux-x64@0.25.2': | |
| resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [linux] | |
| '@esbuild/netbsd-arm64@0.25.0': | |
| resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [netbsd] | |
| '@esbuild/netbsd-arm64@0.25.2': | |
| resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [netbsd] | |
| '@esbuild/netbsd-x64@0.25.0': | |
| resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [netbsd] | |
| '@esbuild/netbsd-x64@0.25.2': | |
| resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [netbsd] | |
| '@esbuild/openbsd-arm64@0.25.0': | |
| resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [openbsd] | |
| '@esbuild/openbsd-arm64@0.25.2': | |
| resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [openbsd] | |
| '@esbuild/openbsd-x64@0.25.0': | |
| resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [openbsd] | |
| '@esbuild/openbsd-x64@0.25.2': | |
| resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [openbsd] | |
| '@esbuild/sunos-x64@0.25.0': | |
| resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [sunos] | |
| '@esbuild/sunos-x64@0.25.2': | |
| resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [sunos] | |
| '@esbuild/win32-arm64@0.25.0': | |
| resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [win32] | |
| '@esbuild/win32-arm64@0.25.2': | |
| resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} | |
| engines: {node: '>=18'} | |
| cpu: [arm64] | |
| os: [win32] | |
| '@esbuild/win32-ia32@0.25.0': | |
| resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} | |
| engines: {node: '>=18'} | |
| cpu: [ia32] | |
| os: [win32] | |
| '@esbuild/win32-ia32@0.25.2': | |
| resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} | |
| engines: {node: '>=18'} | |
| cpu: [ia32] | |
| os: [win32] | |
| '@esbuild/win32-x64@0.25.0': | |
| resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [win32] | |
| '@esbuild/win32-x64@0.25.2': | |
| resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} | |
| engines: {node: '>=18'} | |
| cpu: [x64] | |
| os: [win32] | |
| '@eslint-community/eslint-utils@4.6.1': | |
| resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} | |
| engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} | |
| peerDependencies: | |
| eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 | |
| '@eslint-community/regexpp@4.12.1': | |
| resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} | |
| engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} | |
| '@eslint/config-array@0.20.0': | |
| resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| '@eslint/config-helpers@0.2.1': | |
| resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| '@eslint/core@0.13.0': | |
| resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| '@eslint/eslintrc@3.3.1': | |
| resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| '@eslint/js@9.25.1': | |
| resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| '@eslint/object-schema@2.1.6': | |
| resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| '@eslint/plugin-kit@0.2.8': | |
| resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| '@humanfs/core@0.19.1': | |
| resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} | |
| engines: {node: '>=18.18.0'} | |
| '@humanfs/node@0.16.6': | |
| resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} | |
| engines: {node: '>=18.18.0'} | |
| '@humanwhocodes/module-importer@1.0.1': | |
| resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} | |
| engines: {node: '>=12.22'} | |
| '@humanwhocodes/retry@0.3.1': | |
| resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} | |
| engines: {node: '>=18.18'} | |
| '@humanwhocodes/retry@0.4.2': | |
| resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} | |
| engines: {node: '>=18.18'} | |
| '@isaacs/cliui@8.0.2': | |
| resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} | |
| engines: {node: '>=12'} | |
| '@jridgewell/gen-mapping@0.3.8': | |
| resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} | |
| engines: {node: '>=6.0.0'} | |
| '@jridgewell/resolve-uri@3.1.2': | |
| resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} | |
| engines: {node: '>=6.0.0'} | |
| '@jridgewell/set-array@1.2.1': | |
| resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} | |
| engines: {node: '>=6.0.0'} | |
| '@jridgewell/sourcemap-codec@1.5.0': | |
| resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} | |
| '@jridgewell/trace-mapping@0.3.25': | |
| resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} | |
| '@modelcontextprotocol/sdk@1.10.2': | |
| resolution: {integrity: sha512-rb6AMp2DR4SN+kc6L1ta2NCpApyA9WYNx3CrTSZvGxq9wH71bRur+zRqPfg0vQ9mjywR7qZdX2RGHOPq3ss+tA==} | |
| engines: {node: '>=18'} | |
| '@nodelib/fs.scandir@2.1.5': | |
| resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} | |
| engines: {node: '>= 8'} | |
| '@nodelib/fs.stat@2.0.5': | |
| resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} | |
| engines: {node: '>= 8'} | |
| '@nodelib/fs.walk@1.2.8': | |
| resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} | |
| engines: {node: '>= 8'} | |
| '@octokit/auth-token@5.1.2': | |
| resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} | |
| engines: {node: '>= 18'} | |
| '@octokit/core@6.1.4': | |
| resolution: {integrity: sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg==} | |
| engines: {node: '>= 18'} | |
| '@octokit/endpoint@10.1.3': | |
| resolution: {integrity: sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==} | |
| engines: {node: '>= 18'} | |
| '@octokit/graphql@8.2.1': | |
| resolution: {integrity: sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw==} | |
| engines: {node: '>= 18'} | |
| '@octokit/openapi-types@23.0.1': | |
| resolution: {integrity: sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==} | |
| '@octokit/plugin-paginate-rest@11.4.3': | |
| resolution: {integrity: sha512-tBXaAbXkqVJlRoA/zQVe9mUdb8rScmivqtpv3ovsC5xhje/a+NOCivs7eUhWBwCApJVsR4G5HMeaLbq7PxqZGA==} | |
| engines: {node: '>= 18'} | |
| peerDependencies: | |
| '@octokit/core': '>=6' | |
| '@octokit/plugin-retry@7.1.4': | |
| resolution: {integrity: sha512-7AIP4p9TttKN7ctygG4BtR7rrB0anZqoU9ThXFk8nETqIfvgPUANTSYHqWYknK7W3isw59LpZeLI8pcEwiJdRg==} | |
| engines: {node: '>= 18'} | |
| peerDependencies: | |
| '@octokit/core': '>=6' | |
| '@octokit/plugin-throttling@9.4.0': | |
| resolution: {integrity: sha512-IOlXxXhZA4Z3m0EEYtrrACkuHiArHLZ3CvqWwOez/pURNqRuwfoFlTPbN5Muf28pzFuztxPyiUiNwz8KctdZaQ==} | |
| engines: {node: '>= 18'} | |
| peerDependencies: | |
| '@octokit/core': ^6.1.3 | |
| '@octokit/request-error@6.1.7': | |
| resolution: {integrity: sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==} | |
| engines: {node: '>= 18'} | |
| '@octokit/request@9.2.2': | |
| resolution: {integrity: sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==} | |
| engines: {node: '>= 18'} | |
| '@octokit/types@13.8.0': | |
| resolution: {integrity: sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==} | |
| '@pkgjs/parseargs@0.11.0': | |
| resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} | |
| engines: {node: '>=14'} | |
| '@pnpm/config.env-replace@1.1.0': | |
| resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} | |
| engines: {node: '>=12.22.0'} | |
| '@pnpm/network.ca-file@1.0.2': | |
| resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} | |
| engines: {node: '>=12.22.0'} | |
| '@pnpm/npm-conf@2.3.1': | |
| resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} | |
| engines: {node: '>=12'} | |
| '@rollup/rollup-android-arm-eabi@4.34.8': | |
| resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} | |
| cpu: [arm] | |
| os: [android] | |
| '@rollup/rollup-android-arm-eabi@4.40.0': | |
| resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} | |
| cpu: [arm] | |
| os: [android] | |
| '@rollup/rollup-android-arm64@4.34.8': | |
| resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} | |
| cpu: [arm64] | |
| os: [android] | |
| '@rollup/rollup-android-arm64@4.40.0': | |
| resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} | |
| cpu: [arm64] | |
| os: [android] | |
| '@rollup/rollup-darwin-arm64@4.34.8': | |
| resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} | |
| cpu: [arm64] | |
| os: [darwin] | |
| '@rollup/rollup-darwin-arm64@4.40.0': | |
| resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} | |
| cpu: [arm64] | |
| os: [darwin] | |
| '@rollup/rollup-darwin-x64@4.34.8': | |
| resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} | |
| cpu: [x64] | |
| os: [darwin] | |
| '@rollup/rollup-darwin-x64@4.40.0': | |
| resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} | |
| cpu: [x64] | |
| os: [darwin] | |
| '@rollup/rollup-freebsd-arm64@4.34.8': | |
| resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} | |
| cpu: [arm64] | |
| os: [freebsd] | |
| '@rollup/rollup-freebsd-arm64@4.40.0': | |
| resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} | |
| cpu: [arm64] | |
| os: [freebsd] | |
| '@rollup/rollup-freebsd-x64@4.34.8': | |
| resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} | |
| cpu: [x64] | |
| os: [freebsd] | |
| '@rollup/rollup-freebsd-x64@4.40.0': | |
| resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} | |
| cpu: [x64] | |
| os: [freebsd] | |
| '@rollup/rollup-linux-arm-gnueabihf@4.34.8': | |
| resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} | |
| cpu: [arm] | |
| os: [linux] | |
| '@rollup/rollup-linux-arm-gnueabihf@4.40.0': | |
| resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} | |
| cpu: [arm] | |
| os: [linux] | |
| '@rollup/rollup-linux-arm-musleabihf@4.34.8': | |
| resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} | |
| cpu: [arm] | |
| os: [linux] | |
| '@rollup/rollup-linux-arm-musleabihf@4.40.0': | |
| resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} | |
| cpu: [arm] | |
| os: [linux] | |
| '@rollup/rollup-linux-arm64-gnu@4.34.8': | |
| resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} | |
| cpu: [arm64] | |
| os: [linux] | |
| '@rollup/rollup-linux-arm64-gnu@4.40.0': | |
| resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} | |
| cpu: [arm64] | |
| os: [linux] | |
| '@rollup/rollup-linux-arm64-musl@4.34.8': | |
| resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} | |
| cpu: [arm64] | |
| os: [linux] | |
| '@rollup/rollup-linux-arm64-musl@4.40.0': | |
| resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} | |
| cpu: [arm64] | |
| os: [linux] | |
| '@rollup/rollup-linux-loongarch64-gnu@4.34.8': | |
| resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} | |
| cpu: [loong64] | |
| os: [linux] | |
| '@rollup/rollup-linux-loongarch64-gnu@4.40.0': | |
| resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} | |
| cpu: [loong64] | |
| os: [linux] | |
| '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': | |
| resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} | |
| cpu: [ppc64] | |
| os: [linux] | |
| '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': | |
| resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} | |
| cpu: [ppc64] | |
| os: [linux] | |
| '@rollup/rollup-linux-riscv64-gnu@4.34.8': | |
| resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} | |
| cpu: [riscv64] | |
| os: [linux] | |
| '@rollup/rollup-linux-riscv64-gnu@4.40.0': | |
| resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} | |
| cpu: [riscv64] | |
| os: [linux] | |
| '@rollup/rollup-linux-riscv64-musl@4.40.0': | |
| resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} | |
| cpu: [riscv64] | |
| os: [linux] | |
| '@rollup/rollup-linux-s390x-gnu@4.34.8': | |
| resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} | |
| cpu: [s390x] | |
| os: [linux] | |
| '@rollup/rollup-linux-s390x-gnu@4.40.0': | |
| resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} | |
| cpu: [s390x] | |
| os: [linux] | |
| '@rollup/rollup-linux-x64-gnu@4.34.8': | |
| resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} | |
| cpu: [x64] | |
| os: [linux] | |
| '@rollup/rollup-linux-x64-gnu@4.40.0': | |
| resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} | |
| cpu: [x64] | |
| os: [linux] | |
| '@rollup/rollup-linux-x64-musl@4.34.8': | |
| resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} | |
| cpu: [x64] | |
| os: [linux] | |
| '@rollup/rollup-linux-x64-musl@4.40.0': | |
| resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} | |
| cpu: [x64] | |
| os: [linux] | |
| '@rollup/rollup-win32-arm64-msvc@4.34.8': | |
| resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} | |
| cpu: [arm64] | |
| os: [win32] | |
| '@rollup/rollup-win32-arm64-msvc@4.40.0': | |
| resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} | |
| cpu: [arm64] | |
| os: [win32] | |
| '@rollup/rollup-win32-ia32-msvc@4.34.8': | |
| resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} | |
| cpu: [ia32] | |
| os: [win32] | |
| '@rollup/rollup-win32-ia32-msvc@4.40.0': | |
| resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} | |
| cpu: [ia32] | |
| os: [win32] | |
| '@rollup/rollup-win32-x64-msvc@4.34.8': | |
| resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} | |
| cpu: [x64] | |
| os: [win32] | |
| '@rollup/rollup-win32-x64-msvc@4.40.0': | |
| resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} | |
| cpu: [x64] | |
| os: [win32] | |
| '@sebbo2002/semantic-release-jsr@2.0.5': | |
| resolution: {integrity: sha512-z0bg4YlabLno0ohfhVYyA8lJYTqC7HlnscXZAIA424cJyFrFH36IoYEzQa85nf8mTYruoqdUKAllrF7M79uFWA==} | |
| engines: {node: 18 || 20 || >=22.0.0} | |
| '@sec-ant/readable-stream@0.4.1': | |
| resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} | |
| '@semantic-release/commit-analyzer@13.0.1': | |
| resolution: {integrity: sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==} | |
| engines: {node: '>=20.8.1'} | |
| peerDependencies: | |
| semantic-release: '>=20.1.0' | |
| '@semantic-release/error@4.0.0': | |
| resolution: {integrity: sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==} | |
| engines: {node: '>=18'} | |
| '@semantic-release/github@11.0.1': | |
| resolution: {integrity: sha512-Z9cr0LgU/zgucbT9cksH0/pX9zmVda9hkDPcgIE0uvjMQ8w/mElDivGjx1w1pEQ+MuQJ5CBq3VCF16S6G4VH3A==} | |
| engines: {node: '>=20.8.1'} | |
| peerDependencies: | |
| semantic-release: '>=24.1.0' | |
| '@semantic-release/npm@12.0.1': | |
| resolution: {integrity: sha512-/6nntGSUGK2aTOI0rHPwY3ZjgY9FkXmEHbW9Kr+62NVOsyqpKKeP0lrCH+tphv+EsNdJNmqqwijTEnVWUMQ2Nw==} | |
| engines: {node: '>=20.8.1'} | |
| peerDependencies: | |
| semantic-release: '>=20.1.0' | |
| '@semantic-release/release-notes-generator@14.0.3': | |
| resolution: {integrity: sha512-XxAZRPWGwO5JwJtS83bRdoIhCiYIx8Vhr+u231pQAsdFIAbm19rSVJLdnBN+Avvk7CKvNQE/nJ4y7uqKH6WTiw==} | |
| engines: {node: '>=20.8.1'} | |
| peerDependencies: | |
| semantic-release: '>=20.1.0' | |
| '@sindresorhus/is@4.6.0': | |
| resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} | |
| engines: {node: '>=10'} | |
| '@sindresorhus/merge-streams@2.3.0': | |
| resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} | |
| engines: {node: '>=18'} | |
| '@sindresorhus/merge-streams@4.0.0': | |
| resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} | |
| engines: {node: '>=18'} | |
| '@standard-schema/spec@1.0.0': | |
| resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} | |
| '@tokenizer/inflate@0.2.7': | |
| resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} | |
| engines: {node: '>=18'} | |
| '@tokenizer/token@0.3.0': | |
| resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} | |
| '@tsconfig/node22@22.0.1': | |
| resolution: {integrity: sha512-VkgOa3n6jvs1p+r3DiwBqeEwGAwEvnVCg/hIjiANl5IEcqP3G0u5m8cBJspe1t9qjZRlZ7WFgqq5bJrGdgAKMg==} | |
| '@types/estree@1.0.6': | |
| resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} | |
| '@types/estree@1.0.7': | |
| resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} | |
| '@types/json-schema@7.0.15': | |
| resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} | |
| '@types/node@22.14.1': | |
| resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} | |
| '@types/normalize-package-data@2.4.4': | |
| resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} | |
| '@types/uri-templates@0.1.34': | |
| resolution: {integrity: sha512-13v4r/Op3iEO1y6FvEHQjrUNnrNyO67SigdFC9n80sVfsrM2AWJRNYbE1pBs4/p87I7z1J979JGeLAo3rM1L/Q==} | |
| '@types/yargs-parser@21.0.3': | |
| resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} | |
| '@types/yargs@17.0.33': | |
| resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} | |
| '@typescript-eslint/scope-manager@8.31.0': | |
| resolution: {integrity: sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| '@typescript-eslint/types@8.31.0': | |
| resolution: {integrity: sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| '@typescript-eslint/typescript-estree@8.31.0': | |
| resolution: {integrity: sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| peerDependencies: | |
| typescript: '>=4.8.4 <5.9.0' | |
| '@typescript-eslint/utils@8.31.0': | |
| resolution: {integrity: sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| peerDependencies: | |
| eslint: ^8.57.0 || ^9.0.0 | |
| typescript: '>=4.8.4 <5.9.0' | |
| '@typescript-eslint/visitor-keys@8.31.0': | |
| resolution: {integrity: sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| '@valibot/to-json-schema@1.0.0': | |
| resolution: {integrity: sha512-/9crJgPptVsGCL6X+JPDQyaJwkalSZ/52WuF8DiRUxJgcmpNdzYRfZ+gqMEP8W3CTVfuMWPqqvIgfwJ97f9Etw==} | |
| peerDependencies: | |
| valibot: ^1.0.0 | |
| '@vitest/expect@3.1.2': | |
| resolution: {integrity: sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==} | |
| '@vitest/mocker@3.1.2': | |
| resolution: {integrity: sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==} | |
| peerDependencies: | |
| msw: ^2.4.9 | |
| vite: ^5.0.0 || ^6.0.0 | |
| peerDependenciesMeta: | |
| msw: | |
| optional: true | |
| vite: | |
| optional: true | |
| '@vitest/pretty-format@3.1.2': | |
| resolution: {integrity: sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==} | |
| '@vitest/runner@3.1.2': | |
| resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==} | |
| '@vitest/snapshot@3.1.2': | |
| resolution: {integrity: sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==} | |
| '@vitest/spy@3.1.2': | |
| resolution: {integrity: sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==} | |
| '@vitest/utils@3.1.2': | |
| resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==} | |
| accepts@2.0.0: | |
| resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} | |
| engines: {node: '>= 0.6'} | |
| acorn-jsx@5.3.2: | |
| resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} | |
| peerDependencies: | |
| acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 | |
| acorn@8.14.1: | |
| resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} | |
| engines: {node: '>=0.4.0'} | |
| hasBin: true | |
| agent-base@7.1.3: | |
| resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} | |
| engines: {node: '>= 14'} | |
| aggregate-error@5.0.0: | |
| resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==} | |
| engines: {node: '>=18'} | |
| ajv@6.12.6: | |
| resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} | |
| ansi-escapes@7.0.0: | |
| resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} | |
| engines: {node: '>=18'} | |
| ansi-regex@5.0.1: | |
| resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} | |
| engines: {node: '>=8'} | |
| ansi-regex@6.1.0: | |
| resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} | |
| engines: {node: '>=12'} | |
| ansi-styles@3.2.1: | |
| resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} | |
| engines: {node: '>=4'} | |
| ansi-styles@4.3.0: | |
| resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} | |
| engines: {node: '>=8'} | |
| ansi-styles@6.2.1: | |
| resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} | |
| engines: {node: '>=12'} | |
| any-promise@1.3.0: | |
| resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} | |
| argparse@2.0.1: | |
| resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} | |
| argv-formatter@1.0.0: | |
| resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} | |
| arktype@2.1.20: | |
| resolution: {integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==} | |
| array-ify@1.0.0: | |
| resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} | |
| assertion-error@2.0.1: | |
| resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} | |
| engines: {node: '>=12'} | |
| balanced-match@1.0.2: | |
| resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} | |
| before-after-hook@3.0.2: | |
| resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} | |
| body-parser@2.2.0: | |
| resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} | |
| engines: {node: '>=18'} | |
| bottleneck@2.19.5: | |
| resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} | |
| brace-expansion@1.1.11: | |
| resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} | |
| brace-expansion@2.0.1: | |
| resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} | |
| braces@3.0.3: | |
| resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} | |
| engines: {node: '>=8'} | |
| bundle-require@5.1.0: | |
| resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} | |
| engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} | |
| peerDependencies: | |
| esbuild: '>=0.18' | |
| bytes@3.1.2: | |
| resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} | |
| engines: {node: '>= 0.8'} | |
| cac@6.7.14: | |
| resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} | |
| engines: {node: '>=8'} | |
| call-bind-apply-helpers@1.0.2: | |
| resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} | |
| engines: {node: '>= 0.4'} | |
| call-bound@1.0.4: | |
| resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} | |
| engines: {node: '>= 0.4'} | |
| callsites@3.1.0: | |
| resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} | |
| engines: {node: '>=6'} | |
| chai@5.2.0: | |
| resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} | |
| engines: {node: '>=12'} | |
| chalk@2.4.2: | |
| resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} | |
| engines: {node: '>=4'} | |
| chalk@4.1.2: | |
| resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} | |
| engines: {node: '>=10'} | |
| chalk@5.4.1: | |
| resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} | |
| engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} | |
| char-regex@1.0.2: | |
| resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} | |
| engines: {node: '>=10'} | |
| check-error@2.1.1: | |
| resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} | |
| engines: {node: '>= 16'} | |
| chokidar@4.0.3: | |
| resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} | |
| engines: {node: '>= 14.16.0'} | |
| clean-stack@5.2.0: | |
| resolution: {integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==} | |
| engines: {node: '>=14.16'} | |
| cli-highlight@2.1.11: | |
| resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} | |
| engines: {node: '>=8.0.0', npm: '>=5.0.0'} | |
| hasBin: true | |
| cli-table3@0.6.5: | |
| resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} | |
| engines: {node: 10.* || >= 12.*} | |
| cliui@7.0.4: | |
| resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} | |
| cliui@8.0.1: | |
| resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} | |
| engines: {node: '>=12'} | |
| color-convert@1.9.3: | |
| resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} | |
| color-convert@2.0.1: | |
| resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} | |
| engines: {node: '>=7.0.0'} | |
| color-name@1.1.3: | |
| resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} | |
| color-name@1.1.4: | |
| resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} | |
| commander@4.1.1: | |
| resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} | |
| engines: {node: '>= 6'} | |
| compare-func@2.0.0: | |
| resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} | |
| concat-map@0.0.1: | |
| resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} | |
| config-chain@1.1.13: | |
| resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} | |
| consola@3.4.0: | |
| resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} | |
| engines: {node: ^14.18.0 || >=16.10.0} | |
| content-disposition@1.0.0: | |
| resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} | |
| engines: {node: '>= 0.6'} | |
| content-type@1.0.5: | |
| resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} | |
| engines: {node: '>= 0.6'} | |
| conventional-changelog-angular@8.0.0: | |
| resolution: {integrity: sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==} | |
| engines: {node: '>=18'} | |
| conventional-changelog-writer@8.0.1: | |
| resolution: {integrity: sha512-hlqcy3xHred2gyYg/zXSMXraY2mjAYYo0msUCpK+BGyaVJMFCKWVXPIHiaacGO2GGp13kvHWXFhYmxT4QQqW3Q==} | |
| engines: {node: '>=18'} | |
| hasBin: true | |
| conventional-commits-filter@5.0.0: | |
| resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} | |
| engines: {node: '>=18'} | |
| conventional-commits-parser@6.1.0: | |
| resolution: {integrity: sha512-5nxDo7TwKB5InYBl4ZC//1g9GRwB/F3TXOGR9hgUjMGfvSP4Vu5NkpNro2+1+TIEy1vwxApl5ircECr2ri5JIw==} | |
| engines: {node: '>=18'} | |
| hasBin: true | |
| convert-hrtime@5.0.0: | |
| resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} | |
| engines: {node: '>=12'} | |
| cookie-signature@1.2.2: | |
| resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} | |
| engines: {node: '>=6.6.0'} | |
| cookie@0.7.2: | |
| resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} | |
| engines: {node: '>= 0.6'} | |
| core-util-is@1.0.3: | |
| resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} | |
| cors@2.8.5: | |
| resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} | |
| engines: {node: '>= 0.10'} | |
| cosmiconfig@9.0.0: | |
| resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} | |
| engines: {node: '>=14'} | |
| peerDependencies: | |
| typescript: '>=4.9.5' | |
| peerDependenciesMeta: | |
| typescript: | |
| optional: true | |
| cross-spawn@7.0.6: | |
| resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} | |
| engines: {node: '>= 8'} | |
| crypto-random-string@4.0.0: | |
| resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} | |
| engines: {node: '>=12'} | |
| debug@4.4.0: | |
| resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} | |
| engines: {node: '>=6.0'} | |
| peerDependencies: | |
| supports-color: '*' | |
| peerDependenciesMeta: | |
| supports-color: | |
| optional: true | |
| deep-eql@5.0.2: | |
| resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} | |
| engines: {node: '>=6'} | |
| deep-extend@0.6.0: | |
| resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} | |
| engines: {node: '>=4.0.0'} | |
| deep-is@0.1.4: | |
| resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} | |
| depd@2.0.0: | |
| resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} | |
| engines: {node: '>= 0.8'} | |
| dir-glob@3.0.1: | |
| resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} | |
| engines: {node: '>=8'} | |
| dot-prop@5.3.0: | |
| resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} | |
| engines: {node: '>=8'} | |
| dunder-proto@1.0.1: | |
| resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} | |
| engines: {node: '>= 0.4'} | |
| duplexer2@0.1.4: | |
| resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} | |
| eastasianwidth@0.2.0: | |
| resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} | |
| ee-first@1.1.1: | |
| resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} | |
| emoji-regex@8.0.0: | |
| resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} | |
| emoji-regex@9.2.2: | |
| resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} | |
| emojilib@2.4.0: | |
| resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} | |
| encodeurl@2.0.0: | |
| resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} | |
| engines: {node: '>= 0.8'} | |
| env-ci@11.1.0: | |
| resolution: {integrity: sha512-Z8dnwSDbV1XYM9SBF2J0GcNVvmfmfh3a49qddGIROhBoVro6MZVTji15z/sJbQ2ko2ei8n988EU1wzoLU/tF+g==} | |
| engines: {node: ^18.17 || >=20.6.1} | |
| env-paths@2.2.1: | |
| resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} | |
| engines: {node: '>=6'} | |
| environment@1.1.0: | |
| resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} | |
| engines: {node: '>=18'} | |
| error-ex@1.3.2: | |
| resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} | |
| es-define-property@1.0.1: | |
| resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} | |
| engines: {node: '>= 0.4'} | |
| es-errors@1.3.0: | |
| resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} | |
| engines: {node: '>= 0.4'} | |
| es-module-lexer@1.6.0: | |
| resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} | |
| es-object-atoms@1.1.1: | |
| resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} | |
| engines: {node: '>= 0.4'} | |
| esbuild@0.25.0: | |
| resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} | |
| engines: {node: '>=18'} | |
| hasBin: true | |
| esbuild@0.25.2: | |
| resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} | |
| engines: {node: '>=18'} | |
| hasBin: true | |
| escalade@3.2.0: | |
| resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} | |
| engines: {node: '>=6'} | |
| escape-html@1.0.3: | |
| resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} | |
| escape-string-regexp@1.0.5: | |
| resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} | |
| engines: {node: '>=0.8.0'} | |
| escape-string-regexp@4.0.0: | |
| resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} | |
| engines: {node: '>=10'} | |
| escape-string-regexp@5.0.0: | |
| resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} | |
| engines: {node: '>=12'} | |
| eslint-plugin-perfectionist@4.12.0: | |
| resolution: {integrity: sha512-qvjf2IK3w11kyA24eLBKRifjtnwu+kluYTALmKdYCg5xWH1W5uQar3QXGHNOIvGuIM1djpy0FDMssVPPIbTe4Q==} | |
| engines: {node: ^18.0.0 || >=20.0.0} | |
| peerDependencies: | |
| eslint: '>=8.45.0' | |
| eslint-scope@8.3.0: | |
| resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| eslint-visitor-keys@3.4.3: | |
| resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} | |
| engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} | |
| eslint-visitor-keys@4.2.0: | |
| resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| eslint@9.25.1: | |
| resolution: {integrity: sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| hasBin: true | |
| peerDependencies: | |
| jiti: '*' | |
| peerDependenciesMeta: | |
| jiti: | |
| optional: true | |
| espree@10.3.0: | |
| resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} | |
| engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | |
| esquery@1.6.0: | |
| resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} | |
| engines: {node: '>=0.10'} | |
| esrecurse@4.3.0: | |
| resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} | |
| engines: {node: '>=4.0'} | |
| estraverse@5.3.0: | |
| resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} | |
| engines: {node: '>=4.0'} | |
| estree-walker@3.0.3: | |
| resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} | |
| esutils@2.0.3: | |
| resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} | |
| engines: {node: '>=0.10.0'} | |
| etag@1.8.1: | |
| resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} | |
| engines: {node: '>= 0.6'} | |
| eventsource-client@1.1.3: | |
| resolution: {integrity: sha512-6GJGePDMxin/6VH1Dex7RqnZRguweO1BVKhXpBYwKcQbVLOZPLfeDr9vYSb9ra88kjs0NpT8FaEDz5rExedDkg==} | |
| engines: {node: '>=18.0.0'} | |
| eventsource-parser@3.0.0: | |
| resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} | |
| engines: {node: '>=18.0.0'} | |
| eventsource-parser@3.0.1: | |
| resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==} | |
| engines: {node: '>=18.0.0'} | |
| eventsource@3.0.6: | |
| resolution: {integrity: sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==} | |
| engines: {node: '>=18.0.0'} | |
| execa@8.0.1: | |
| resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} | |
| engines: {node: '>=16.17'} | |
| execa@9.5.2: | |
| resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} | |
| engines: {node: ^18.19.0 || >=20.5.0} | |
| expect-type@1.2.1: | |
| resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} | |
| engines: {node: '>=12.0.0'} | |
| express-rate-limit@7.5.0: | |
| resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} | |
| engines: {node: '>= 16'} | |
| peerDependencies: | |
| express: ^4.11 || 5 || ^5.0.0-beta.1 | |
| express@5.1.0: | |
| resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} | |
| engines: {node: '>= 18'} | |
| fast-content-type-parse@2.0.1: | |
| resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} | |
| fast-deep-equal@3.1.3: | |
| resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} | |
| fast-glob@3.3.3: | |
| resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} | |
| engines: {node: '>=8.6.0'} | |
| fast-json-stable-stringify@2.1.0: | |
| resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} | |
| fast-levenshtein@2.0.6: | |
| resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} | |
| fastq@1.19.0: | |
| resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} | |
| fdir@6.4.3: | |
| resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} | |
| peerDependencies: | |
| picomatch: ^3 || ^4 | |
| peerDependenciesMeta: | |
| picomatch: | |
| optional: true | |
| fdir@6.4.4: | |
| resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} | |
| peerDependencies: | |
| picomatch: ^3 || ^4 | |
| peerDependenciesMeta: | |
| picomatch: | |
| optional: true | |
| fflate@0.8.2: | |
| resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} | |
| figures@2.0.0: | |
| resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} | |
| engines: {node: '>=4'} | |
| figures@6.1.0: | |
| resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} | |
| engines: {node: '>=18'} | |
| file-entry-cache@8.0.0: | |
| resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} | |
| engines: {node: '>=16.0.0'} | |
| file-type@20.4.1: | |
| resolution: {integrity: sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==} | |
| engines: {node: '>=18'} | |
| fill-range@7.1.1: | |
| resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} | |
| engines: {node: '>=8'} | |
| finalhandler@2.1.0: | |
| resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} | |
| engines: {node: '>= 0.8'} | |
| find-up-simple@1.0.0: | |
| resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} | |
| engines: {node: '>=18'} | |
| find-up@2.1.0: | |
| resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} | |
| engines: {node: '>=4'} | |
| find-up@5.0.0: | |
| resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} | |
| engines: {node: '>=10'} | |
| find-versions@6.0.0: | |
| resolution: {integrity: sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==} | |
| engines: {node: '>=18'} | |
| flat-cache@4.0.1: | |
| resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} | |
| engines: {node: '>=16'} | |
| flatted@3.3.3: | |
| resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} | |
| foreground-child@3.3.1: | |
| resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} | |
| engines: {node: '>=14'} | |
| forwarded@0.2.0: | |
| resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} | |
| engines: {node: '>= 0.6'} | |
| fresh@2.0.0: | |
| resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} | |
| engines: {node: '>= 0.8'} | |
| from2@2.3.0: | |
| resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} | |
| fs-extra@11.3.0: | |
| resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} | |
| engines: {node: '>=14.14'} | |
| fsevents@2.3.3: | |
| resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} | |
| engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} | |
| os: [darwin] | |
| function-bind@1.1.2: | |
| resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} | |
| function-timeout@1.0.2: | |
| resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} | |
| engines: {node: '>=18'} | |
| fuse.js@7.1.0: | |
| resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} | |
| engines: {node: '>=10'} | |
| get-caller-file@2.0.5: | |
| resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} | |
| engines: {node: 6.* || 8.* || >= 10.*} | |
| get-intrinsic@1.3.0: | |
| resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} | |
| engines: {node: '>= 0.4'} | |
| get-port-please@3.1.2: | |
| resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} | |
| get-proto@1.0.1: | |
| resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} | |
| engines: {node: '>= 0.4'} | |
| get-stream@6.0.1: | |
| resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} | |
| engines: {node: '>=10'} | |
| get-stream@7.0.1: | |
| resolution: {integrity: sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==} | |
| engines: {node: '>=16'} | |
| get-stream@8.0.1: | |
| resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} | |
| engines: {node: '>=16'} | |
| get-stream@9.0.1: | |
| resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} | |
| engines: {node: '>=18'} | |
| git-log-parser@1.2.1: | |
| resolution: {integrity: sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==} | |
| glob-parent@5.1.2: | |
| resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} | |
| engines: {node: '>= 6'} | |
| glob-parent@6.0.2: | |
| resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} | |
| engines: {node: '>=10.13.0'} | |
| glob@10.4.5: | |
| resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} | |
| hasBin: true | |
| globals@14.0.0: | |
| resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} | |
| engines: {node: '>=18'} | |
| globby@14.1.0: | |
| resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} | |
| engines: {node: '>=18'} | |
| gopd@1.2.0: | |
| resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} | |
| engines: {node: '>= 0.4'} | |
| graceful-fs@4.2.10: | |
| resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} | |
| graceful-fs@4.2.11: | |
| resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} | |
| handlebars@4.7.8: | |
| resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} | |
| engines: {node: '>=0.4.7'} | |
| hasBin: true | |
| has-flag@3.0.0: | |
| resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} | |
| engines: {node: '>=4'} | |
| has-flag@4.0.0: | |
| resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} | |
| engines: {node: '>=8'} | |
| has-symbols@1.1.0: | |
| resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} | |
| engines: {node: '>= 0.4'} | |
| hasown@2.0.2: | |
| resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} | |
| engines: {node: '>= 0.4'} | |
| highlight.js@10.7.3: | |
| resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} | |
| hook-std@3.0.0: | |
| resolution: {integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==} | |
| engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} | |
| hosted-git-info@7.0.2: | |
| resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} | |
| engines: {node: ^16.14.0 || >=18.0.0} | |
| hosted-git-info@8.0.2: | |
| resolution: {integrity: sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==} | |
| engines: {node: ^18.17.0 || >=20.5.0} | |
| http-errors@2.0.0: | |
| resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} | |
| engines: {node: '>= 0.8'} | |
| http-proxy-agent@7.0.2: | |
| resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} | |
| engines: {node: '>= 14'} | |
| https-proxy-agent@7.0.6: | |
| resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} | |
| engines: {node: '>= 14'} | |
| human-signals@5.0.0: | |
| resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} | |
| engines: {node: '>=16.17.0'} | |
| human-signals@8.0.0: | |
| resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} | |
| engines: {node: '>=18.18.0'} | |
| iconv-lite@0.6.3: | |
| resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} | |
| engines: {node: '>=0.10.0'} | |
| ieee754@1.2.1: | |
| resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} | |
| ignore@5.3.2: | |
| resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} | |
| engines: {node: '>= 4'} | |
| ignore@7.0.3: | |
| resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} | |
| engines: {node: '>= 4'} | |
| import-fresh@3.3.1: | |
| resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} | |
| engines: {node: '>=6'} | |
| import-from-esm@2.0.0: | |
| resolution: {integrity: sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==} | |
| engines: {node: '>=18.20'} | |
| import-meta-resolve@4.1.0: | |
| resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} | |
| imurmurhash@0.1.4: | |
| resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} | |
| engines: {node: '>=0.8.19'} | |
| indent-string@5.0.0: | |
| resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} | |
| engines: {node: '>=12'} | |
| index-to-position@0.1.2: | |
| resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} | |
| engines: {node: '>=18'} | |
| inherits@2.0.4: | |
| resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} | |
| ini@1.3.8: | |
| resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} | |
| into-stream@7.0.0: | |
| resolution: {integrity: sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==} | |
| engines: {node: '>=12'} | |
| ipaddr.js@1.9.1: | |
| resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} | |
| engines: {node: '>= 0.10'} | |
| is-arrayish@0.2.1: | |
| resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} | |
| is-extglob@2.1.1: | |
| resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} | |
| engines: {node: '>=0.10.0'} | |
| is-fullwidth-code-point@3.0.0: | |
| resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} | |
| engines: {node: '>=8'} | |
| is-glob@4.0.3: | |
| resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} | |
| engines: {node: '>=0.10.0'} | |
| is-number@7.0.0: | |
| resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} | |
| engines: {node: '>=0.12.0'} | |
| is-obj@2.0.0: | |
| resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} | |
| engines: {node: '>=8'} | |
| is-plain-obj@4.1.0: | |
| resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} | |
| engines: {node: '>=12'} | |
| is-promise@4.0.0: | |
| resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} | |
| is-stream@3.0.0: | |
| resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} | |
| engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} | |
| is-stream@4.0.1: | |
| resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} | |
| engines: {node: '>=18'} | |
| is-unicode-supported@2.1.0: | |
| resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} | |
| engines: {node: '>=18'} | |
| isarray@1.0.0: | |
| resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} | |
| isexe@2.0.0: | |
| resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} | |
| issue-parser@7.0.1: | |
| resolution: {integrity: sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==} | |
| engines: {node: ^18.17 || >=20.6.1} | |
| jackspeak@3.4.3: | |
| resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} | |
| java-properties@1.0.2: | |
| resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} | |
| engines: {node: '>= 0.6.0'} | |
| joycon@3.1.1: | |
| resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} | |
| engines: {node: '>=10'} | |
| js-tokens@4.0.0: | |
| resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} | |
| js-yaml@4.1.0: | |
| resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} | |
| hasBin: true | |
| json-buffer@3.0.1: | |
| resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} | |
| json-parse-better-errors@1.0.2: | |
| resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} | |
| json-parse-even-better-errors@2.3.1: | |
| resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} | |
| json-schema-traverse@0.4.1: | |
| resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} | |
| json-stable-stringify-without-jsonify@1.0.1: | |
| resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} | |
| jsonfile@6.1.0: | |
| resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} | |
| jsr@0.13.4: | |
| resolution: {integrity: sha512-GJ9Ju8kf2SxH90C1AqANrMKBFlDjrZu1YoFm4SoMCOBOxix3Bvirdg5JB31gbF8FwPBo3196dAaqV0WUjeuq8Q==} | |
| hasBin: true | |
| keyv@4.5.4: | |
| resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} | |
| kolorist@1.8.0: | |
| resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} | |
| levn@0.4.1: | |
| resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} | |
| engines: {node: '>= 0.8.0'} | |
| lilconfig@3.1.3: | |
| resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} | |
| engines: {node: '>=14'} | |
| lines-and-columns@1.2.4: | |
| resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} | |
| load-json-file@4.0.0: | |
| resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} | |
| engines: {node: '>=4'} | |
| load-tsconfig@0.2.5: | |
| resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} | |
| engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} | |
| locate-path@2.0.0: | |
| resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} | |
| engines: {node: '>=4'} | |
| locate-path@6.0.0: | |
| resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} | |
| engines: {node: '>=10'} | |
| lodash-es@4.17.21: | |
| resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} | |
| lodash.capitalize@4.2.1: | |
| resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} | |
| lodash.escaperegexp@4.1.2: | |
| resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} | |
| lodash.isplainobject@4.0.6: | |
| resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} | |
| lodash.isstring@4.0.1: | |
| resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} | |
| lodash.merge@4.6.2: | |
| resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} | |
| lodash.sortby@4.7.0: | |
| resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} | |
| lodash.uniqby@4.7.0: | |
| resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} | |
| loupe@3.1.3: | |
| resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} | |
| lru-cache@10.4.3: | |
| resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} | |
| magic-string@0.30.17: | |
| resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} | |
| marked-terminal@7.3.0: | |
| resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} | |
| engines: {node: '>=16.0.0'} | |
| peerDependencies: | |
| marked: '>=1 <16' | |
| marked@12.0.2: | |
| resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==} | |
| engines: {node: '>= 18'} | |
| hasBin: true | |
| math-intrinsics@1.1.0: | |
| resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} | |
| engines: {node: '>= 0.4'} | |
| mcp-proxy@2.12.2: | |
| resolution: {integrity: sha512-SkQoKjnprsBUwXcP7cflJnDYEHBK0VnmeMkur5epct3KCtjxGC3rJDI/m41VfW9rk6bbHvt/bPTa1udz2eegpQ==} | |
| hasBin: true | |
| media-typer@1.1.0: | |
| resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} | |
| engines: {node: '>= 0.8'} | |
| meow@13.2.0: | |
| resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} | |
| engines: {node: '>=18'} | |
| merge-descriptors@2.0.0: | |
| resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} | |
| engines: {node: '>=18'} | |
| merge-stream@2.0.0: | |
| resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} | |
| merge2@1.4.1: | |
| resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} | |
| engines: {node: '>= 8'} | |
| micromatch@4.0.8: | |
| resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} | |
| engines: {node: '>=8.6'} | |
| mime-db@1.54.0: | |
| resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} | |
| engines: {node: '>= 0.6'} | |
| mime-types@3.0.1: | |
| resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} | |
| engines: {node: '>= 0.6'} | |
| mime@4.0.6: | |
| resolution: {integrity: sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==} | |
| engines: {node: '>=16'} | |
| hasBin: true | |
| mimic-fn@4.0.0: | |
| resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} | |
| engines: {node: '>=12'} | |
| minimatch@3.1.2: | |
| resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} | |
| minimatch@9.0.5: | |
| resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} | |
| engines: {node: '>=16 || 14 >=14.17'} | |
| minimist@1.2.8: | |
| resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} | |
| minipass@7.1.2: | |
| resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} | |
| engines: {node: '>=16 || 14 >=14.17'} | |
| ms@2.1.3: | |
| resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} | |
| mz@2.7.0: | |
| resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} | |
| nanoid@3.3.11: | |
| resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} | |
| engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} | |
| hasBin: true | |
| natural-compare@1.4.0: | |
| resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} | |
| natural-orderby@5.0.0: | |
| resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} | |
| engines: {node: '>=18'} | |
| negotiator@1.0.0: | |
| resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} | |
| engines: {node: '>= 0.6'} | |
| neo-async@2.6.2: | |
| resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} | |
| nerf-dart@1.0.0: | |
| resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==} | |
| node-emoji@2.2.0: | |
| resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} | |
| engines: {node: '>=18'} | |
| node-stream-zip@1.15.0: | |
| resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} | |
| engines: {node: '>=0.12.0'} | |
| normalize-package-data@6.0.2: | |
| resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} | |
| engines: {node: ^16.14.0 || >=18.0.0} | |
| normalize-url@8.0.1: | |
| resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} | |
| engines: {node: '>=14.16'} | |
| npm-run-path@5.3.0: | |
| resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} | |
| engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} | |
| npm-run-path@6.0.0: | |
| resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} | |
| engines: {node: '>=18'} | |
| npm@10.9.2: | |
| resolution: {integrity: sha512-iriPEPIkoMYUy3F6f3wwSZAU93E0Eg6cHwIR6jzzOXWSy+SD/rOODEs74cVONHKSx2obXtuUoyidVEhISrisgQ==} | |
| engines: {node: ^18.17.0 || >=20.5.0} | |
| hasBin: true | |
| bundledDependencies: | |
| - '@isaacs/string-locale-compare' | |
| - '@npmcli/arborist' | |
| - '@npmcli/config' | |
| - '@npmcli/fs' | |
| - '@npmcli/map-workspaces' | |
| - '@npmcli/package-json' | |
| - '@npmcli/promise-spawn' | |
| - '@npmcli/redact' | |
| - '@npmcli/run-script' | |
| - '@sigstore/tuf' | |
| - abbrev | |
| - archy | |
| - cacache | |
| - chalk | |
| - ci-info | |
| - cli-columns | |
| - fastest-levenshtein | |
| - fs-minipass | |
| - glob | |
| - graceful-fs | |
| - hosted-git-info | |
| - ini | |
| - init-package-json | |
| - is-cidr | |
| - json-parse-even-better-errors | |
| - libnpmaccess | |
| - libnpmdiff | |
| - libnpmexec | |
| - libnpmfund | |
| - libnpmhook | |
| - libnpmorg | |
| - libnpmpack | |
| - libnpmpublish | |
| - libnpmsearch | |
| - libnpmteam | |
| - libnpmversion | |
| - make-fetch-happen | |
| - minimatch | |
| - minipass | |
| - minipass-pipeline | |
| - ms | |
| - node-gyp | |
| - nopt | |
| - normalize-package-data | |
| - npm-audit-report | |
| - npm-install-checks | |
| - npm-package-arg | |
| - npm-pick-manifest | |
| - npm-profile | |
| - npm-registry-fetch | |
| - npm-user-validate | |
| - p-map | |
| - pacote | |
| - parse-conflict-json | |
| - proc-log | |
| - qrcode-terminal | |
| - read | |
| - semver | |
| - spdx-expression-parse | |
| - ssri | |
| - supports-color | |
| - tar | |
| - text-table | |
| - tiny-relative-date | |
| - treeverse | |
| - validate-npm-package-name | |
| - which | |
| - write-file-atomic | |
| object-assign@4.1.1: | |
| resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} | |
| engines: {node: '>=0.10.0'} | |
| object-inspect@1.13.4: | |
| resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} | |
| engines: {node: '>= 0.4'} | |
| on-finished@2.4.1: | |
| resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} | |
| engines: {node: '>= 0.8'} | |
| once@1.4.0: | |
| resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} | |
| onetime@6.0.0: | |
| resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} | |
| engines: {node: '>=12'} | |
| optionator@0.9.4: | |
| resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} | |
| engines: {node: '>= 0.8.0'} | |
| p-each-series@3.0.0: | |
| resolution: {integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==} | |
| engines: {node: '>=12'} | |
| p-filter@4.1.0: | |
| resolution: {integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==} | |
| engines: {node: '>=18'} | |
| p-is-promise@3.0.0: | |
| resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} | |
| engines: {node: '>=8'} | |
| p-limit@1.3.0: | |
| resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} | |
| engines: {node: '>=4'} | |
| p-limit@3.1.0: | |
| resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} | |
| engines: {node: '>=10'} | |
| p-locate@2.0.0: | |
| resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} | |
| engines: {node: '>=4'} | |
| p-locate@5.0.0: | |
| resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} | |
| engines: {node: '>=10'} | |
| p-map@7.0.3: | |
| resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} | |
| engines: {node: '>=18'} | |
| p-reduce@3.0.0: | |
| resolution: {integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==} | |
| engines: {node: '>=12'} | |
| p-try@1.0.0: | |
| resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} | |
| engines: {node: '>=4'} | |
| package-json-from-dist@1.0.1: | |
| resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} | |
| parent-module@1.0.1: | |
| resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} | |
| engines: {node: '>=6'} | |
| parse-json@4.0.0: | |
| resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} | |
| engines: {node: '>=4'} | |
| parse-json@5.2.0: | |
| resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} | |
| engines: {node: '>=8'} | |
| parse-json@8.1.0: | |
| resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} | |
| engines: {node: '>=18'} | |
| parse-ms@4.0.0: | |
| resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} | |
| engines: {node: '>=18'} | |
| parse5-htmlparser2-tree-adapter@6.0.1: | |
| resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} | |
| parse5@5.1.1: | |
| resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} | |
| parse5@6.0.1: | |
| resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} | |
| parseurl@1.3.3: | |
| resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} | |
| engines: {node: '>= 0.8'} | |
| path-exists@3.0.0: | |
| resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} | |
| engines: {node: '>=4'} | |
| path-exists@4.0.0: | |
| resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} | |
| engines: {node: '>=8'} | |
| path-key@3.1.1: | |
| resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} | |
| engines: {node: '>=8'} | |
| path-key@4.0.0: | |
| resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} | |
| engines: {node: '>=12'} | |
| path-scurry@1.11.1: | |
| resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} | |
| engines: {node: '>=16 || 14 >=14.18'} | |
| path-to-regexp@8.2.0: | |
| resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} | |
| engines: {node: '>=16'} | |
| path-type@4.0.0: | |
| resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} | |
| engines: {node: '>=8'} | |
| path-type@6.0.0: | |
| resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} | |
| engines: {node: '>=18'} | |
| pathe@2.0.3: | |
| resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} | |
| pathval@2.0.0: | |
| resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} | |
| engines: {node: '>= 14.16'} | |
| peek-readable@7.0.0: | |
| resolution: {integrity: sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==} | |
| engines: {node: '>=18'} | |
| picocolors@1.1.1: | |
| resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} | |
| picomatch@2.3.1: | |
| resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} | |
| engines: {node: '>=8.6'} | |
| picomatch@4.0.2: | |
| resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} | |
| engines: {node: '>=12'} | |
| pify@3.0.0: | |
| resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} | |
| engines: {node: '>=4'} | |
| pirates@4.0.6: | |
| resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} | |
| engines: {node: '>= 6'} | |
| pkce-challenge@5.0.0: | |
| resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} | |
| engines: {node: '>=16.20.0'} | |
| pkg-conf@2.1.0: | |
| resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} | |
| engines: {node: '>=4'} | |
| postcss-load-config@6.0.1: | |
| resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} | |
| engines: {node: '>= 18'} | |
| peerDependencies: | |
| jiti: '>=1.21.0' | |
| postcss: '>=8.0.9' | |
| tsx: ^4.8.1 | |
| yaml: ^2.4.2 | |
| peerDependenciesMeta: | |
| jiti: | |
| optional: true | |
| postcss: | |
| optional: true | |
| tsx: | |
| optional: true | |
| yaml: | |
| optional: true | |
| postcss@8.5.3: | |
| resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} | |
| engines: {node: ^10 || ^12 || >=14} | |
| prelude-ls@1.2.1: | |
| resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} | |
| engines: {node: '>= 0.8.0'} | |
| prettier@3.5.3: | |
| resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} | |
| engines: {node: '>=14'} | |
| hasBin: true | |
| pretty-ms@9.2.0: | |
| resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} | |
| engines: {node: '>=18'} | |
| process-nextick-args@2.0.1: | |
| resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} | |
| proto-list@1.2.4: | |
| resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} | |
| proxy-addr@2.0.7: | |
| resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} | |
| engines: {node: '>= 0.10'} | |
| punycode@2.3.1: | |
| resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} | |
| engines: {node: '>=6'} | |
| qs@6.14.0: | |
| resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} | |
| engines: {node: '>=0.6'} | |
| queue-microtask@1.2.3: | |
| resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} | |
| range-parser@1.2.1: | |
| resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} | |
| engines: {node: '>= 0.6'} | |
| raw-body@3.0.0: | |
| resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} | |
| engines: {node: '>= 0.8'} | |
| rc@1.2.8: | |
| resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} | |
| hasBin: true | |
| read-package-up@11.0.0: | |
| resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} | |
| engines: {node: '>=18'} | |
| read-pkg@9.0.1: | |
| resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} | |
| engines: {node: '>=18'} | |
| readable-stream@2.3.8: | |
| resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} | |
| readdirp@4.1.2: | |
| resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} | |
| engines: {node: '>= 14.18.0'} | |
| registry-auth-token@5.1.0: | |
| resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} | |
| engines: {node: '>=14'} | |
| require-directory@2.1.1: | |
| resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} | |
| engines: {node: '>=0.10.0'} | |
| resolve-from@4.0.0: | |
| resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} | |
| engines: {node: '>=4'} | |
| resolve-from@5.0.0: | |
| resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} | |
| engines: {node: '>=8'} | |
| reusify@1.0.4: | |
| resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} | |
| engines: {iojs: '>=1.0.0', node: '>=0.10.0'} | |
| rollup@4.34.8: | |
| resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} | |
| engines: {node: '>=18.0.0', npm: '>=8.0.0'} | |
| hasBin: true | |
| rollup@4.40.0: | |
| resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} | |
| engines: {node: '>=18.0.0', npm: '>=8.0.0'} | |
| hasBin: true | |
| router@2.2.0: | |
| resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} | |
| engines: {node: '>= 18'} | |
| run-parallel@1.2.0: | |
| resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} | |
| safe-buffer@5.1.2: | |
| resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} | |
| safe-buffer@5.2.1: | |
| resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} | |
| safer-buffer@2.1.2: | |
| resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} | |
| semantic-release@24.2.3: | |
| resolution: {integrity: sha512-KRhQG9cUazPavJiJEFIJ3XAMjgfd0fcK3B+T26qOl8L0UG5aZUjeRfREO0KM5InGtYwxqiiytkJrbcYoLDEv0A==} | |
| engines: {node: '>=20.8.1'} | |
| hasBin: true | |
| semiver@1.1.0: | |
| resolution: {integrity: sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==} | |
| engines: {node: '>=6'} | |
| semver-diff@4.0.0: | |
| resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} | |
| engines: {node: '>=12'} | |
| semver-regex@4.0.5: | |
| resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} | |
| engines: {node: '>=12'} | |
| semver@7.7.1: | |
| resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} | |
| engines: {node: '>=10'} | |
| hasBin: true | |
| send@1.2.0: | |
| resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} | |
| engines: {node: '>= 18'} | |
| serve-static@2.2.0: | |
| resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} | |
| engines: {node: '>= 18'} | |
| setprototypeof@1.2.0: | |
| resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} | |
| shebang-command@2.0.0: | |
| resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} | |
| engines: {node: '>=8'} | |
| shebang-regex@3.0.0: | |
| resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} | |
| engines: {node: '>=8'} | |
| side-channel-list@1.0.0: | |
| resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} | |
| engines: {node: '>= 0.4'} | |
| side-channel-map@1.0.1: | |
| resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} | |
| engines: {node: '>= 0.4'} | |
| side-channel-weakmap@1.0.2: | |
| resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} | |
| engines: {node: '>= 0.4'} | |
| side-channel@1.1.0: | |
| resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} | |
| engines: {node: '>= 0.4'} | |
| siginfo@2.0.0: | |
| resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} | |
| signal-exit@4.1.0: | |
| resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} | |
| engines: {node: '>=14'} | |
| signale@1.4.0: | |
| resolution: {integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==} | |
| engines: {node: '>=6'} | |
| skin-tone@2.0.0: | |
| resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} | |
| engines: {node: '>=8'} | |
| slash@5.1.0: | |
| resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} | |
| engines: {node: '>=14.16'} | |
| source-map-js@1.2.1: | |
| resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} | |
| engines: {node: '>=0.10.0'} | |
| source-map@0.6.1: | |
| resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} | |
| engines: {node: '>=0.10.0'} | |
| source-map@0.8.0-beta.0: | |
| resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} | |
| engines: {node: '>= 8'} | |
| spawn-error-forwarder@1.0.0: | |
| resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} | |
| spdx-correct@3.2.0: | |
| resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} | |
| spdx-exceptions@2.5.0: | |
| resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} | |
| spdx-expression-parse@3.0.1: | |
| resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} | |
| spdx-license-ids@3.0.21: | |
| resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} | |
| split2@1.0.0: | |
| resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} | |
| stackback@0.0.2: | |
| resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} | |
| statuses@2.0.1: | |
| resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} | |
| engines: {node: '>= 0.8'} | |
| std-env@3.9.0: | |
| resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} | |
| stream-combiner2@1.1.1: | |
| resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} | |
| strict-event-emitter-types@2.0.0: | |
| resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} | |
| string-width@4.2.3: | |
| resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} | |
| engines: {node: '>=8'} | |
| string-width@5.1.2: | |
| resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} | |
| engines: {node: '>=12'} | |
| string_decoder@1.1.1: | |
| resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} | |
| strip-ansi@6.0.1: | |
| resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} | |
| engines: {node: '>=8'} | |
| strip-ansi@7.1.0: | |
| resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} | |
| engines: {node: '>=12'} | |
| strip-bom@3.0.0: | |
| resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} | |
| engines: {node: '>=4'} | |
| strip-final-newline@3.0.0: | |
| resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} | |
| engines: {node: '>=12'} | |
| strip-final-newline@4.0.0: | |
| resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} | |
| engines: {node: '>=18'} | |
| strip-json-comments@2.0.1: | |
| resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} | |
| engines: {node: '>=0.10.0'} | |
| strip-json-comments@3.1.1: | |
| resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} | |
| engines: {node: '>=8'} | |
| strtok3@10.2.2: | |
| resolution: {integrity: sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==} | |
| engines: {node: '>=18'} | |
| sucrase@3.35.0: | |
| resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} | |
| engines: {node: '>=16 || 14 >=14.17'} | |
| hasBin: true | |
| super-regex@1.0.0: | |
| resolution: {integrity: sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==} | |
| engines: {node: '>=18'} | |
| supports-color@5.5.0: | |
| resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} | |
| engines: {node: '>=4'} | |
| supports-color@7.2.0: | |
| resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} | |
| engines: {node: '>=8'} | |
| supports-hyperlinks@3.2.0: | |
| resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} | |
| engines: {node: '>=14.18'} | |
| temp-dir@3.0.0: | |
| resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} | |
| engines: {node: '>=14.16'} | |
| tempy@3.1.0: | |
| resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} | |
| engines: {node: '>=14.16'} | |
| thenify-all@1.6.0: | |
| resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} | |
| engines: {node: '>=0.8'} | |
| thenify@3.3.1: | |
| resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} | |
| through2@2.0.5: | |
| resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} | |
| time-span@5.1.0: | |
| resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} | |
| engines: {node: '>=12'} | |
| tinybench@2.9.0: | |
| resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} | |
| tinyexec@0.3.2: | |
| resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} | |
| tinyglobby@0.2.12: | |
| resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} | |
| engines: {node: '>=12.0.0'} | |
| tinyglobby@0.2.13: | |
| resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} | |
| engines: {node: '>=12.0.0'} | |
| tinypool@1.0.2: | |
| resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} | |
| engines: {node: ^18.0.0 || >=20.0.0} | |
| tinyrainbow@2.0.0: | |
| resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} | |
| engines: {node: '>=14.0.0'} | |
| tinyspy@3.0.2: | |
| resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} | |
| engines: {node: '>=14.0.0'} | |
| to-regex-range@5.0.1: | |
| resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} | |
| engines: {node: '>=8.0'} | |
| toidentifier@1.0.1: | |
| resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} | |
| engines: {node: '>=0.6'} | |
| token-types@6.0.0: | |
| resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} | |
| engines: {node: '>=14.16'} | |
| tr46@1.0.1: | |
| resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} | |
| traverse@0.6.8: | |
| resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} | |
| engines: {node: '>= 0.4'} | |
| tree-kill@1.2.2: | |
| resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} | |
| hasBin: true | |
| ts-api-utils@2.1.0: | |
| resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} | |
| engines: {node: '>=18.12'} | |
| peerDependencies: | |
| typescript: '>=4.8.4' | |
| ts-interface-checker@0.1.13: | |
| resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} | |
| tsup@8.4.0: | |
| resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} | |
| engines: {node: '>=18'} | |
| hasBin: true | |
| peerDependencies: | |
| '@microsoft/api-extractor': ^7.36.0 | |
| '@swc/core': ^1 | |
| postcss: ^8.4.12 | |
| typescript: '>=4.5.0' | |
| peerDependenciesMeta: | |
| '@microsoft/api-extractor': | |
| optional: true | |
| '@swc/core': | |
| optional: true | |
| postcss: | |
| optional: true | |
| typescript: | |
| optional: true | |
| type-check@0.4.0: | |
| resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} | |
| engines: {node: '>= 0.8.0'} | |
| type-fest@1.4.0: | |
| resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} | |
| engines: {node: '>=10'} | |
| type-fest@2.19.0: | |
| resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} | |
| engines: {node: '>=12.20'} | |
| type-fest@4.35.0: | |
| resolution: {integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==} | |
| engines: {node: '>=16'} | |
| type-is@2.0.1: | |
| resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} | |
| engines: {node: '>= 0.6'} | |
| typescript@5.8.3: | |
| resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} | |
| engines: {node: '>=14.17'} | |
| hasBin: true | |
| uglify-js@3.19.3: | |
| resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} | |
| engines: {node: '>=0.8.0'} | |
| hasBin: true | |
| uint8array-extras@1.4.0: | |
| resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} | |
| engines: {node: '>=18'} | |
| undici-types@6.21.0: | |
| resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} | |
| undici@7.8.0: | |
| resolution: {integrity: sha512-vFv1GA99b7eKO1HG/4RPu2Is3FBTWBrmzqzO0mz+rLxN3yXkE4mqRcb8g8fHxzX4blEysrNZLqg5RbJLqX5buA==} | |
| engines: {node: '>=20.18.1'} | |
| unicode-emoji-modifier-base@1.0.0: | |
| resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} | |
| engines: {node: '>=4'} | |
| unicorn-magic@0.1.0: | |
| resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} | |
| engines: {node: '>=18'} | |
| unicorn-magic@0.3.0: | |
| resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} | |
| engines: {node: '>=18'} | |
| unique-string@3.0.0: | |
| resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} | |
| engines: {node: '>=12'} | |
| universal-user-agent@7.0.2: | |
| resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} | |
| universalify@2.0.1: | |
| resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} | |
| engines: {node: '>= 10.0.0'} | |
| unpipe@1.0.0: | |
| resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} | |
| engines: {node: '>= 0.8'} | |
| uri-js@4.4.1: | |
| resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} | |
| uri-templates@0.2.0: | |
| resolution: {integrity: sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg==} | |
| url-join@5.0.0: | |
| resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} | |
| engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} | |
| util-deprecate@1.0.2: | |
| resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} | |
| valibot@1.0.0: | |
| resolution: {integrity: sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw==} | |
| peerDependencies: | |
| typescript: '>=5' | |
| peerDependenciesMeta: | |
| typescript: | |
| optional: true | |
| validate-npm-package-license@3.0.4: | |
| resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} | |
| vary@1.1.2: | |
| resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} | |
| engines: {node: '>= 0.8'} | |
| vite-node@3.1.2: | |
| resolution: {integrity: sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==} | |
| engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} | |
| hasBin: true | |
| vite@6.3.2: | |
| resolution: {integrity: sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==} | |
| engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} | |
| hasBin: true | |
| peerDependencies: | |
| '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 | |
| jiti: '>=1.21.0' | |
| less: '*' | |
| lightningcss: ^1.21.0 | |
| sass: '*' | |
| sass-embedded: '*' | |
| stylus: '*' | |
| sugarss: '*' | |
| terser: ^5.16.0 | |
| tsx: ^4.8.1 | |
| yaml: ^2.4.2 | |
| peerDependenciesMeta: | |
| '@types/node': | |
| optional: true | |
| jiti: | |
| optional: true | |
| less: | |
| optional: true | |
| lightningcss: | |
| optional: true | |
| sass: | |
| optional: true | |
| sass-embedded: | |
| optional: true | |
| stylus: | |
| optional: true | |
| sugarss: | |
| optional: true | |
| terser: | |
| optional: true | |
| tsx: | |
| optional: true | |
| yaml: | |
| optional: true | |
| vitest@3.1.2: | |
| resolution: {integrity: sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==} | |
| engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} | |
| hasBin: true | |
| peerDependencies: | |
| '@edge-runtime/vm': '*' | |
| '@types/debug': ^4.1.12 | |
| '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 | |
| '@vitest/browser': 3.1.2 | |
| '@vitest/ui': 3.1.2 | |
| happy-dom: '*' | |
| jsdom: '*' | |
| peerDependenciesMeta: | |
| '@edge-runtime/vm': | |
| optional: true | |
| '@types/debug': | |
| optional: true | |
| '@types/node': | |
| optional: true | |
| '@vitest/browser': | |
| optional: true | |
| '@vitest/ui': | |
| optional: true | |
| happy-dom: | |
| optional: true | |
| jsdom: | |
| optional: true | |
| webidl-conversions@4.0.2: | |
| resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} | |
| whatwg-url@7.1.0: | |
| resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} | |
| which@2.0.2: | |
| resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} | |
| engines: {node: '>= 8'} | |
| hasBin: true | |
| why-is-node-running@2.3.0: | |
| resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} | |
| engines: {node: '>=8'} | |
| hasBin: true | |
| word-wrap@1.2.5: | |
| resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} | |
| engines: {node: '>=0.10.0'} | |
| wordwrap@1.0.0: | |
| resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} | |
| wrap-ansi@7.0.0: | |
| resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} | |
| engines: {node: '>=10'} | |
| wrap-ansi@8.1.0: | |
| resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} | |
| engines: {node: '>=12'} | |
| wrappy@1.0.2: | |
| resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} | |
| xsschema@0.2.0-beta.3: | |
| resolution: {integrity: sha512-ViOZ1a1kAPHvFjDJp4ITeutdlbnEs56lx/NotlvcitwN04eHnU3DhR+P5GvXT7A+69qKrXAx0YrccvmfwGnUGw==} | |
| peerDependencies: | |
| '@valibot/to-json-schema': ^1.0.0 | |
| arktype: ^2.1.16 | |
| effect: ^3.14.5 | |
| zod-to-json-schema: ^3.24.5 | |
| peerDependenciesMeta: | |
| '@valibot/to-json-schema': | |
| optional: true | |
| arktype: | |
| optional: true | |
| effect: | |
| optional: true | |
| zod-to-json-schema: | |
| optional: true | |
| xtend@4.0.2: | |
| resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} | |
| engines: {node: '>=0.4'} | |
| y18n@5.0.8: | |
| resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} | |
| engines: {node: '>=10'} | |
| yargs-parser@20.2.9: | |
| resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} | |
| engines: {node: '>=10'} | |
| yargs-parser@21.1.1: | |
| resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} | |
| engines: {node: '>=12'} | |
| yargs@16.2.0: | |
| resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} | |
| engines: {node: '>=10'} | |
| yargs@17.7.2: | |
| resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} | |
| engines: {node: '>=12'} | |
| yocto-queue@0.1.0: | |
| resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} | |
| engines: {node: '>=10'} | |
| yoctocolors@2.1.1: | |
| resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} | |
| engines: {node: '>=18'} | |
| zod-to-json-schema@3.24.5: | |
| resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} | |
| peerDependencies: | |
| zod: ^3.24.1 | |
| zod@3.24.3: | |
| resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} | |
| snapshots: | |
| '@ark/schema@0.46.0': | |
| dependencies: | |
| '@ark/util': 0.46.0 | |
| '@ark/util@0.46.0': {} | |
| '@babel/code-frame@7.26.2': | |
| dependencies: | |
| '@babel/helper-validator-identifier': 7.25.9 | |
| js-tokens: 4.0.0 | |
| picocolors: 1.1.1 | |
| '@babel/helper-validator-identifier@7.25.9': {} | |
| '@colors/colors@1.5.0': | |
| optional: true | |
| '@esbuild/aix-ppc64@0.25.0': | |
| optional: true | |
| '@esbuild/aix-ppc64@0.25.2': | |
| optional: true | |
| '@esbuild/android-arm64@0.25.0': | |
| optional: true | |
| '@esbuild/android-arm64@0.25.2': | |
| optional: true | |
| '@esbuild/android-arm@0.25.0': | |
| optional: true | |
| '@esbuild/android-arm@0.25.2': | |
| optional: true | |
| '@esbuild/android-x64@0.25.0': | |
| optional: true | |
| '@esbuild/android-x64@0.25.2': | |
| optional: true | |
| '@esbuild/darwin-arm64@0.25.0': | |
| optional: true | |
| '@esbuild/darwin-arm64@0.25.2': | |
| optional: true | |
| '@esbuild/darwin-x64@0.25.0': | |
| optional: true | |
| '@esbuild/darwin-x64@0.25.2': | |
| optional: true | |
| '@esbuild/freebsd-arm64@0.25.0': | |
| optional: true | |
| '@esbuild/freebsd-arm64@0.25.2': | |
| optional: true | |
| '@esbuild/freebsd-x64@0.25.0': | |
| optional: true | |
| '@esbuild/freebsd-x64@0.25.2': | |
| optional: true | |
| '@esbuild/linux-arm64@0.25.0': | |
| optional: true | |
| '@esbuild/linux-arm64@0.25.2': | |
| optional: true | |
| '@esbuild/linux-arm@0.25.0': | |
| optional: true | |
| '@esbuild/linux-arm@0.25.2': | |
| optional: true | |
| '@esbuild/linux-ia32@0.25.0': | |
| optional: true | |
| '@esbuild/linux-ia32@0.25.2': | |
| optional: true | |
| '@esbuild/linux-loong64@0.25.0': | |
| optional: true | |
| '@esbuild/linux-loong64@0.25.2': | |
| optional: true | |
| '@esbuild/linux-mips64el@0.25.0': | |
| optional: true | |
| '@esbuild/linux-mips64el@0.25.2': | |
| optional: true | |
| '@esbuild/linux-ppc64@0.25.0': | |
| optional: true | |
| '@esbuild/linux-ppc64@0.25.2': | |
| optional: true | |
| '@esbuild/linux-riscv64@0.25.0': | |
| optional: true | |
| '@esbuild/linux-riscv64@0.25.2': | |
| optional: true | |
| '@esbuild/linux-s390x@0.25.0': | |
| optional: true | |
| '@esbuild/linux-s390x@0.25.2': | |
| optional: true | |
| '@esbuild/linux-x64@0.25.0': | |
| optional: true | |
| '@esbuild/linux-x64@0.25.2': | |
| optional: true | |
| '@esbuild/netbsd-arm64@0.25.0': | |
| optional: true | |
| '@esbuild/netbsd-arm64@0.25.2': | |
| optional: true | |
| '@esbuild/netbsd-x64@0.25.0': | |
| optional: true | |
| '@esbuild/netbsd-x64@0.25.2': | |
| optional: true | |
| '@esbuild/openbsd-arm64@0.25.0': | |
| optional: true | |
| '@esbuild/openbsd-arm64@0.25.2': | |
| optional: true | |
| '@esbuild/openbsd-x64@0.25.0': | |
| optional: true | |
| '@esbuild/openbsd-x64@0.25.2': | |
| optional: true | |
| '@esbuild/sunos-x64@0.25.0': | |
| optional: true | |
| '@esbuild/sunos-x64@0.25.2': | |
| optional: true | |
| '@esbuild/win32-arm64@0.25.0': | |
| optional: true | |
| '@esbuild/win32-arm64@0.25.2': | |
| optional: true | |
| '@esbuild/win32-ia32@0.25.0': | |
| optional: true | |
| '@esbuild/win32-ia32@0.25.2': | |
| optional: true | |
| '@esbuild/win32-x64@0.25.0': | |
| optional: true | |
| '@esbuild/win32-x64@0.25.2': | |
| optional: true | |
| '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1)': | |
| dependencies: | |
| eslint: 9.25.1 | |
| eslint-visitor-keys: 3.4.3 | |
| '@eslint-community/regexpp@4.12.1': {} | |
| '@eslint/config-array@0.20.0': | |
| dependencies: | |
| '@eslint/object-schema': 2.1.6 | |
| debug: 4.4.0 | |
| minimatch: 3.1.2 | |
| transitivePeerDependencies: | |
| - supports-color | |
| '@eslint/config-helpers@0.2.1': {} | |
| '@eslint/core@0.13.0': | |
| dependencies: | |
| '@types/json-schema': 7.0.15 | |
| '@eslint/eslintrc@3.3.1': | |
| dependencies: | |
| ajv: 6.12.6 | |
| debug: 4.4.0 | |
| espree: 10.3.0 | |
| globals: 14.0.0 | |
| ignore: 5.3.2 | |
| import-fresh: 3.3.1 | |
| js-yaml: 4.1.0 | |
| minimatch: 3.1.2 | |
| strip-json-comments: 3.1.1 | |
| transitivePeerDependencies: | |
| - supports-color | |
| '@eslint/js@9.25.1': {} | |
| '@eslint/object-schema@2.1.6': {} | |
| '@eslint/plugin-kit@0.2.8': | |
| dependencies: | |
| '@eslint/core': 0.13.0 | |
| levn: 0.4.1 | |
| '@humanfs/core@0.19.1': {} | |
| '@humanfs/node@0.16.6': | |
| dependencies: | |
| '@humanfs/core': 0.19.1 | |
| '@humanwhocodes/retry': 0.3.1 | |
| '@humanwhocodes/module-importer@1.0.1': {} | |
| '@humanwhocodes/retry@0.3.1': {} | |
| '@humanwhocodes/retry@0.4.2': {} | |
| '@isaacs/cliui@8.0.2': | |
| dependencies: | |
| string-width: 5.1.2 | |
| string-width-cjs: string-width@4.2.3 | |
| strip-ansi: 7.1.0 | |
| strip-ansi-cjs: strip-ansi@6.0.1 | |
| wrap-ansi: 8.1.0 | |
| wrap-ansi-cjs: wrap-ansi@7.0.0 | |
| '@jridgewell/gen-mapping@0.3.8': | |
| dependencies: | |
| '@jridgewell/set-array': 1.2.1 | |
| '@jridgewell/sourcemap-codec': 1.5.0 | |
| '@jridgewell/trace-mapping': 0.3.25 | |
| '@jridgewell/resolve-uri@3.1.2': {} | |
| '@jridgewell/set-array@1.2.1': {} | |
| '@jridgewell/sourcemap-codec@1.5.0': {} | |
| '@jridgewell/trace-mapping@0.3.25': | |
| dependencies: | |
| '@jridgewell/resolve-uri': 3.1.2 | |
| '@jridgewell/sourcemap-codec': 1.5.0 | |
| '@modelcontextprotocol/sdk@1.10.2': | |
| dependencies: | |
| content-type: 1.0.5 | |
| cors: 2.8.5 | |
| cross-spawn: 7.0.6 | |
| eventsource: 3.0.6 | |
| express: 5.1.0 | |
| express-rate-limit: 7.5.0(express@5.1.0) | |
| pkce-challenge: 5.0.0 | |
| raw-body: 3.0.0 | |
| zod: 3.24.3 | |
| zod-to-json-schema: 3.24.5(zod@3.24.3) | |
| transitivePeerDependencies: | |
| - supports-color | |
| '@nodelib/fs.scandir@2.1.5': | |
| dependencies: | |
| '@nodelib/fs.stat': 2.0.5 | |
| run-parallel: 1.2.0 | |
| '@nodelib/fs.stat@2.0.5': {} | |
| '@nodelib/fs.walk@1.2.8': | |
| dependencies: | |
| '@nodelib/fs.scandir': 2.1.5 | |
| fastq: 1.19.0 | |
| '@octokit/auth-token@5.1.2': {} | |
| '@octokit/core@6.1.4': | |
| dependencies: | |
| '@octokit/auth-token': 5.1.2 | |
| '@octokit/graphql': 8.2.1 | |
| '@octokit/request': 9.2.2 | |
| '@octokit/request-error': 6.1.7 | |
| '@octokit/types': 13.8.0 | |
| before-after-hook: 3.0.2 | |
| universal-user-agent: 7.0.2 | |
| '@octokit/endpoint@10.1.3': | |
| dependencies: | |
| '@octokit/types': 13.8.0 | |
| universal-user-agent: 7.0.2 | |
| '@octokit/graphql@8.2.1': | |
| dependencies: | |
| '@octokit/request': 9.2.2 | |
| '@octokit/types': 13.8.0 | |
| universal-user-agent: 7.0.2 | |
| '@octokit/openapi-types@23.0.1': {} | |
| '@octokit/plugin-paginate-rest@11.4.3(@octokit/core@6.1.4)': | |
| dependencies: | |
| '@octokit/core': 6.1.4 | |
| '@octokit/types': 13.8.0 | |
| '@octokit/plugin-retry@7.1.4(@octokit/core@6.1.4)': | |
| dependencies: | |
| '@octokit/core': 6.1.4 | |
| '@octokit/request-error': 6.1.7 | |
| '@octokit/types': 13.8.0 | |
| bottleneck: 2.19.5 | |
| '@octokit/plugin-throttling@9.4.0(@octokit/core@6.1.4)': | |
| dependencies: | |
| '@octokit/core': 6.1.4 | |
| '@octokit/types': 13.8.0 | |
| bottleneck: 2.19.5 | |
| '@octokit/request-error@6.1.7': | |
| dependencies: | |
| '@octokit/types': 13.8.0 | |
| '@octokit/request@9.2.2': | |
| dependencies: | |
| '@octokit/endpoint': 10.1.3 | |
| '@octokit/request-error': 6.1.7 | |
| '@octokit/types': 13.8.0 | |
| fast-content-type-parse: 2.0.1 | |
| universal-user-agent: 7.0.2 | |
| '@octokit/types@13.8.0': | |
| dependencies: | |
| '@octokit/openapi-types': 23.0.1 | |
| '@pkgjs/parseargs@0.11.0': | |
| optional: true | |
| '@pnpm/config.env-replace@1.1.0': {} | |
| '@pnpm/network.ca-file@1.0.2': | |
| dependencies: | |
| graceful-fs: 4.2.10 | |
| '@pnpm/npm-conf@2.3.1': | |
| dependencies: | |
| '@pnpm/config.env-replace': 1.1.0 | |
| '@pnpm/network.ca-file': 1.0.2 | |
| config-chain: 1.1.13 | |
| '@rollup/rollup-android-arm-eabi@4.34.8': | |
| optional: true | |
| '@rollup/rollup-android-arm-eabi@4.40.0': | |
| optional: true | |
| '@rollup/rollup-android-arm64@4.34.8': | |
| optional: true | |
| '@rollup/rollup-android-arm64@4.40.0': | |
| optional: true | |
| '@rollup/rollup-darwin-arm64@4.34.8': | |
| optional: true | |
| '@rollup/rollup-darwin-arm64@4.40.0': | |
| optional: true | |
| '@rollup/rollup-darwin-x64@4.34.8': | |
| optional: true | |
| '@rollup/rollup-darwin-x64@4.40.0': | |
| optional: true | |
| '@rollup/rollup-freebsd-arm64@4.34.8': | |
| optional: true | |
| '@rollup/rollup-freebsd-arm64@4.40.0': | |
| optional: true | |
| '@rollup/rollup-freebsd-x64@4.34.8': | |
| optional: true | |
| '@rollup/rollup-freebsd-x64@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-arm-gnueabihf@4.34.8': | |
| optional: true | |
| '@rollup/rollup-linux-arm-gnueabihf@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-arm-musleabihf@4.34.8': | |
| optional: true | |
| '@rollup/rollup-linux-arm-musleabihf@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-arm64-gnu@4.34.8': | |
| optional: true | |
| '@rollup/rollup-linux-arm64-gnu@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-arm64-musl@4.34.8': | |
| optional: true | |
| '@rollup/rollup-linux-arm64-musl@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-loongarch64-gnu@4.34.8': | |
| optional: true | |
| '@rollup/rollup-linux-loongarch64-gnu@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': | |
| optional: true | |
| '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-riscv64-gnu@4.34.8': | |
| optional: true | |
| '@rollup/rollup-linux-riscv64-gnu@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-riscv64-musl@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-s390x-gnu@4.34.8': | |
| optional: true | |
| '@rollup/rollup-linux-s390x-gnu@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-x64-gnu@4.34.8': | |
| optional: true | |
| '@rollup/rollup-linux-x64-gnu@4.40.0': | |
| optional: true | |
| '@rollup/rollup-linux-x64-musl@4.34.8': | |
| optional: true | |
| '@rollup/rollup-linux-x64-musl@4.40.0': | |
| optional: true | |
| '@rollup/rollup-win32-arm64-msvc@4.34.8': | |
| optional: true | |
| '@rollup/rollup-win32-arm64-msvc@4.40.0': | |
| optional: true | |
| '@rollup/rollup-win32-ia32-msvc@4.34.8': | |
| optional: true | |
| '@rollup/rollup-win32-ia32-msvc@4.40.0': | |
| optional: true | |
| '@rollup/rollup-win32-x64-msvc@4.34.8': | |
| optional: true | |
| '@rollup/rollup-win32-x64-msvc@4.40.0': | |
| optional: true | |
| '@sebbo2002/semantic-release-jsr@2.0.5': | |
| dependencies: | |
| jsr: 0.13.4 | |
| '@sec-ant/readable-stream@0.4.1': {} | |
| '@semantic-release/commit-analyzer@13.0.1(semantic-release@24.2.3(typescript@5.8.3))': | |
| dependencies: | |
| conventional-changelog-angular: 8.0.0 | |
| conventional-changelog-writer: 8.0.1 | |
| conventional-commits-filter: 5.0.0 | |
| conventional-commits-parser: 6.1.0 | |
| debug: 4.4.0 | |
| import-from-esm: 2.0.0 | |
| lodash-es: 4.17.21 | |
| micromatch: 4.0.8 | |
| semantic-release: 24.2.3(typescript@5.8.3) | |
| transitivePeerDependencies: | |
| - supports-color | |
| '@semantic-release/error@4.0.0': {} | |
| '@semantic-release/github@11.0.1(semantic-release@24.2.3(typescript@5.8.3))': | |
| dependencies: | |
| '@octokit/core': 6.1.4 | |
| '@octokit/plugin-paginate-rest': 11.4.3(@octokit/core@6.1.4) | |
| '@octokit/plugin-retry': 7.1.4(@octokit/core@6.1.4) | |
| '@octokit/plugin-throttling': 9.4.0(@octokit/core@6.1.4) | |
| '@semantic-release/error': 4.0.0 | |
| aggregate-error: 5.0.0 | |
| debug: 4.4.0 | |
| dir-glob: 3.0.1 | |
| globby: 14.1.0 | |
| http-proxy-agent: 7.0.2 | |
| https-proxy-agent: 7.0.6 | |
| issue-parser: 7.0.1 | |
| lodash-es: 4.17.21 | |
| mime: 4.0.6 | |
| p-filter: 4.1.0 | |
| semantic-release: 24.2.3(typescript@5.8.3) | |
| url-join: 5.0.0 | |
| transitivePeerDependencies: | |
| - supports-color | |
| '@semantic-release/npm@12.0.1(semantic-release@24.2.3(typescript@5.8.3))': | |
| dependencies: | |
| '@semantic-release/error': 4.0.0 | |
| aggregate-error: 5.0.0 | |
| execa: 9.5.2 | |
| fs-extra: 11.3.0 | |
| lodash-es: 4.17.21 | |
| nerf-dart: 1.0.0 | |
| normalize-url: 8.0.1 | |
| npm: 10.9.2 | |
| rc: 1.2.8 | |
| read-pkg: 9.0.1 | |
| registry-auth-token: 5.1.0 | |
| semantic-release: 24.2.3(typescript@5.8.3) | |
| semver: 7.7.1 | |
| tempy: 3.1.0 | |
| '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.2.3(typescript@5.8.3))': | |
| dependencies: | |
| conventional-changelog-angular: 8.0.0 | |
| conventional-changelog-writer: 8.0.1 | |
| conventional-commits-filter: 5.0.0 | |
| conventional-commits-parser: 6.1.0 | |
| debug: 4.4.0 | |
| get-stream: 7.0.1 | |
| import-from-esm: 2.0.0 | |
| into-stream: 7.0.0 | |
| lodash-es: 4.17.21 | |
| read-package-up: 11.0.0 | |
| semantic-release: 24.2.3(typescript@5.8.3) | |
| transitivePeerDependencies: | |
| - supports-color | |
| '@sindresorhus/is@4.6.0': {} | |
| '@sindresorhus/merge-streams@2.3.0': {} | |
| '@sindresorhus/merge-streams@4.0.0': {} | |
| '@standard-schema/spec@1.0.0': {} | |
| '@tokenizer/inflate@0.2.7': | |
| dependencies: | |
| debug: 4.4.0 | |
| fflate: 0.8.2 | |
| token-types: 6.0.0 | |
| transitivePeerDependencies: | |
| - supports-color | |
| '@tokenizer/token@0.3.0': {} | |
| '@tsconfig/node22@22.0.1': {} | |
| '@types/estree@1.0.6': {} | |
| '@types/estree@1.0.7': {} | |
| '@types/json-schema@7.0.15': {} | |
| '@types/node@22.14.1': | |
| dependencies: | |
| undici-types: 6.21.0 | |
| '@types/normalize-package-data@2.4.4': {} | |
| '@types/uri-templates@0.1.34': {} | |
| '@types/yargs-parser@21.0.3': {} | |
| '@types/yargs@17.0.33': | |
| dependencies: | |
| '@types/yargs-parser': 21.0.3 | |
| '@typescript-eslint/scope-manager@8.31.0': | |
| dependencies: | |
| '@typescript-eslint/types': 8.31.0 | |
| '@typescript-eslint/visitor-keys': 8.31.0 | |
| '@typescript-eslint/types@8.31.0': {} | |
| '@typescript-eslint/typescript-estree@8.31.0(typescript@5.8.3)': | |
| dependencies: | |
| '@typescript-eslint/types': 8.31.0 | |
| '@typescript-eslint/visitor-keys': 8.31.0 | |
| debug: 4.4.0 | |
| fast-glob: 3.3.3 | |
| is-glob: 4.0.3 | |
| minimatch: 9.0.5 | |
| semver: 7.7.1 | |
| ts-api-utils: 2.1.0(typescript@5.8.3) | |
| typescript: 5.8.3 | |
| transitivePeerDependencies: | |
| - supports-color | |
| '@typescript-eslint/utils@8.31.0(eslint@9.25.1)(typescript@5.8.3)': | |
| dependencies: | |
| '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1) | |
| '@typescript-eslint/scope-manager': 8.31.0 | |
| '@typescript-eslint/types': 8.31.0 | |
| '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3) | |
| eslint: 9.25.1 | |
| typescript: 5.8.3 | |
| transitivePeerDependencies: | |
| - supports-color | |
| '@typescript-eslint/visitor-keys@8.31.0': | |
| dependencies: | |
| '@typescript-eslint/types': 8.31.0 | |
| eslint-visitor-keys: 4.2.0 | |
| '@valibot/to-json-schema@1.0.0(valibot@1.0.0(typescript@5.8.3))': | |
| dependencies: | |
| valibot: 1.0.0(typescript@5.8.3) | |
| '@vitest/expect@3.1.2': | |
| dependencies: | |
| '@vitest/spy': 3.1.2 | |
| '@vitest/utils': 3.1.2 | |
| chai: 5.2.0 | |
| tinyrainbow: 2.0.0 | |
| '@vitest/mocker@3.1.2(vite@6.3.2(@types/node@22.14.1))': | |
| dependencies: | |
| '@vitest/spy': 3.1.2 | |
| estree-walker: 3.0.3 | |
| magic-string: 0.30.17 | |
| optionalDependencies: | |
| vite: 6.3.2(@types/node@22.14.1) | |
| '@vitest/pretty-format@3.1.2': | |
| dependencies: | |
| tinyrainbow: 2.0.0 | |
| '@vitest/runner@3.1.2': | |
| dependencies: | |
| '@vitest/utils': 3.1.2 | |
| pathe: 2.0.3 | |
| '@vitest/snapshot@3.1.2': | |
| dependencies: | |
| '@vitest/pretty-format': 3.1.2 | |
| magic-string: 0.30.17 | |
| pathe: 2.0.3 | |
| '@vitest/spy@3.1.2': | |
| dependencies: | |
| tinyspy: 3.0.2 | |
| '@vitest/utils@3.1.2': | |
| dependencies: | |
| '@vitest/pretty-format': 3.1.2 | |
| loupe: 3.1.3 | |
| tinyrainbow: 2.0.0 | |
| accepts@2.0.0: | |
| dependencies: | |
| mime-types: 3.0.1 | |
| negotiator: 1.0.0 | |
| acorn-jsx@5.3.2(acorn@8.14.1): | |
| dependencies: | |
| acorn: 8.14.1 | |
| acorn@8.14.1: {} | |
| agent-base@7.1.3: {} | |
| aggregate-error@5.0.0: | |
| dependencies: | |
| clean-stack: 5.2.0 | |
| indent-string: 5.0.0 | |
| ajv@6.12.6: | |
| dependencies: | |
| fast-deep-equal: 3.1.3 | |
| fast-json-stable-stringify: 2.1.0 | |
| json-schema-traverse: 0.4.1 | |
| uri-js: 4.4.1 | |
| ansi-escapes@7.0.0: | |
| dependencies: | |
| environment: 1.1.0 | |
| ansi-regex@5.0.1: {} | |
| ansi-regex@6.1.0: {} | |
| ansi-styles@3.2.1: | |
| dependencies: | |
| color-convert: 1.9.3 | |
| ansi-styles@4.3.0: | |
| dependencies: | |
| color-convert: 2.0.1 | |
| ansi-styles@6.2.1: {} | |
| any-promise@1.3.0: {} | |
| argparse@2.0.1: {} | |
| argv-formatter@1.0.0: {} | |
| arktype@2.1.20: | |
| dependencies: | |
| '@ark/schema': 0.46.0 | |
| '@ark/util': 0.46.0 | |
| array-ify@1.0.0: {} | |
| assertion-error@2.0.1: {} | |
| balanced-match@1.0.2: {} | |
| before-after-hook@3.0.2: {} | |
| body-parser@2.2.0: | |
| dependencies: | |
| bytes: 3.1.2 | |
| content-type: 1.0.5 | |
| debug: 4.4.0 | |
| http-errors: 2.0.0 | |
| iconv-lite: 0.6.3 | |
| on-finished: 2.4.1 | |
| qs: 6.14.0 | |
| raw-body: 3.0.0 | |
| type-is: 2.0.1 | |
| transitivePeerDependencies: | |
| - supports-color | |
| bottleneck@2.19.5: {} | |
| brace-expansion@1.1.11: | |
| dependencies: | |
| balanced-match: 1.0.2 | |
| concat-map: 0.0.1 | |
| brace-expansion@2.0.1: | |
| dependencies: | |
| balanced-match: 1.0.2 | |
| braces@3.0.3: | |
| dependencies: | |
| fill-range: 7.1.1 | |
| bundle-require@5.1.0(esbuild@0.25.0): | |
| dependencies: | |
| esbuild: 0.25.0 | |
| load-tsconfig: 0.2.5 | |
| bytes@3.1.2: {} | |
| cac@6.7.14: {} | |
| call-bind-apply-helpers@1.0.2: | |
| dependencies: | |
| es-errors: 1.3.0 | |
| function-bind: 1.1.2 | |
| call-bound@1.0.4: | |
| dependencies: | |
| call-bind-apply-helpers: 1.0.2 | |
| get-intrinsic: 1.3.0 | |
| callsites@3.1.0: {} | |
| chai@5.2.0: | |
| dependencies: | |
| assertion-error: 2.0.1 | |
| check-error: 2.1.1 | |
| deep-eql: 5.0.2 | |
| loupe: 3.1.3 | |
| pathval: 2.0.0 | |
| chalk@2.4.2: | |
| dependencies: | |
| ansi-styles: 3.2.1 | |
| escape-string-regexp: 1.0.5 | |
| supports-color: 5.5.0 | |
| chalk@4.1.2: | |
| dependencies: | |
| ansi-styles: 4.3.0 | |
| supports-color: 7.2.0 | |
| chalk@5.4.1: {} | |
| char-regex@1.0.2: {} | |
| check-error@2.1.1: {} | |
| chokidar@4.0.3: | |
| dependencies: | |
| readdirp: 4.1.2 | |
| clean-stack@5.2.0: | |
| dependencies: | |
| escape-string-regexp: 5.0.0 | |
| cli-highlight@2.1.11: | |
| dependencies: | |
| chalk: 4.1.2 | |
| highlight.js: 10.7.3 | |
| mz: 2.7.0 | |
| parse5: 5.1.1 | |
| parse5-htmlparser2-tree-adapter: 6.0.1 | |
| yargs: 16.2.0 | |
| cli-table3@0.6.5: | |
| dependencies: | |
| string-width: 4.2.3 | |
| optionalDependencies: | |
| '@colors/colors': 1.5.0 | |
| cliui@7.0.4: | |
| dependencies: | |
| string-width: 4.2.3 | |
| strip-ansi: 6.0.1 | |
| wrap-ansi: 7.0.0 | |
| cliui@8.0.1: | |
| dependencies: | |
| string-width: 4.2.3 | |
| strip-ansi: 6.0.1 | |
| wrap-ansi: 7.0.0 | |
| color-convert@1.9.3: | |
| dependencies: | |
| color-name: 1.1.3 | |
| color-convert@2.0.1: | |
| dependencies: | |
| color-name: 1.1.4 | |
| color-name@1.1.3: {} | |
| color-name@1.1.4: {} | |
| commander@4.1.1: {} | |
| compare-func@2.0.0: | |
| dependencies: | |
| array-ify: 1.0.0 | |
| dot-prop: 5.3.0 | |
| concat-map@0.0.1: {} | |
| config-chain@1.1.13: | |
| dependencies: | |
| ini: 1.3.8 | |
| proto-list: 1.2.4 | |
| consola@3.4.0: {} | |
| content-disposition@1.0.0: | |
| dependencies: | |
| safe-buffer: 5.2.1 | |
| content-type@1.0.5: {} | |
| conventional-changelog-angular@8.0.0: | |
| dependencies: | |
| compare-func: 2.0.0 | |
| conventional-changelog-writer@8.0.1: | |
| dependencies: | |
| conventional-commits-filter: 5.0.0 | |
| handlebars: 4.7.8 | |
| meow: 13.2.0 | |
| semver: 7.7.1 | |
| conventional-commits-filter@5.0.0: {} | |
| conventional-commits-parser@6.1.0: | |
| dependencies: | |
| meow: 13.2.0 | |
| convert-hrtime@5.0.0: {} | |
| cookie-signature@1.2.2: {} | |
| cookie@0.7.2: {} | |
| core-util-is@1.0.3: {} | |
| cors@2.8.5: | |
| dependencies: | |
| object-assign: 4.1.1 | |
| vary: 1.1.2 | |
| cosmiconfig@9.0.0(typescript@5.8.3): | |
| dependencies: | |
| env-paths: 2.2.1 | |
| import-fresh: 3.3.1 | |
| js-yaml: 4.1.0 | |
| parse-json: 5.2.0 | |
| optionalDependencies: | |
| typescript: 5.8.3 | |
| cross-spawn@7.0.6: | |
| dependencies: | |
| path-key: 3.1.1 | |
| shebang-command: 2.0.0 | |
| which: 2.0.2 | |
| crypto-random-string@4.0.0: | |
| dependencies: | |
| type-fest: 1.4.0 | |
| debug@4.4.0: | |
| dependencies: | |
| ms: 2.1.3 | |
| deep-eql@5.0.2: {} | |
| deep-extend@0.6.0: {} | |
| deep-is@0.1.4: {} | |
| depd@2.0.0: {} | |
| dir-glob@3.0.1: | |
| dependencies: | |
| path-type: 4.0.0 | |
| dot-prop@5.3.0: | |
| dependencies: | |
| is-obj: 2.0.0 | |
| dunder-proto@1.0.1: | |
| dependencies: | |
| call-bind-apply-helpers: 1.0.2 | |
| es-errors: 1.3.0 | |
| gopd: 1.2.0 | |
| duplexer2@0.1.4: | |
| dependencies: | |
| readable-stream: 2.3.8 | |
| eastasianwidth@0.2.0: {} | |
| ee-first@1.1.1: {} | |
| emoji-regex@8.0.0: {} | |
| emoji-regex@9.2.2: {} | |
| emojilib@2.4.0: {} | |
| encodeurl@2.0.0: {} | |
| env-ci@11.1.0: | |
| dependencies: | |
| execa: 8.0.1 | |
| java-properties: 1.0.2 | |
| env-paths@2.2.1: {} | |
| environment@1.1.0: {} | |
| error-ex@1.3.2: | |
| dependencies: | |
| is-arrayish: 0.2.1 | |
| es-define-property@1.0.1: {} | |
| es-errors@1.3.0: {} | |
| es-module-lexer@1.6.0: {} | |
| es-object-atoms@1.1.1: | |
| dependencies: | |
| es-errors: 1.3.0 | |
| esbuild@0.25.0: | |
| optionalDependencies: | |
| '@esbuild/aix-ppc64': 0.25.0 | |
| '@esbuild/android-arm': 0.25.0 | |
| '@esbuild/android-arm64': 0.25.0 | |
| '@esbuild/android-x64': 0.25.0 | |
| '@esbuild/darwin-arm64': 0.25.0 | |
| '@esbuild/darwin-x64': 0.25.0 | |
| '@esbuild/freebsd-arm64': 0.25.0 | |
| '@esbuild/freebsd-x64': 0.25.0 | |
| '@esbuild/linux-arm': 0.25.0 | |
| '@esbuild/linux-arm64': 0.25.0 | |
| '@esbuild/linux-ia32': 0.25.0 | |
| '@esbuild/linux-loong64': 0.25.0 | |
| '@esbuild/linux-mips64el': 0.25.0 | |
| '@esbuild/linux-ppc64': 0.25.0 | |
| '@esbuild/linux-riscv64': 0.25.0 | |
| '@esbuild/linux-s390x': 0.25.0 | |
| '@esbuild/linux-x64': 0.25.0 | |
| '@esbuild/netbsd-arm64': 0.25.0 | |
| '@esbuild/netbsd-x64': 0.25.0 | |
| '@esbuild/openbsd-arm64': 0.25.0 | |
| '@esbuild/openbsd-x64': 0.25.0 | |
| '@esbuild/sunos-x64': 0.25.0 | |
| '@esbuild/win32-arm64': 0.25.0 | |
| '@esbuild/win32-ia32': 0.25.0 | |
| '@esbuild/win32-x64': 0.25.0 | |
| esbuild@0.25.2: | |
| optionalDependencies: | |
| '@esbuild/aix-ppc64': 0.25.2 | |
| '@esbuild/android-arm': 0.25.2 | |
| '@esbuild/android-arm64': 0.25.2 | |
| '@esbuild/android-x64': 0.25.2 | |
| '@esbuild/darwin-arm64': 0.25.2 | |
| '@esbuild/darwin-x64': 0.25.2 | |
| '@esbuild/freebsd-arm64': 0.25.2 | |
| '@esbuild/freebsd-x64': 0.25.2 | |
| '@esbuild/linux-arm': 0.25.2 | |
| '@esbuild/linux-arm64': 0.25.2 | |
| '@esbuild/linux-ia32': 0.25.2 | |
| '@esbuild/linux-loong64': 0.25.2 | |
| '@esbuild/linux-mips64el': 0.25.2 | |
| '@esbuild/linux-ppc64': 0.25.2 | |
| '@esbuild/linux-riscv64': 0.25.2 | |
| '@esbuild/linux-s390x': 0.25.2 | |
| '@esbuild/linux-x64': 0.25.2 | |
| '@esbuild/netbsd-arm64': 0.25.2 | |
| '@esbuild/netbsd-x64': 0.25.2 | |
| '@esbuild/openbsd-arm64': 0.25.2 | |
| '@esbuild/openbsd-x64': 0.25.2 | |
| '@esbuild/sunos-x64': 0.25.2 | |
| '@esbuild/win32-arm64': 0.25.2 | |
| '@esbuild/win32-ia32': 0.25.2 | |
| '@esbuild/win32-x64': 0.25.2 | |
| escalade@3.2.0: {} | |
| escape-html@1.0.3: {} | |
| escape-string-regexp@1.0.5: {} | |
| escape-string-regexp@4.0.0: {} | |
| escape-string-regexp@5.0.0: {} | |
| eslint-plugin-perfectionist@4.12.0(eslint@9.25.1)(typescript@5.8.3): | |
| dependencies: | |
| '@typescript-eslint/types': 8.31.0 | |
| '@typescript-eslint/utils': 8.31.0(eslint@9.25.1)(typescript@5.8.3) | |
| eslint: 9.25.1 | |
| natural-orderby: 5.0.0 | |
| transitivePeerDependencies: | |
| - supports-color | |
| - typescript | |
| eslint-scope@8.3.0: | |
| dependencies: | |
| esrecurse: 4.3.0 | |
| estraverse: 5.3.0 | |
| eslint-visitor-keys@3.4.3: {} | |
| eslint-visitor-keys@4.2.0: {} | |
| eslint@9.25.1: | |
| dependencies: | |
| '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1) | |
| '@eslint-community/regexpp': 4.12.1 | |
| '@eslint/config-array': 0.20.0 | |
| '@eslint/config-helpers': 0.2.1 | |
| '@eslint/core': 0.13.0 | |
| '@eslint/eslintrc': 3.3.1 | |
| '@eslint/js': 9.25.1 | |
| '@eslint/plugin-kit': 0.2.8 | |
| '@humanfs/node': 0.16.6 | |
| '@humanwhocodes/module-importer': 1.0.1 | |
| '@humanwhocodes/retry': 0.4.2 | |
| '@types/estree': 1.0.7 | |
| '@types/json-schema': 7.0.15 | |
| ajv: 6.12.6 | |
| chalk: 4.1.2 | |
| cross-spawn: 7.0.6 | |
| debug: 4.4.0 | |
| escape-string-regexp: 4.0.0 | |
| eslint-scope: 8.3.0 | |
| eslint-visitor-keys: 4.2.0 | |
| espree: 10.3.0 | |
| esquery: 1.6.0 | |
| esutils: 2.0.3 | |
| fast-deep-equal: 3.1.3 | |
| file-entry-cache: 8.0.0 | |
| find-up: 5.0.0 | |
| glob-parent: 6.0.2 | |
| ignore: 5.3.2 | |
| imurmurhash: 0.1.4 | |
| is-glob: 4.0.3 | |
| json-stable-stringify-without-jsonify: 1.0.1 | |
| lodash.merge: 4.6.2 | |
| minimatch: 3.1.2 | |
| natural-compare: 1.4.0 | |
| optionator: 0.9.4 | |
| transitivePeerDependencies: | |
| - supports-color | |
| espree@10.3.0: | |
| dependencies: | |
| acorn: 8.14.1 | |
| acorn-jsx: 5.3.2(acorn@8.14.1) | |
| eslint-visitor-keys: 4.2.0 | |
| esquery@1.6.0: | |
| dependencies: | |
| estraverse: 5.3.0 | |
| esrecurse@4.3.0: | |
| dependencies: | |
| estraverse: 5.3.0 | |
| estraverse@5.3.0: {} | |
| estree-walker@3.0.3: | |
| dependencies: | |
| '@types/estree': 1.0.7 | |
| esutils@2.0.3: {} | |
| etag@1.8.1: {} | |
| eventsource-client@1.1.3: | |
| dependencies: | |
| eventsource-parser: 3.0.0 | |
| eventsource-parser@3.0.0: {} | |
| eventsource-parser@3.0.1: {} | |
| eventsource@3.0.6: | |
| dependencies: | |
| eventsource-parser: 3.0.1 | |
| execa@8.0.1: | |
| dependencies: | |
| cross-spawn: 7.0.6 | |
| get-stream: 8.0.1 | |
| human-signals: 5.0.0 | |
| is-stream: 3.0.0 | |
| merge-stream: 2.0.0 | |
| npm-run-path: 5.3.0 | |
| onetime: 6.0.0 | |
| signal-exit: 4.1.0 | |
| strip-final-newline: 3.0.0 | |
| execa@9.5.2: | |
| dependencies: | |
| '@sindresorhus/merge-streams': 4.0.0 | |
| cross-spawn: 7.0.6 | |
| figures: 6.1.0 | |
| get-stream: 9.0.1 | |
| human-signals: 8.0.0 | |
| is-plain-obj: 4.1.0 | |
| is-stream: 4.0.1 | |
| npm-run-path: 6.0.0 | |
| pretty-ms: 9.2.0 | |
| signal-exit: 4.1.0 | |
| strip-final-newline: 4.0.0 | |
| yoctocolors: 2.1.1 | |
| expect-type@1.2.1: {} | |
| express-rate-limit@7.5.0(express@5.1.0): | |
| dependencies: | |
| express: 5.1.0 | |
| express@5.1.0: | |
| dependencies: | |
| accepts: 2.0.0 | |
| body-parser: 2.2.0 | |
| content-disposition: 1.0.0 | |
| content-type: 1.0.5 | |
| cookie: 0.7.2 | |
| cookie-signature: 1.2.2 | |
| debug: 4.4.0 | |
| encodeurl: 2.0.0 | |
| escape-html: 1.0.3 | |
| etag: 1.8.1 | |
| finalhandler: 2.1.0 | |
| fresh: 2.0.0 | |
| http-errors: 2.0.0 | |
| merge-descriptors: 2.0.0 | |
| mime-types: 3.0.1 | |
| on-finished: 2.4.1 | |
| once: 1.4.0 | |
| parseurl: 1.3.3 | |
| proxy-addr: 2.0.7 | |
| qs: 6.14.0 | |
| range-parser: 1.2.1 | |
| router: 2.2.0 | |
| send: 1.2.0 | |
| serve-static: 2.2.0 | |
| statuses: 2.0.1 | |
| type-is: 2.0.1 | |
| vary: 1.1.2 | |
| transitivePeerDependencies: | |
| - supports-color | |
| fast-content-type-parse@2.0.1: {} | |
| fast-deep-equal@3.1.3: {} | |
| fast-glob@3.3.3: | |
| dependencies: | |
| '@nodelib/fs.stat': 2.0.5 | |
| '@nodelib/fs.walk': 1.2.8 | |
| glob-parent: 5.1.2 | |
| merge2: 1.4.1 | |
| micromatch: 4.0.8 | |
| fast-json-stable-stringify@2.1.0: {} | |
| fast-levenshtein@2.0.6: {} | |
| fastq@1.19.0: | |
| dependencies: | |
| reusify: 1.0.4 | |
| fdir@6.4.3(picomatch@4.0.2): | |
| optionalDependencies: | |
| picomatch: 4.0.2 | |
| fdir@6.4.4(picomatch@4.0.2): | |
| optionalDependencies: | |
| picomatch: 4.0.2 | |
| fflate@0.8.2: {} | |
| figures@2.0.0: | |
| dependencies: | |
| escape-string-regexp: 1.0.5 | |
| figures@6.1.0: | |
| dependencies: | |
| is-unicode-supported: 2.1.0 | |
| file-entry-cache@8.0.0: | |
| dependencies: | |
| flat-cache: 4.0.1 | |
| file-type@20.4.1: | |
| dependencies: | |
| '@tokenizer/inflate': 0.2.7 | |
| strtok3: 10.2.2 | |
| token-types: 6.0.0 | |
| uint8array-extras: 1.4.0 | |
| transitivePeerDependencies: | |
| - supports-color | |
| fill-range@7.1.1: | |
| dependencies: | |
| to-regex-range: 5.0.1 | |
| finalhandler@2.1.0: | |
| dependencies: | |
| debug: 4.4.0 | |
| encodeurl: 2.0.0 | |
| escape-html: 1.0.3 | |
| on-finished: 2.4.1 | |
| parseurl: 1.3.3 | |
| statuses: 2.0.1 | |
| transitivePeerDependencies: | |
| - supports-color | |
| find-up-simple@1.0.0: {} | |
| find-up@2.1.0: | |
| dependencies: | |
| locate-path: 2.0.0 | |
| find-up@5.0.0: | |
| dependencies: | |
| locate-path: 6.0.0 | |
| path-exists: 4.0.0 | |
| find-versions@6.0.0: | |
| dependencies: | |
| semver-regex: 4.0.5 | |
| super-regex: 1.0.0 | |
| flat-cache@4.0.1: | |
| dependencies: | |
| flatted: 3.3.3 | |
| keyv: 4.5.4 | |
| flatted@3.3.3: {} | |
| foreground-child@3.3.1: | |
| dependencies: | |
| cross-spawn: 7.0.6 | |
| signal-exit: 4.1.0 | |
| forwarded@0.2.0: {} | |
| fresh@2.0.0: {} | |
| from2@2.3.0: | |
| dependencies: | |
| inherits: 2.0.4 | |
| readable-stream: 2.3.8 | |
| fs-extra@11.3.0: | |
| dependencies: | |
| graceful-fs: 4.2.11 | |
| jsonfile: 6.1.0 | |
| universalify: 2.0.1 | |
| fsevents@2.3.3: | |
| optional: true | |
| function-bind@1.1.2: {} | |
| function-timeout@1.0.2: {} | |
| fuse.js@7.1.0: {} | |
| get-caller-file@2.0.5: {} | |
| get-intrinsic@1.3.0: | |
| dependencies: | |
| call-bind-apply-helpers: 1.0.2 | |
| es-define-property: 1.0.1 | |
| es-errors: 1.3.0 | |
| es-object-atoms: 1.1.1 | |
| function-bind: 1.1.2 | |
| get-proto: 1.0.1 | |
| gopd: 1.2.0 | |
| has-symbols: 1.1.0 | |
| hasown: 2.0.2 | |
| math-intrinsics: 1.1.0 | |
| get-port-please@3.1.2: {} | |
| get-proto@1.0.1: | |
| dependencies: | |
| dunder-proto: 1.0.1 | |
| es-object-atoms: 1.1.1 | |
| get-stream@6.0.1: {} | |
| get-stream@7.0.1: {} | |
| get-stream@8.0.1: {} | |
| get-stream@9.0.1: | |
| dependencies: | |
| '@sec-ant/readable-stream': 0.4.1 | |
| is-stream: 4.0.1 | |
| git-log-parser@1.2.1: | |
| dependencies: | |
| argv-formatter: 1.0.0 | |
| spawn-error-forwarder: 1.0.0 | |
| split2: 1.0.0 | |
| stream-combiner2: 1.1.1 | |
| through2: 2.0.5 | |
| traverse: 0.6.8 | |
| glob-parent@5.1.2: | |
| dependencies: | |
| is-glob: 4.0.3 | |
| glob-parent@6.0.2: | |
| dependencies: | |
| is-glob: 4.0.3 | |
| glob@10.4.5: | |
| dependencies: | |
| foreground-child: 3.3.1 | |
| jackspeak: 3.4.3 | |
| minimatch: 9.0.5 | |
| minipass: 7.1.2 | |
| package-json-from-dist: 1.0.1 | |
| path-scurry: 1.11.1 | |
| globals@14.0.0: {} | |
| globby@14.1.0: | |
| dependencies: | |
| '@sindresorhus/merge-streams': 2.3.0 | |
| fast-glob: 3.3.3 | |
| ignore: 7.0.3 | |
| path-type: 6.0.0 | |
| slash: 5.1.0 | |
| unicorn-magic: 0.3.0 | |
| gopd@1.2.0: {} | |
| graceful-fs@4.2.10: {} | |
| graceful-fs@4.2.11: {} | |
| handlebars@4.7.8: | |
| dependencies: | |
| minimist: 1.2.8 | |
| neo-async: 2.6.2 | |
| source-map: 0.6.1 | |
| wordwrap: 1.0.0 | |
| optionalDependencies: | |
| uglify-js: 3.19.3 | |
| has-flag@3.0.0: {} | |
| has-flag@4.0.0: {} | |
| has-symbols@1.1.0: {} | |
| hasown@2.0.2: | |
| dependencies: | |
| function-bind: 1.1.2 | |
| highlight.js@10.7.3: {} | |
| hook-std@3.0.0: {} | |
| hosted-git-info@7.0.2: | |
| dependencies: | |
| lru-cache: 10.4.3 | |
| hosted-git-info@8.0.2: | |
| dependencies: | |
| lru-cache: 10.4.3 | |
| http-errors@2.0.0: | |
| dependencies: | |
| depd: 2.0.0 | |
| inherits: 2.0.4 | |
| setprototypeof: 1.2.0 | |
| statuses: 2.0.1 | |
| toidentifier: 1.0.1 | |
| http-proxy-agent@7.0.2: | |
| dependencies: | |
| agent-base: 7.1.3 | |
| debug: 4.4.0 | |
| transitivePeerDependencies: | |
| - supports-color | |
| https-proxy-agent@7.0.6: | |
| dependencies: | |
| agent-base: 7.1.3 | |
| debug: 4.4.0 | |
| transitivePeerDependencies: | |
| - supports-color | |
| human-signals@5.0.0: {} | |
| human-signals@8.0.0: {} | |
| iconv-lite@0.6.3: | |
| dependencies: | |
| safer-buffer: 2.1.2 | |
| ieee754@1.2.1: {} | |
| ignore@5.3.2: {} | |
| ignore@7.0.3: {} | |
| import-fresh@3.3.1: | |
| dependencies: | |
| parent-module: 1.0.1 | |
| resolve-from: 4.0.0 | |
| import-from-esm@2.0.0: | |
| dependencies: | |
| debug: 4.4.0 | |
| import-meta-resolve: 4.1.0 | |
| transitivePeerDependencies: | |
| - supports-color | |
| import-meta-resolve@4.1.0: {} | |
| imurmurhash@0.1.4: {} | |
| indent-string@5.0.0: {} | |
| index-to-position@0.1.2: {} | |
| inherits@2.0.4: {} | |
| ini@1.3.8: {} | |
| into-stream@7.0.0: | |
| dependencies: | |
| from2: 2.3.0 | |
| p-is-promise: 3.0.0 | |
| ipaddr.js@1.9.1: {} | |
| is-arrayish@0.2.1: {} | |
| is-extglob@2.1.1: {} | |
| is-fullwidth-code-point@3.0.0: {} | |
| is-glob@4.0.3: | |
| dependencies: | |
| is-extglob: 2.1.1 | |
| is-number@7.0.0: {} | |
| is-obj@2.0.0: {} | |
| is-plain-obj@4.1.0: {} | |
| is-promise@4.0.0: {} | |
| is-stream@3.0.0: {} | |
| is-stream@4.0.1: {} | |
| is-unicode-supported@2.1.0: {} | |
| isarray@1.0.0: {} | |
| isexe@2.0.0: {} | |
| issue-parser@7.0.1: | |
| dependencies: | |
| lodash.capitalize: 4.2.1 | |
| lodash.escaperegexp: 4.1.2 | |
| lodash.isplainobject: 4.0.6 | |
| lodash.isstring: 4.0.1 | |
| lodash.uniqby: 4.7.0 | |
| jackspeak@3.4.3: | |
| dependencies: | |
| '@isaacs/cliui': 8.0.2 | |
| optionalDependencies: | |
| '@pkgjs/parseargs': 0.11.0 | |
| java-properties@1.0.2: {} | |
| joycon@3.1.1: {} | |
| js-tokens@4.0.0: {} | |
| js-yaml@4.1.0: | |
| dependencies: | |
| argparse: 2.0.1 | |
| json-buffer@3.0.1: {} | |
| json-parse-better-errors@1.0.2: {} | |
| json-parse-even-better-errors@2.3.1: {} | |
| json-schema-traverse@0.4.1: {} | |
| json-stable-stringify-without-jsonify@1.0.1: {} | |
| jsonfile@6.1.0: | |
| dependencies: | |
| universalify: 2.0.1 | |
| optionalDependencies: | |
| graceful-fs: 4.2.11 | |
| jsr@0.13.4: | |
| dependencies: | |
| kolorist: 1.8.0 | |
| node-stream-zip: 1.15.0 | |
| semiver: 1.1.0 | |
| keyv@4.5.4: | |
| dependencies: | |
| json-buffer: 3.0.1 | |
| kolorist@1.8.0: {} | |
| levn@0.4.1: | |
| dependencies: | |
| prelude-ls: 1.2.1 | |
| type-check: 0.4.0 | |
| lilconfig@3.1.3: {} | |
| lines-and-columns@1.2.4: {} | |
| load-json-file@4.0.0: | |
| dependencies: | |
| graceful-fs: 4.2.11 | |
| parse-json: 4.0.0 | |
| pify: 3.0.0 | |
| strip-bom: 3.0.0 | |
| load-tsconfig@0.2.5: {} | |
| locate-path@2.0.0: | |
| dependencies: | |
| p-locate: 2.0.0 | |
| path-exists: 3.0.0 | |
| locate-path@6.0.0: | |
| dependencies: | |
| p-locate: 5.0.0 | |
| lodash-es@4.17.21: {} | |
| lodash.capitalize@4.2.1: {} | |
| lodash.escaperegexp@4.1.2: {} | |
| lodash.isplainobject@4.0.6: {} | |
| lodash.isstring@4.0.1: {} | |
| lodash.merge@4.6.2: {} | |
| lodash.sortby@4.7.0: {} | |
| lodash.uniqby@4.7.0: {} | |
| loupe@3.1.3: {} | |
| lru-cache@10.4.3: {} | |
| magic-string@0.30.17: | |
| dependencies: | |
| '@jridgewell/sourcemap-codec': 1.5.0 | |
| marked-terminal@7.3.0(marked@12.0.2): | |
| dependencies: | |
| ansi-escapes: 7.0.0 | |
| ansi-regex: 6.1.0 | |
| chalk: 5.4.1 | |
| cli-highlight: 2.1.11 | |
| cli-table3: 0.6.5 | |
| marked: 12.0.2 | |
| node-emoji: 2.2.0 | |
| supports-hyperlinks: 3.2.0 | |
| marked@12.0.2: {} | |
| math-intrinsics@1.1.0: {} | |
| mcp-proxy@2.12.2: | |
| dependencies: | |
| '@modelcontextprotocol/sdk': 1.10.2 | |
| eventsource: 3.0.6 | |
| yargs: 17.7.2 | |
| transitivePeerDependencies: | |
| - supports-color | |
| media-typer@1.1.0: {} | |
| meow@13.2.0: {} | |
| merge-descriptors@2.0.0: {} | |
| merge-stream@2.0.0: {} | |
| merge2@1.4.1: {} | |
| micromatch@4.0.8: | |
| dependencies: | |
| braces: 3.0.3 | |
| picomatch: 2.3.1 | |
| mime-db@1.54.0: {} | |
| mime-types@3.0.1: | |
| dependencies: | |
| mime-db: 1.54.0 | |
| mime@4.0.6: {} | |
| mimic-fn@4.0.0: {} | |
| minimatch@3.1.2: | |
| dependencies: | |
| brace-expansion: 1.1.11 | |
| minimatch@9.0.5: | |
| dependencies: | |
| brace-expansion: 2.0.1 | |
| minimist@1.2.8: {} | |
| minipass@7.1.2: {} | |
| ms@2.1.3: {} | |
| mz@2.7.0: | |
| dependencies: | |
| any-promise: 1.3.0 | |
| object-assign: 4.1.1 | |
| thenify-all: 1.6.0 | |
| nanoid@3.3.11: {} | |
| natural-compare@1.4.0: {} | |
| natural-orderby@5.0.0: {} | |
| negotiator@1.0.0: {} | |
| neo-async@2.6.2: {} | |
| nerf-dart@1.0.0: {} | |
| node-emoji@2.2.0: | |
| dependencies: | |
| '@sindresorhus/is': 4.6.0 | |
| char-regex: 1.0.2 | |
| emojilib: 2.4.0 | |
| skin-tone: 2.0.0 | |
| node-stream-zip@1.15.0: {} | |
| normalize-package-data@6.0.2: | |
| dependencies: | |
| hosted-git-info: 7.0.2 | |
| semver: 7.7.1 | |
| validate-npm-package-license: 3.0.4 | |
| normalize-url@8.0.1: {} | |
| npm-run-path@5.3.0: | |
| dependencies: | |
| path-key: 4.0.0 | |
| npm-run-path@6.0.0: | |
| dependencies: | |
| path-key: 4.0.0 | |
| unicorn-magic: 0.3.0 | |
| npm@10.9.2: {} | |
| object-assign@4.1.1: {} | |
| object-inspect@1.13.4: {} | |
| on-finished@2.4.1: | |
| dependencies: | |
| ee-first: 1.1.1 | |
| once@1.4.0: | |
| dependencies: | |
| wrappy: 1.0.2 | |
| onetime@6.0.0: | |
| dependencies: | |
| mimic-fn: 4.0.0 | |
| optionator@0.9.4: | |
| dependencies: | |
| deep-is: 0.1.4 | |
| fast-levenshtein: 2.0.6 | |
| levn: 0.4.1 | |
| prelude-ls: 1.2.1 | |
| type-check: 0.4.0 | |
| word-wrap: 1.2.5 | |
| p-each-series@3.0.0: {} | |
| p-filter@4.1.0: | |
| dependencies: | |
| p-map: 7.0.3 | |
| p-is-promise@3.0.0: {} | |
| p-limit@1.3.0: | |
| dependencies: | |
| p-try: 1.0.0 | |
| p-limit@3.1.0: | |
| dependencies: | |
| yocto-queue: 0.1.0 | |
| p-locate@2.0.0: | |
| dependencies: | |
| p-limit: 1.3.0 | |
| p-locate@5.0.0: | |
| dependencies: | |
| p-limit: 3.1.0 | |
| p-map@7.0.3: {} | |
| p-reduce@3.0.0: {} | |
| p-try@1.0.0: {} | |
| package-json-from-dist@1.0.1: {} | |
| parent-module@1.0.1: | |
| dependencies: | |
| callsites: 3.1.0 | |
| parse-json@4.0.0: | |
| dependencies: | |
| error-ex: 1.3.2 | |
| json-parse-better-errors: 1.0.2 | |
| parse-json@5.2.0: | |
| dependencies: | |
| '@babel/code-frame': 7.26.2 | |
| error-ex: 1.3.2 | |
| json-parse-even-better-errors: 2.3.1 | |
| lines-and-columns: 1.2.4 | |
| parse-json@8.1.0: | |
| dependencies: | |
| '@babel/code-frame': 7.26.2 | |
| index-to-position: 0.1.2 | |
| type-fest: 4.35.0 | |
| parse-ms@4.0.0: {} | |
| parse5-htmlparser2-tree-adapter@6.0.1: | |
| dependencies: | |
| parse5: 6.0.1 | |
| parse5@5.1.1: {} | |
| parse5@6.0.1: {} | |
| parseurl@1.3.3: {} | |
| path-exists@3.0.0: {} | |
| path-exists@4.0.0: {} | |
| path-key@3.1.1: {} | |
| path-key@4.0.0: {} | |
| path-scurry@1.11.1: | |
| dependencies: | |
| lru-cache: 10.4.3 | |
| minipass: 7.1.2 | |
| path-to-regexp@8.2.0: {} | |
| path-type@4.0.0: {} | |
| path-type@6.0.0: {} | |
| pathe@2.0.3: {} | |
| pathval@2.0.0: {} | |
| peek-readable@7.0.0: {} | |
| picocolors@1.1.1: {} | |
| picomatch@2.3.1: {} | |
| picomatch@4.0.2: {} | |
| pify@3.0.0: {} | |
| pirates@4.0.6: {} | |
| pkce-challenge@5.0.0: {} | |
| pkg-conf@2.1.0: | |
| dependencies: | |
| find-up: 2.1.0 | |
| load-json-file: 4.0.0 | |
| postcss-load-config@6.0.1(postcss@8.5.3): | |
| dependencies: | |
| lilconfig: 3.1.3 | |
| optionalDependencies: | |
| postcss: 8.5.3 | |
| postcss@8.5.3: | |
| dependencies: | |
| nanoid: 3.3.11 | |
| picocolors: 1.1.1 | |
| source-map-js: 1.2.1 | |
| prelude-ls@1.2.1: {} | |
| prettier@3.5.3: {} | |
| pretty-ms@9.2.0: | |
| dependencies: | |
| parse-ms: 4.0.0 | |
| process-nextick-args@2.0.1: {} | |
| proto-list@1.2.4: {} | |
| proxy-addr@2.0.7: | |
| dependencies: | |
| forwarded: 0.2.0 | |
| ipaddr.js: 1.9.1 | |
| punycode@2.3.1: {} | |
| qs@6.14.0: | |
| dependencies: | |
| side-channel: 1.1.0 | |
| queue-microtask@1.2.3: {} | |
| range-parser@1.2.1: {} | |
| raw-body@3.0.0: | |
| dependencies: | |
| bytes: 3.1.2 | |
| http-errors: 2.0.0 | |
| iconv-lite: 0.6.3 | |
| unpipe: 1.0.0 | |
| rc@1.2.8: | |
| dependencies: | |
| deep-extend: 0.6.0 | |
| ini: 1.3.8 | |
| minimist: 1.2.8 | |
| strip-json-comments: 2.0.1 | |
| read-package-up@11.0.0: | |
| dependencies: | |
| find-up-simple: 1.0.0 | |
| read-pkg: 9.0.1 | |
| type-fest: 4.35.0 | |
| read-pkg@9.0.1: | |
| dependencies: | |
| '@types/normalize-package-data': 2.4.4 | |
| normalize-package-data: 6.0.2 | |
| parse-json: 8.1.0 | |
| type-fest: 4.35.0 | |
| unicorn-magic: 0.1.0 | |
| readable-stream@2.3.8: | |
| dependencies: | |
| core-util-is: 1.0.3 | |
| inherits: 2.0.4 | |
| isarray: 1.0.0 | |
| process-nextick-args: 2.0.1 | |
| safe-buffer: 5.1.2 | |
| string_decoder: 1.1.1 | |
| util-deprecate: 1.0.2 | |
| readdirp@4.1.2: {} | |
| registry-auth-token@5.1.0: | |
| dependencies: | |
| '@pnpm/npm-conf': 2.3.1 | |
| require-directory@2.1.1: {} | |
| resolve-from@4.0.0: {} | |
| resolve-from@5.0.0: {} | |
| reusify@1.0.4: {} | |
| rollup@4.34.8: | |
| dependencies: | |
| '@types/estree': 1.0.6 | |
| optionalDependencies: | |
| '@rollup/rollup-android-arm-eabi': 4.34.8 | |
| '@rollup/rollup-android-arm64': 4.34.8 | |
| '@rollup/rollup-darwin-arm64': 4.34.8 | |
| '@rollup/rollup-darwin-x64': 4.34.8 | |
| '@rollup/rollup-freebsd-arm64': 4.34.8 | |
| '@rollup/rollup-freebsd-x64': 4.34.8 | |
| '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 | |
| '@rollup/rollup-linux-arm-musleabihf': 4.34.8 | |
| '@rollup/rollup-linux-arm64-gnu': 4.34.8 | |
| '@rollup/rollup-linux-arm64-musl': 4.34.8 | |
| '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 | |
| '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 | |
| '@rollup/rollup-linux-riscv64-gnu': 4.34.8 | |
| '@rollup/rollup-linux-s390x-gnu': 4.34.8 | |
| '@rollup/rollup-linux-x64-gnu': 4.34.8 | |
| '@rollup/rollup-linux-x64-musl': 4.34.8 | |
| '@rollup/rollup-win32-arm64-msvc': 4.34.8 | |
| '@rollup/rollup-win32-ia32-msvc': 4.34.8 | |
| '@rollup/rollup-win32-x64-msvc': 4.34.8 | |
| fsevents: 2.3.3 | |
| rollup@4.40.0: | |
| dependencies: | |
| '@types/estree': 1.0.7 | |
| optionalDependencies: | |
| '@rollup/rollup-android-arm-eabi': 4.40.0 | |
| '@rollup/rollup-android-arm64': 4.40.0 | |
| '@rollup/rollup-darwin-arm64': 4.40.0 | |
| '@rollup/rollup-darwin-x64': 4.40.0 | |
| '@rollup/rollup-freebsd-arm64': 4.40.0 | |
| '@rollup/rollup-freebsd-x64': 4.40.0 | |
| '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 | |
| '@rollup/rollup-linux-arm-musleabihf': 4.40.0 | |
| '@rollup/rollup-linux-arm64-gnu': 4.40.0 | |
| '@rollup/rollup-linux-arm64-musl': 4.40.0 | |
| '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 | |
| '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 | |
| '@rollup/rollup-linux-riscv64-gnu': 4.40.0 | |
| '@rollup/rollup-linux-riscv64-musl': 4.40.0 | |
| '@rollup/rollup-linux-s390x-gnu': 4.40.0 | |
| '@rollup/rollup-linux-x64-gnu': 4.40.0 | |
| '@rollup/rollup-linux-x64-musl': 4.40.0 | |
| '@rollup/rollup-win32-arm64-msvc': 4.40.0 | |
| '@rollup/rollup-win32-ia32-msvc': 4.40.0 | |
| '@rollup/rollup-win32-x64-msvc': 4.40.0 | |
| fsevents: 2.3.3 | |
| router@2.2.0: | |
| dependencies: | |
| debug: 4.4.0 | |
| depd: 2.0.0 | |
| is-promise: 4.0.0 | |
| parseurl: 1.3.3 | |
| path-to-regexp: 8.2.0 | |
| transitivePeerDependencies: | |
| - supports-color | |
| run-parallel@1.2.0: | |
| dependencies: | |
| queue-microtask: 1.2.3 | |
| safe-buffer@5.1.2: {} | |
| safe-buffer@5.2.1: {} | |
| safer-buffer@2.1.2: {} | |
| semantic-release@24.2.3(typescript@5.8.3): | |
| dependencies: | |
| '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.3(typescript@5.8.3)) | |
| '@semantic-release/error': 4.0.0 | |
| '@semantic-release/github': 11.0.1(semantic-release@24.2.3(typescript@5.8.3)) | |
| '@semantic-release/npm': 12.0.1(semantic-release@24.2.3(typescript@5.8.3)) | |
| '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.2.3(typescript@5.8.3)) | |
| aggregate-error: 5.0.0 | |
| cosmiconfig: 9.0.0(typescript@5.8.3) | |
| debug: 4.4.0 | |
| env-ci: 11.1.0 | |
| execa: 9.5.2 | |
| figures: 6.1.0 | |
| find-versions: 6.0.0 | |
| get-stream: 6.0.1 | |
| git-log-parser: 1.2.1 | |
| hook-std: 3.0.0 | |
| hosted-git-info: 8.0.2 | |
| import-from-esm: 2.0.0 | |
| lodash-es: 4.17.21 | |
| marked: 12.0.2 | |
| marked-terminal: 7.3.0(marked@12.0.2) | |
| micromatch: 4.0.8 | |
| p-each-series: 3.0.0 | |
| p-reduce: 3.0.0 | |
| read-package-up: 11.0.0 | |
| resolve-from: 5.0.0 | |
| semver: 7.7.1 | |
| semver-diff: 4.0.0 | |
| signale: 1.4.0 | |
| yargs: 17.7.2 | |
| transitivePeerDependencies: | |
| - supports-color | |
| - typescript | |
| semiver@1.1.0: {} | |
| semver-diff@4.0.0: | |
| dependencies: | |
| semver: 7.7.1 | |
| semver-regex@4.0.5: {} | |
| semver@7.7.1: {} | |
| send@1.2.0: | |
| dependencies: | |
| debug: 4.4.0 | |
| encodeurl: 2.0.0 | |
| escape-html: 1.0.3 | |
| etag: 1.8.1 | |
| fresh: 2.0.0 | |
| http-errors: 2.0.0 | |
| mime-types: 3.0.1 | |
| ms: 2.1.3 | |
| on-finished: 2.4.1 | |
| range-parser: 1.2.1 | |
| statuses: 2.0.1 | |
| transitivePeerDependencies: | |
| - supports-color | |
| serve-static@2.2.0: | |
| dependencies: | |
| encodeurl: 2.0.0 | |
| escape-html: 1.0.3 | |
| parseurl: 1.3.3 | |
| send: 1.2.0 | |
| transitivePeerDependencies: | |
| - supports-color | |
| setprototypeof@1.2.0: {} | |
| shebang-command@2.0.0: | |
| dependencies: | |
| shebang-regex: 3.0.0 | |
| shebang-regex@3.0.0: {} | |
| side-channel-list@1.0.0: | |
| dependencies: | |
| es-errors: 1.3.0 | |
| object-inspect: 1.13.4 | |
| side-channel-map@1.0.1: | |
| dependencies: | |
| call-bound: 1.0.4 | |
| es-errors: 1.3.0 | |
| get-intrinsic: 1.3.0 | |
| object-inspect: 1.13.4 | |
| side-channel-weakmap@1.0.2: | |
| dependencies: | |
| call-bound: 1.0.4 | |
| es-errors: 1.3.0 | |
| get-intrinsic: 1.3.0 | |
| object-inspect: 1.13.4 | |
| side-channel-map: 1.0.1 | |
| side-channel@1.1.0: | |
| dependencies: | |
| es-errors: 1.3.0 | |
| object-inspect: 1.13.4 | |
| side-channel-list: 1.0.0 | |
| side-channel-map: 1.0.1 | |
| side-channel-weakmap: 1.0.2 | |
| siginfo@2.0.0: {} | |
| signal-exit@4.1.0: {} | |
| signale@1.4.0: | |
| dependencies: | |
| chalk: 2.4.2 | |
| figures: 2.0.0 | |
| pkg-conf: 2.1.0 | |
| skin-tone@2.0.0: | |
| dependencies: | |
| unicode-emoji-modifier-base: 1.0.0 | |
| slash@5.1.0: {} | |
| source-map-js@1.2.1: {} | |
| source-map@0.6.1: {} | |
| source-map@0.8.0-beta.0: | |
| dependencies: | |
| whatwg-url: 7.1.0 | |
| spawn-error-forwarder@1.0.0: {} | |
| spdx-correct@3.2.0: | |
| dependencies: | |
| spdx-expression-parse: 3.0.1 | |
| spdx-license-ids: 3.0.21 | |
| spdx-exceptions@2.5.0: {} | |
| spdx-expression-parse@3.0.1: | |
| dependencies: | |
| spdx-exceptions: 2.5.0 | |
| spdx-license-ids: 3.0.21 | |
| spdx-license-ids@3.0.21: {} | |
| split2@1.0.0: | |
| dependencies: | |
| through2: 2.0.5 | |
| stackback@0.0.2: {} | |
| statuses@2.0.1: {} | |
| std-env@3.9.0: {} | |
| stream-combiner2@1.1.1: | |
| dependencies: | |
| duplexer2: 0.1.4 | |
| readable-stream: 2.3.8 | |
| strict-event-emitter-types@2.0.0: {} | |
| string-width@4.2.3: | |
| dependencies: | |
| emoji-regex: 8.0.0 | |
| is-fullwidth-code-point: 3.0.0 | |
| strip-ansi: 6.0.1 | |
| string-width@5.1.2: | |
| dependencies: | |
| eastasianwidth: 0.2.0 | |
| emoji-regex: 9.2.2 | |
| strip-ansi: 7.1.0 | |
| string_decoder@1.1.1: | |
| dependencies: | |
| safe-buffer: 5.1.2 | |
| strip-ansi@6.0.1: | |
| dependencies: | |
| ansi-regex: 5.0.1 | |
| strip-ansi@7.1.0: | |
| dependencies: | |
| ansi-regex: 6.1.0 | |
| strip-bom@3.0.0: {} | |
| strip-final-newline@3.0.0: {} | |
| strip-final-newline@4.0.0: {} | |
| strip-json-comments@2.0.1: {} | |
| strip-json-comments@3.1.1: {} | |
| strtok3@10.2.2: | |
| dependencies: | |
| '@tokenizer/token': 0.3.0 | |
| peek-readable: 7.0.0 | |
| sucrase@3.35.0: | |
| dependencies: | |
| '@jridgewell/gen-mapping': 0.3.8 | |
| commander: 4.1.1 | |
| glob: 10.4.5 | |
| lines-and-columns: 1.2.4 | |
| mz: 2.7.0 | |
| pirates: 4.0.6 | |
| ts-interface-checker: 0.1.13 | |
| super-regex@1.0.0: | |
| dependencies: | |
| function-timeout: 1.0.2 | |
| time-span: 5.1.0 | |
| supports-color@5.5.0: | |
| dependencies: | |
| has-flag: 3.0.0 | |
| supports-color@7.2.0: | |
| dependencies: | |
| has-flag: 4.0.0 | |
| supports-hyperlinks@3.2.0: | |
| dependencies: | |
| has-flag: 4.0.0 | |
| supports-color: 7.2.0 | |
| temp-dir@3.0.0: {} | |
| tempy@3.1.0: | |
| dependencies: | |
| is-stream: 3.0.0 | |
| temp-dir: 3.0.0 | |
| type-fest: 2.19.0 | |
| unique-string: 3.0.0 | |
| thenify-all@1.6.0: | |
| dependencies: | |
| thenify: 3.3.1 | |
| thenify@3.3.1: | |
| dependencies: | |
| any-promise: 1.3.0 | |
| through2@2.0.5: | |
| dependencies: | |
| readable-stream: 2.3.8 | |
| xtend: 4.0.2 | |
| time-span@5.1.0: | |
| dependencies: | |
| convert-hrtime: 5.0.0 | |
| tinybench@2.9.0: {} | |
| tinyexec@0.3.2: {} | |
| tinyglobby@0.2.12: | |
| dependencies: | |
| fdir: 6.4.3(picomatch@4.0.2) | |
| picomatch: 4.0.2 | |
| tinyglobby@0.2.13: | |
| dependencies: | |
| fdir: 6.4.4(picomatch@4.0.2) | |
| picomatch: 4.0.2 | |
| tinypool@1.0.2: {} | |
| tinyrainbow@2.0.0: {} | |
| tinyspy@3.0.2: {} | |
| to-regex-range@5.0.1: | |
| dependencies: | |
| is-number: 7.0.0 | |
| toidentifier@1.0.1: {} | |
| token-types@6.0.0: | |
| dependencies: | |
| '@tokenizer/token': 0.3.0 | |
| ieee754: 1.2.1 | |
| tr46@1.0.1: | |
| dependencies: | |
| punycode: 2.3.1 | |
| traverse@0.6.8: {} | |
| tree-kill@1.2.2: {} | |
| ts-api-utils@2.1.0(typescript@5.8.3): | |
| dependencies: | |
| typescript: 5.8.3 | |
| ts-interface-checker@0.1.13: {} | |
| tsup@8.4.0(postcss@8.5.3)(typescript@5.8.3): | |
| dependencies: | |
| bundle-require: 5.1.0(esbuild@0.25.0) | |
| cac: 6.7.14 | |
| chokidar: 4.0.3 | |
| consola: 3.4.0 | |
| debug: 4.4.0 | |
| esbuild: 0.25.0 | |
| joycon: 3.1.1 | |
| picocolors: 1.1.1 | |
| postcss-load-config: 6.0.1(postcss@8.5.3) | |
| resolve-from: 5.0.0 | |
| rollup: 4.34.8 | |
| source-map: 0.8.0-beta.0 | |
| sucrase: 3.35.0 | |
| tinyexec: 0.3.2 | |
| tinyglobby: 0.2.12 | |
| tree-kill: 1.2.2 | |
| optionalDependencies: | |
| postcss: 8.5.3 | |
| typescript: 5.8.3 | |
| transitivePeerDependencies: | |
| - jiti | |
| - supports-color | |
| - tsx | |
| - yaml | |
| type-check@0.4.0: | |
| dependencies: | |
| prelude-ls: 1.2.1 | |
| type-fest@1.4.0: {} | |
| type-fest@2.19.0: {} | |
| type-fest@4.35.0: {} | |
| type-is@2.0.1: | |
| dependencies: | |
| content-type: 1.0.5 | |
| media-typer: 1.1.0 | |
| mime-types: 3.0.1 | |
| typescript@5.8.3: {} | |
| uglify-js@3.19.3: | |
| optional: true | |
| uint8array-extras@1.4.0: {} | |
| undici-types@6.21.0: {} | |
| undici@7.8.0: {} | |
| unicode-emoji-modifier-base@1.0.0: {} | |
| unicorn-magic@0.1.0: {} | |
| unicorn-magic@0.3.0: {} | |
| unique-string@3.0.0: | |
| dependencies: | |
| crypto-random-string: 4.0.0 | |
| universal-user-agent@7.0.2: {} | |
| universalify@2.0.1: {} | |
| unpipe@1.0.0: {} | |
| uri-js@4.4.1: | |
| dependencies: | |
| punycode: 2.3.1 | |
| uri-templates@0.2.0: {} | |
| url-join@5.0.0: {} | |
| util-deprecate@1.0.2: {} | |
| valibot@1.0.0(typescript@5.8.3): | |
| optionalDependencies: | |
| typescript: 5.8.3 | |
| validate-npm-package-license@3.0.4: | |
| dependencies: | |
| spdx-correct: 3.2.0 | |
| spdx-expression-parse: 3.0.1 | |
| vary@1.1.2: {} | |
| vite-node@3.1.2(@types/node@22.14.1): | |
| dependencies: | |
| cac: 6.7.14 | |
| debug: 4.4.0 | |
| es-module-lexer: 1.6.0 | |
| pathe: 2.0.3 | |
| vite: 6.3.2(@types/node@22.14.1) | |
| transitivePeerDependencies: | |
| - '@types/node' | |
| - jiti | |
| - less | |
| - lightningcss | |
| - sass | |
| - sass-embedded | |
| - stylus | |
| - sugarss | |
| - supports-color | |
| - terser | |
| - tsx | |
| - yaml | |
| vite@6.3.2(@types/node@22.14.1): | |
| dependencies: | |
| esbuild: 0.25.2 | |
| fdir: 6.4.4(picomatch@4.0.2) | |
| picomatch: 4.0.2 | |
| postcss: 8.5.3 | |
| rollup: 4.40.0 | |
| tinyglobby: 0.2.13 | |
| optionalDependencies: | |
| '@types/node': 22.14.1 | |
| fsevents: 2.3.3 | |
| vitest@3.1.2(@types/node@22.14.1): | |
| dependencies: | |
| '@vitest/expect': 3.1.2 | |
| '@vitest/mocker': 3.1.2(vite@6.3.2(@types/node@22.14.1)) | |
| '@vitest/pretty-format': 3.1.2 | |
| '@vitest/runner': 3.1.2 | |
| '@vitest/snapshot': 3.1.2 | |
| '@vitest/spy': 3.1.2 | |
| '@vitest/utils': 3.1.2 | |
| chai: 5.2.0 | |
| debug: 4.4.0 | |
| expect-type: 1.2.1 | |
| magic-string: 0.30.17 | |
| pathe: 2.0.3 | |
| std-env: 3.9.0 | |
| tinybench: 2.9.0 | |
| tinyexec: 0.3.2 | |
| tinyglobby: 0.2.13 | |
| tinypool: 1.0.2 | |
| tinyrainbow: 2.0.0 | |
| vite: 6.3.2(@types/node@22.14.1) | |
| vite-node: 3.1.2(@types/node@22.14.1) | |
| why-is-node-running: 2.3.0 | |
| optionalDependencies: | |
| '@types/node': 22.14.1 | |
| transitivePeerDependencies: | |
| - jiti | |
| - less | |
| - lightningcss | |
| - msw | |
| - sass | |
| - sass-embedded | |
| - stylus | |
| - sugarss | |
| - supports-color | |
| - terser | |
| - tsx | |
| - yaml | |
| webidl-conversions@4.0.2: {} | |
| whatwg-url@7.1.0: | |
| dependencies: | |
| lodash.sortby: 4.7.0 | |
| tr46: 1.0.1 | |
| webidl-conversions: 4.0.2 | |
| which@2.0.2: | |
| dependencies: | |
| isexe: 2.0.0 | |
| why-is-node-running@2.3.0: | |
| dependencies: | |
| siginfo: 2.0.0 | |
| stackback: 0.0.2 | |
| word-wrap@1.2.5: {} | |
| wordwrap@1.0.0: {} | |
| wrap-ansi@7.0.0: | |
| dependencies: | |
| ansi-styles: 4.3.0 | |
| string-width: 4.2.3 | |
| strip-ansi: 6.0.1 | |
| wrap-ansi@8.1.0: | |
| dependencies: | |
| ansi-styles: 6.2.1 | |
| string-width: 5.1.2 | |
| strip-ansi: 7.1.0 | |
| wrappy@1.0.2: {} | |
| xsschema@0.2.0-beta.3(@valibot/to-json-schema@1.0.0(valibot@1.0.0(typescript@5.8.3)))(arktype@2.1.20)(zod-to-json-schema@3.24.5(zod@3.24.3)): | |
| optionalDependencies: | |
| '@valibot/to-json-schema': 1.0.0(valibot@1.0.0(typescript@5.8.3)) | |
| arktype: 2.1.20 | |
| zod-to-json-schema: 3.24.5(zod@3.24.3) | |
| xtend@4.0.2: {} | |
| y18n@5.0.8: {} | |
| yargs-parser@20.2.9: {} | |
| yargs-parser@21.1.1: {} | |
| yargs@16.2.0: | |
| dependencies: | |
| cliui: 7.0.4 | |
| escalade: 3.2.0 | |
| get-caller-file: 2.0.5 | |
| require-directory: 2.1.1 | |
| string-width: 4.2.3 | |
| y18n: 5.0.8 | |
| yargs-parser: 20.2.9 | |
| yargs@17.7.2: | |
| dependencies: | |
| cliui: 8.0.1 | |
| escalade: 3.2.0 | |
| get-caller-file: 2.0.5 | |
| require-directory: 2.1.1 | |
| string-width: 4.2.3 | |
| y18n: 5.0.8 | |
| yargs-parser: 21.1.1 | |
| yocto-queue@0.1.0: {} | |
| yoctocolors@2.1.1: {} | |
| zod-to-json-schema@3.24.5(zod@3.24.3): | |
| dependencies: | |
| zod: 3.24.3 | |
| zod@3.24.3: {} | |
| ================================================ | |
| FILE: tsconfig.json | |
| ================================================ | |
| { | |
| "extends": "@tsconfig/node22/tsconfig.json", | |
| "compilerOptions": { | |
| "noEmit": true, | |
| "noUnusedLocals": true, | |
| "noUnusedParameters": true | |
| } | |
| } | |
| ================================================ | |
| FILE: vitest.config.js | |
| ================================================ | |
| import { defineConfig } from "vitest/config"; | |
| export default defineConfig({ | |
| test: { | |
| poolOptions: { | |
| forks: { execArgv: ["--experimental-eventsource"] }, | |
| }, | |
| }, | |
| }); | |
| ================================================ | |
| FILE: src/FastMCP.test.ts | |
| ================================================ | |
| import { FastMCP, FastMCPSession, UserError, imageContent } from "./FastMCP.js"; | |
| import { z } from "zod"; | |
| import { test, expect, vi } from "vitest"; | |
| import { Client } from "@modelcontextprotocol/sdk/client/index.js"; | |
| import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js"; | |
| import { getRandomPort } from "get-port-please"; | |
| import { setTimeout as delay } from "timers/promises"; | |
| import { | |
| CreateMessageRequestSchema, | |
| ErrorCode, | |
| ListRootsRequestSchema, | |
| LoggingMessageNotificationSchema, | |
| McpError, | |
| PingRequestSchema, | |
| Root, | |
| } from "@modelcontextprotocol/sdk/types.js"; | |
| import { createEventSource, EventSourceClient } from 'eventsource-client'; | |
| const runWithTestServer = async ({ | |
| run, | |
| client: createClient, | |
| server: createServer, | |
| }: { | |
| server?: () => Promise<FastMCP>; | |
| client?: () => Promise<Client>; | |
| run: ({ | |
| client, | |
| server, | |
| }: { | |
| client: Client; | |
| server: FastMCP; | |
| session: FastMCPSession; | |
| }) => Promise<void>; | |
| }) => { | |
| const port = await getRandomPort(); | |
| const server = createServer | |
| ? await createServer() | |
| : new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| await server.start({ | |
| transportType: "sse", | |
| sse: { | |
| endpoint: "/sse", | |
| port, | |
| }, | |
| }); | |
| try { | |
| const client = createClient | |
| ? await createClient() | |
| : new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: {}, | |
| }, | |
| ); | |
| const transport = new SSEClientTransport( | |
| new URL(`http://localhost:${port}/sse`), | |
| ); | |
| const session = await new Promise<FastMCPSession>((resolve) => { | |
| server.on("connect", (event) => { | |
| resolve(event.session); | |
| }); | |
| client.connect(transport); | |
| }); | |
| await run({ client, server, session }); | |
| } finally { | |
| await server.stop(); | |
| } | |
| return port; | |
| }; | |
| test("adds tools", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async (args) => { | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect(await client.listTools()).toEqual({ | |
| tools: [ | |
| { | |
| name: "add", | |
| description: "Add two numbers", | |
| inputSchema: { | |
| additionalProperties: false, | |
| $schema: "http://json-schema.org/draft-07/schema#", | |
| type: "object", | |
| properties: { | |
| a: { type: "number" }, | |
| b: { type: "number" }, | |
| }, | |
| required: ["a", "b"], | |
| }, | |
| }, | |
| ], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("calls a tool", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async (args) => { | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect( | |
| await client.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }), | |
| ).toEqual({ | |
| content: [{ type: "text", text: "3" }], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("returns a list", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async () => { | |
| return { | |
| content: [ | |
| { type: "text", text: "a" }, | |
| { type: "text", text: "b" }, | |
| ], | |
| }; | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect( | |
| await client.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }), | |
| ).toEqual({ | |
| content: [ | |
| { type: "text", text: "a" }, | |
| { type: "text", text: "b" }, | |
| ], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("returns an image", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async () => { | |
| return imageContent({ | |
| buffer: Buffer.from( | |
| "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", | |
| "base64", | |
| ), | |
| }); | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect( | |
| await client.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }), | |
| ).toEqual({ | |
| content: [ | |
| { | |
| type: "image", | |
| data: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=", | |
| mimeType: "image/png", | |
| }, | |
| ], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("handles UserError errors", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async () => { | |
| throw new UserError("Something went wrong"); | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect( | |
| await client.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }), | |
| ).toEqual({ | |
| content: [{ type: "text", text: "Something went wrong" }], | |
| isError: true, | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("calling an unknown tool throws McpError with MethodNotFound code", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| try { | |
| await client.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }); | |
| } catch (error) { | |
| expect(error).toBeInstanceOf(McpError); | |
| // @ts-expect-error - we know that error is an McpError | |
| expect(error.code).toBe(ErrorCode.MethodNotFound); | |
| } | |
| }, | |
| }); | |
| }); | |
| test("tracks tool progress", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async (args, { reportProgress }) => { | |
| reportProgress({ | |
| progress: 0, | |
| total: 10, | |
| }); | |
| await delay(100); | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| const onProgress = vi.fn(); | |
| await client.callTool( | |
| { | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }, | |
| undefined, | |
| { | |
| onprogress: onProgress, | |
| }, | |
| ); | |
| expect(onProgress).toHaveBeenCalledTimes(1); | |
| expect(onProgress).toHaveBeenCalledWith({ | |
| progress: 0, | |
| total: 10, | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("sets logging levels", async () => { | |
| await runWithTestServer({ | |
| run: async ({ client, session }) => { | |
| await client.setLoggingLevel("debug"); | |
| expect(session.loggingLevel).toBe("debug"); | |
| await client.setLoggingLevel("info"); | |
| expect(session.loggingLevel).toBe("info"); | |
| }, | |
| }); | |
| }); | |
| test("sends logging messages to the client", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async (args, { log }) => { | |
| log.debug("debug message", { | |
| foo: "bar", | |
| }); | |
| log.error("error message"); | |
| log.info("info message"); | |
| log.warn("warn message"); | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| const onLog = vi.fn(); | |
| client.setNotificationHandler( | |
| LoggingMessageNotificationSchema, | |
| (message) => { | |
| if (message.method === "notifications/message") { | |
| onLog({ | |
| level: message.params.level, | |
| ...(message.params.data ?? {}), | |
| }); | |
| } | |
| }, | |
| ); | |
| await client.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }); | |
| expect(onLog).toHaveBeenCalledTimes(4); | |
| expect(onLog).toHaveBeenNthCalledWith(1, { | |
| level: "debug", | |
| message: "debug message", | |
| context: { | |
| foo: "bar", | |
| }, | |
| }); | |
| expect(onLog).toHaveBeenNthCalledWith(2, { | |
| level: "error", | |
| message: "error message", | |
| }); | |
| expect(onLog).toHaveBeenNthCalledWith(3, { | |
| level: "info", | |
| message: "info message", | |
| }); | |
| expect(onLog).toHaveBeenNthCalledWith(4, { | |
| level: "warning", | |
| message: "warn message", | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("adds resources", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addResource({ | |
| uri: "file:///logs/app.log", | |
| name: "Application Logs", | |
| mimeType: "text/plain", | |
| async load() { | |
| return { | |
| text: "Example log content", | |
| }; | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect(await client.listResources()).toEqual({ | |
| resources: [ | |
| { | |
| uri: "file:///logs/app.log", | |
| name: "Application Logs", | |
| mimeType: "text/plain", | |
| }, | |
| ], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("clients reads a resource", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addResource({ | |
| uri: "file:///logs/app.log", | |
| name: "Application Logs", | |
| mimeType: "text/plain", | |
| async load() { | |
| return { | |
| text: "Example log content", | |
| }; | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect( | |
| await client.readResource({ | |
| uri: "file:///logs/app.log", | |
| }), | |
| ).toEqual({ | |
| contents: [ | |
| { | |
| uri: "file:///logs/app.log", | |
| name: "Application Logs", | |
| text: "Example log content", | |
| mimeType: "text/plain", | |
| }, | |
| ], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("clients reads a resource that returns multiple resources", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addResource({ | |
| uri: "file:///logs/app.log", | |
| name: "Application Logs", | |
| mimeType: "text/plain", | |
| async load() { | |
| return [ | |
| { | |
| text: "a", | |
| }, | |
| { | |
| text: "b", | |
| }, | |
| ]; | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect( | |
| await client.readResource({ | |
| uri: "file:///logs/app.log", | |
| }), | |
| ).toEqual({ | |
| contents: [ | |
| { | |
| uri: "file:///logs/app.log", | |
| name: "Application Logs", | |
| text: "a", | |
| mimeType: "text/plain", | |
| }, | |
| { | |
| uri: "file:///logs/app.log", | |
| name: "Application Logs", | |
| text: "b", | |
| mimeType: "text/plain", | |
| }, | |
| ], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("adds prompts", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addPrompt({ | |
| name: "git-commit", | |
| description: "Generate a Git commit message", | |
| arguments: [ | |
| { | |
| name: "changes", | |
| description: "Git diff or description of changes", | |
| required: true, | |
| }, | |
| ], | |
| load: async (args) => { | |
| return `Generate a concise but descriptive commit message for these changes:\n\n${args.changes}`; | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect( | |
| await client.getPrompt({ | |
| name: "git-commit", | |
| arguments: { | |
| changes: "foo", | |
| }, | |
| }), | |
| ).toEqual({ | |
| description: "Generate a Git commit message", | |
| messages: [ | |
| { | |
| role: "user", | |
| content: { | |
| type: "text", | |
| text: "Generate a concise but descriptive commit message for these changes:\n\nfoo", | |
| }, | |
| }, | |
| ], | |
| }); | |
| expect(await client.listPrompts()).toEqual({ | |
| prompts: [ | |
| { | |
| name: "git-commit", | |
| description: "Generate a Git commit message", | |
| arguments: [ | |
| { | |
| name: "changes", | |
| description: "Git diff or description of changes", | |
| required: true, | |
| }, | |
| ], | |
| }, | |
| ], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("uses events to notify server of client connect/disconnect", async () => { | |
| const port = await getRandomPort(); | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| const onConnect = vi.fn(); | |
| const onDisconnect = vi.fn(); | |
| server.on("connect", onConnect); | |
| server.on("disconnect", onDisconnect); | |
| await server.start({ | |
| transportType: "sse", | |
| sse: { | |
| endpoint: "/sse", | |
| port, | |
| }, | |
| }); | |
| const client = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: {}, | |
| }, | |
| ); | |
| const transport = new SSEClientTransport( | |
| new URL(`http://localhost:${port}/sse`), | |
| ); | |
| await client.connect(transport); | |
| await delay(100); | |
| expect(onConnect).toHaveBeenCalledTimes(1); | |
| expect(onDisconnect).toHaveBeenCalledTimes(0); | |
| expect(server.sessions).toEqual([expect.any(FastMCPSession)]); | |
| await client.close(); | |
| await delay(100); | |
| expect(onConnect).toHaveBeenCalledTimes(1); | |
| expect(onDisconnect).toHaveBeenCalledTimes(1); | |
| await server.stop(); | |
| }); | |
| test("handles multiple clients", async () => { | |
| const port = await getRandomPort(); | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| await server.start({ | |
| transportType: "sse", | |
| sse: { | |
| endpoint: "/sse", | |
| port, | |
| }, | |
| }); | |
| const client1 = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: {}, | |
| }, | |
| ); | |
| const transport1 = new SSEClientTransport( | |
| new URL(`http://localhost:${port}/sse`), | |
| ); | |
| await client1.connect(transport1); | |
| const client2 = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: {}, | |
| }, | |
| ); | |
| const transport2 = new SSEClientTransport( | |
| new URL(`http://localhost:${port}/sse`), | |
| ); | |
| await client2.connect(transport2); | |
| await delay(100); | |
| expect(server.sessions).toEqual([ | |
| expect.any(FastMCPSession), | |
| expect.any(FastMCPSession), | |
| ]); | |
| await server.stop(); | |
| }); | |
| test("session knows about client capabilities", async () => { | |
| await runWithTestServer({ | |
| client: async () => { | |
| const client = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: { | |
| roots: { | |
| listChanged: true, | |
| }, | |
| }, | |
| }, | |
| ); | |
| client.setRequestHandler(ListRootsRequestSchema, () => { | |
| return { | |
| roots: [ | |
| { | |
| uri: "file:///home/user/projects/frontend", | |
| name: "Frontend Repository", | |
| }, | |
| ], | |
| }; | |
| }); | |
| return client; | |
| }, | |
| run: async ({ session }) => { | |
| expect(session.clientCapabilities).toEqual({ | |
| roots: { | |
| listChanged: true, | |
| }, | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("session knows about roots", async () => { | |
| await runWithTestServer({ | |
| client: async () => { | |
| const client = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: { | |
| roots: { | |
| listChanged: true, | |
| }, | |
| }, | |
| }, | |
| ); | |
| client.setRequestHandler(ListRootsRequestSchema, () => { | |
| return { | |
| roots: [ | |
| { | |
| uri: "file:///home/user/projects/frontend", | |
| name: "Frontend Repository", | |
| }, | |
| ], | |
| }; | |
| }); | |
| return client; | |
| }, | |
| run: async ({ session }) => { | |
| expect(session.roots).toEqual([ | |
| { | |
| uri: "file:///home/user/projects/frontend", | |
| name: "Frontend Repository", | |
| }, | |
| ]); | |
| }, | |
| }); | |
| }); | |
| test("session listens to roots changes", async () => { | |
| let clientRoots: Root[] = [ | |
| { | |
| uri: "file:///home/user/projects/frontend", | |
| name: "Frontend Repository", | |
| }, | |
| ]; | |
| await runWithTestServer({ | |
| client: async () => { | |
| const client = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: { | |
| roots: { | |
| listChanged: true, | |
| }, | |
| }, | |
| }, | |
| ); | |
| client.setRequestHandler(ListRootsRequestSchema, () => { | |
| return { | |
| roots: clientRoots, | |
| }; | |
| }); | |
| return client; | |
| }, | |
| run: async ({ session, client }) => { | |
| expect(session.roots).toEqual([ | |
| { | |
| uri: "file:///home/user/projects/frontend", | |
| name: "Frontend Repository", | |
| }, | |
| ]); | |
| clientRoots.push({ | |
| uri: "file:///home/user/projects/backend", | |
| name: "Backend Repository", | |
| }); | |
| await client.sendRootsListChanged(); | |
| const onRootsChanged = vi.fn(); | |
| session.on("rootsChanged", onRootsChanged); | |
| await delay(100); | |
| expect(session.roots).toEqual([ | |
| { | |
| uri: "file:///home/user/projects/frontend", | |
| name: "Frontend Repository", | |
| }, | |
| { | |
| uri: "file:///home/user/projects/backend", | |
| name: "Backend Repository", | |
| }, | |
| ]); | |
| expect(onRootsChanged).toHaveBeenCalledTimes(1); | |
| expect(onRootsChanged).toHaveBeenCalledWith({ | |
| roots: [ | |
| { | |
| uri: "file:///home/user/projects/frontend", | |
| name: "Frontend Repository", | |
| }, | |
| { | |
| uri: "file:///home/user/projects/backend", | |
| name: "Backend Repository", | |
| }, | |
| ], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("session sends pings to the client", async () => { | |
| await runWithTestServer({ | |
| run: async ({ client }) => { | |
| const onPing = vi.fn().mockReturnValue({}); | |
| client.setRequestHandler(PingRequestSchema, onPing); | |
| await delay(2000); | |
| expect(onPing).toHaveBeenCalledTimes(1); | |
| }, | |
| }); | |
| }); | |
| test("completes prompt arguments", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addPrompt({ | |
| name: "countryPoem", | |
| description: "Writes a poem about a country", | |
| load: async ({ name }) => { | |
| return `Hello, ${name}!`; | |
| }, | |
| arguments: [ | |
| { | |
| name: "name", | |
| description: "Name of the country", | |
| required: true, | |
| complete: async (value) => { | |
| if (value === "Germ") { | |
| return { | |
| values: ["Germany"], | |
| }; | |
| } | |
| return { | |
| values: [], | |
| }; | |
| }, | |
| }, | |
| ], | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| const response = await client.complete({ | |
| ref: { | |
| type: "ref/prompt", | |
| name: "countryPoem", | |
| }, | |
| argument: { | |
| name: "name", | |
| value: "Germ", | |
| }, | |
| }); | |
| expect(response).toEqual({ | |
| completion: { | |
| values: ["Germany"], | |
| }, | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("adds automatic prompt argument completion when enum is provided", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addPrompt({ | |
| name: "countryPoem", | |
| description: "Writes a poem about a country", | |
| load: async ({ name }) => { | |
| return `Hello, ${name}!`; | |
| }, | |
| arguments: [ | |
| { | |
| name: "name", | |
| description: "Name of the country", | |
| required: true, | |
| enum: ["Germany", "France", "Italy"], | |
| }, | |
| ], | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| const response = await client.complete({ | |
| ref: { | |
| type: "ref/prompt", | |
| name: "countryPoem", | |
| }, | |
| argument: { | |
| name: "name", | |
| value: "Germ", | |
| }, | |
| }); | |
| expect(response).toEqual({ | |
| completion: { | |
| values: ["Germany"], | |
| total: 1, | |
| }, | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("completes template resource arguments", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addResourceTemplate({ | |
| uriTemplate: "issue:///{issueId}", | |
| name: "Issue", | |
| mimeType: "text/plain", | |
| arguments: [ | |
| { | |
| name: "issueId", | |
| description: "ID of the issue", | |
| complete: async (value) => { | |
| if (value === "123") { | |
| return { | |
| values: ["123456"], | |
| }; | |
| } | |
| return { | |
| values: [], | |
| }; | |
| }, | |
| }, | |
| ], | |
| load: async ({ issueId }) => { | |
| return { | |
| text: `Issue ${issueId}`, | |
| }; | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| const response = await client.complete({ | |
| ref: { | |
| type: "ref/resource", | |
| uri: "issue:///{issueId}", | |
| }, | |
| argument: { | |
| name: "issueId", | |
| value: "123", | |
| }, | |
| }); | |
| expect(response).toEqual({ | |
| completion: { | |
| values: ["123456"], | |
| }, | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("lists resource templates", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addResourceTemplate({ | |
| uriTemplate: "file:///logs/{name}.log", | |
| name: "Application Logs", | |
| mimeType: "text/plain", | |
| arguments: [ | |
| { | |
| name: "name", | |
| description: "Name of the log", | |
| required: true, | |
| }, | |
| ], | |
| load: async ({ name }) => { | |
| return { | |
| text: `Example log content for ${name}`, | |
| }; | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect(await client.listResourceTemplates()).toEqual({ | |
| resourceTemplates: [ | |
| { | |
| name: "Application Logs", | |
| uriTemplate: "file:///logs/{name}.log", | |
| }, | |
| ], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("clients reads a resource accessed via a resource template", async () => { | |
| const loadSpy = vi.fn((_args) => { | |
| return { | |
| text: "Example log content", | |
| }; | |
| }); | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addResourceTemplate({ | |
| uriTemplate: "file:///logs/{name}.log", | |
| name: "Application Logs", | |
| mimeType: "text/plain", | |
| arguments: [ | |
| { | |
| name: "name", | |
| description: "Name of the log", | |
| }, | |
| ], | |
| async load(args) { | |
| return loadSpy(args); | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| expect( | |
| await client.readResource({ | |
| uri: "file:///logs/app.log", | |
| }), | |
| ).toEqual({ | |
| contents: [ | |
| { | |
| uri: "file:///logs/app.log", | |
| name: "Application Logs", | |
| text: "Example log content", | |
| mimeType: "text/plain", | |
| }, | |
| ], | |
| }); | |
| expect(loadSpy).toHaveBeenCalledWith({ | |
| name: "app", | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("makes a sampling request", async () => { | |
| const onMessageRequest = vi.fn(() => { | |
| return { | |
| model: "gpt-3.5-turbo", | |
| role: "assistant", | |
| content: { | |
| type: "text", | |
| text: "The files are in the current directory.", | |
| }, | |
| }; | |
| }); | |
| await runWithTestServer({ | |
| client: async () => { | |
| const client = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: { | |
| sampling: {}, | |
| }, | |
| }, | |
| ); | |
| return client; | |
| }, | |
| run: async ({ client, session }) => { | |
| client.setRequestHandler(CreateMessageRequestSchema, onMessageRequest); | |
| const response = await session.requestSampling({ | |
| messages: [ | |
| { | |
| role: "user", | |
| content: { | |
| type: "text", | |
| text: "What files are in the current directory?", | |
| }, | |
| }, | |
| ], | |
| systemPrompt: "You are a helpful file system assistant.", | |
| includeContext: "thisServer", | |
| maxTokens: 100, | |
| }); | |
| expect(response).toEqual({ | |
| model: "gpt-3.5-turbo", | |
| role: "assistant", | |
| content: { | |
| type: "text", | |
| text: "The files are in the current directory.", | |
| }, | |
| }); | |
| expect(onMessageRequest).toHaveBeenCalledTimes(1); | |
| }, | |
| }); | |
| }); | |
| test("throws ErrorCode.InvalidParams if tool parameters do not match zod schema", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async (args) => { | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| try { | |
| await client.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: "invalid", | |
| }, | |
| }); | |
| } catch (error) { | |
| expect(error).toBeInstanceOf(McpError); | |
| // @ts-expect-error - we know that error is an McpError | |
| expect(error.code).toBe(ErrorCode.InvalidParams); | |
| // @ts-expect-error - we know that error is an McpError | |
| expect(error.message).toBe("MCP error -32602: MCP error -32602: Invalid add parameters"); | |
| } | |
| }, | |
| }); | |
| }); | |
| test("server remains usable after InvalidParams error", async () => { | |
| await runWithTestServer({ | |
| server: async () => { | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async (args) => { | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| return server; | |
| }, | |
| run: async ({ client }) => { | |
| try { | |
| await client.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: "invalid", | |
| }, | |
| }); | |
| } catch (error) { | |
| expect(error).toBeInstanceOf(McpError); | |
| // @ts-expect-error - we know that error is an McpError | |
| expect(error.code).toBe(ErrorCode.InvalidParams); | |
| // @ts-expect-error - we know that error is an McpError | |
| expect(error.message).toBe("MCP error -32602: MCP error -32602: Invalid add parameters"); | |
| } | |
| expect( | |
| await client.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }), | |
| ).toEqual({ | |
| content: [{ type: "text", text: "3" }], | |
| }); | |
| }, | |
| }); | |
| }); | |
| test("allows new clients to connect after a client disconnects", async () => { | |
| const port = await getRandomPort(); | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async (args) => { | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| await server.start({ | |
| transportType: "sse", | |
| sse: { | |
| endpoint: "/sse", | |
| port, | |
| }, | |
| }); | |
| const client1 = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: {}, | |
| }, | |
| ); | |
| const transport1 = new SSEClientTransport( | |
| new URL(`http://localhost:${port}/sse`), | |
| ); | |
| await client1.connect(transport1); | |
| expect( | |
| await client1.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }), | |
| ).toEqual({ | |
| content: [{ type: "text", text: "3" }], | |
| }); | |
| await client1.close(); | |
| const client2 = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: {}, | |
| }, | |
| ); | |
| const transport2 = new SSEClientTransport( | |
| new URL(`http://localhost:${port}/sse`), | |
| ); | |
| await client2.connect(transport2); | |
| expect( | |
| await client2.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }), | |
| ).toEqual({ | |
| content: [{ type: "text", text: "3" }], | |
| }); | |
| await client2.close(); | |
| await server.stop(); | |
| }); | |
| test("able to close server immediately after starting it", async () => { | |
| const port = await getRandomPort(); | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| await server.start({ | |
| transportType: "sse", | |
| sse: { | |
| endpoint: "/sse", | |
| port, | |
| }, | |
| }); | |
| // We were previously not waiting for the server to start. | |
| // Therefore, this would have caused error 'Server is not running.'. | |
| await server.stop(); | |
| }); | |
| test("closing event source does not produce error", async () => { | |
| const port = await getRandomPort(); | |
| const server = new FastMCP({ | |
| name: "Test", | |
| version: "1.0.0", | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute: async (args) => { | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| await server.start({ | |
| transportType: "sse", | |
| sse: { | |
| endpoint: "/sse", | |
| port, | |
| }, | |
| }); | |
| const eventSource = await new Promise<EventSourceClient>((onMessage) => { | |
| const eventSource = createEventSource({ | |
| onConnect: () => { | |
| console.info('connected'); | |
| }, | |
| onDisconnect: () => { | |
| console.info('disconnected'); | |
| }, | |
| onMessage: () => { | |
| onMessage(eventSource); | |
| }, | |
| url: `http://127.0.0.1:${port}/sse`, | |
| }); | |
| }); | |
| expect(eventSource.readyState).toBe('open'); | |
| eventSource.close(); | |
| // We were getting unhandled error 'Not connected' | |
| // https://github.com/punkpeye/mcp-proxy/commit/62cf27d5e3dfcbc353e8d03c7714a62c37177b52 | |
| await delay(1000); | |
| await server.stop(); | |
| }); | |
| test("provides auth to tools", async () => { | |
| const port = await getRandomPort(); | |
| const authenticate = vi.fn(async () => { | |
| return { | |
| id: 1, | |
| }; | |
| }); | |
| const server = new FastMCP<{id: number}>({ | |
| name: "Test", | |
| version: "1.0.0", | |
| authenticate, | |
| }); | |
| const execute = vi.fn(async (args) => { | |
| return String(args.a + args.b); | |
| }); | |
| server.addTool({ | |
| name: "add", | |
| description: "Add two numbers", | |
| parameters: z.object({ | |
| a: z.number(), | |
| b: z.number(), | |
| }), | |
| execute, | |
| }); | |
| await server.start({ | |
| transportType: "sse", | |
| sse: { | |
| endpoint: "/sse", | |
| port, | |
| }, | |
| }); | |
| const client = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: {}, | |
| }, | |
| ); | |
| const transport = new SSEClientTransport( | |
| new URL(`http://localhost:${port}/sse`), | |
| { | |
| eventSourceInit: { | |
| fetch: async (url, init) => { | |
| return fetch(url, { | |
| ...init, | |
| headers: { | |
| ...init?.headers, | |
| "x-api-key": "123", | |
| }, | |
| }); | |
| }, | |
| }, | |
| }, | |
| ); | |
| await client.connect(transport); | |
| expect(authenticate, "authenticate should have been called").toHaveBeenCalledTimes(1); | |
| expect( | |
| await client.callTool({ | |
| name: "add", | |
| arguments: { | |
| a: 1, | |
| b: 2, | |
| }, | |
| }), | |
| ).toEqual({ | |
| content: [{ type: "text", text: "3" }], | |
| }); | |
| expect(execute, "execute should have been called").toHaveBeenCalledTimes(1); | |
| expect(execute).toHaveBeenCalledWith({ | |
| a: 1, | |
| b: 2, | |
| }, { | |
| log: { | |
| debug: expect.any(Function), | |
| error: expect.any(Function), | |
| info: expect.any(Function), | |
| warn: expect.any(Function), | |
| }, | |
| reportProgress: expect.any(Function), | |
| session: { id: 1 }, | |
| }); | |
| }); | |
| test("blocks unauthorized requests", async () => { | |
| const port = await getRandomPort(); | |
| const server = new FastMCP<{id: number}>({ | |
| name: "Test", | |
| version: "1.0.0", | |
| authenticate: async () => { | |
| throw new Response(null, { | |
| status: 401, | |
| statusText: "Unauthorized", | |
| }); | |
| }, | |
| }); | |
| await server.start({ | |
| transportType: "sse", | |
| sse: { | |
| endpoint: "/sse", | |
| port, | |
| }, | |
| }); | |
| const client = new Client( | |
| { | |
| name: "example-client", | |
| version: "1.0.0", | |
| }, | |
| { | |
| capabilities: {}, | |
| }, | |
| ); | |
| const transport = new SSEClientTransport( | |
| new URL(`http://localhost:${port}/sse`), | |
| ); | |
| expect(async () => { | |
| await client.connect(transport); | |
| }).rejects.toThrow("SSE error: Non-200 status code (401)"); | |
| }); | |
| ================================================ | |
| FILE: src/FastMCP.ts | |
| ================================================ | |
| import { Server } from "@modelcontextprotocol/sdk/server/index.js"; | |
| import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; | |
| import { | |
| AudioContent, | |
| CallToolRequestSchema, | |
| ClientCapabilities, | |
| CompleteRequestSchema, | |
| CreateMessageRequestSchema, | |
| ErrorCode, | |
| GetPromptRequestSchema, | |
| ListPromptsRequestSchema, | |
| ListResourcesRequestSchema, | |
| ListResourceTemplatesRequestSchema, | |
| ListToolsRequestSchema, | |
| McpError, | |
| ReadResourceRequestSchema, | |
| Root, | |
| RootsListChangedNotificationSchema, | |
| ServerCapabilities, | |
| SetLevelRequestSchema, | |
| } from "@modelcontextprotocol/sdk/types.js"; | |
| import { StandardSchemaV1 } from "@standard-schema/spec"; | |
| import { toJsonSchema } from "xsschema"; | |
| import { z } from "zod"; | |
| import { setTimeout as delay } from "timers/promises"; | |
| import { readFile } from "fs/promises"; | |
| import { fileTypeFromBuffer } from "file-type"; | |
| import { StrictEventEmitter } from "strict-event-emitter-types"; | |
| import { EventEmitter } from "events"; | |
| import Fuse from "fuse.js"; | |
| import { startSSEServer } from "mcp-proxy"; | |
| import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js"; | |
| import parseURITemplate from "uri-templates"; | |
| import http from "http"; | |
| import { | |
| fetch | |
| } from "undici"; | |
| export type SSEServer = { | |
| close: () => Promise<void>; | |
| }; | |
| type FastMCPEvents<T extends FastMCPSessionAuth> = { | |
| connect: (event: { session: FastMCPSession<T> }) => void; | |
| disconnect: (event: { session: FastMCPSession<T> }) => void; | |
| }; | |
| type FastMCPSessionEvents = { | |
| rootsChanged: (event: { roots: Root[] }) => void; | |
| error: (event: { error: Error }) => void; | |
| }; | |
| /** | |
| * Generates an image content object from a URL, file path, or buffer. | |
| */ | |
| export const imageContent = async ( | |
| input: { url: string } | { path: string } | { buffer: Buffer }, | |
| ): Promise<ImageContent> => { | |
| let rawData: Buffer; | |
| if ("url" in input) { | |
| const response = await fetch(input.url); | |
| if (!response.ok) { | |
| throw new Error(`Failed to fetch image from URL: ${response.statusText}`); | |
| } | |
| rawData = Buffer.from(await response.arrayBuffer()); | |
| } else if ("path" in input) { | |
| rawData = await readFile(input.path); | |
| } else if ("buffer" in input) { | |
| rawData = input.buffer; | |
| } else { | |
| throw new Error( | |
| "Invalid input: Provide a valid 'url', 'path', or 'buffer'", | |
| ); | |
| } | |
| const mimeType = await fileTypeFromBuffer(rawData); | |
| const base64Data = rawData.toString("base64"); | |
| return { | |
| type: "image", | |
| data: base64Data, | |
| mimeType: mimeType?.mime ?? "image/png", | |
| } as const; | |
| }; | |
| export const audioContent = async (input: { url: string } | { path: string } | { buffer: Buffer }): Promise<AudioContent> => { | |
| let rawData: Buffer; | |
| if ("url" in input) { | |
| const response = await fetch(input.url); | |
| if (!response.ok) { | |
| throw new Error(`Failed to fetch audio from URL: ${response.statusText}`); | |
| } | |
| rawData = Buffer.from(await response.arrayBuffer()); | |
| } else if ("path" in input) { | |
| rawData = await readFile(input.path); | |
| } else if ("buffer" in input) { | |
| rawData = input.buffer; | |
| } else { | |
| throw new Error("Invalid input: Provide a valid 'url', 'path', or 'buffer'"); | |
| } | |
| const mimeType = await fileTypeFromBuffer(rawData); | |
| const base64Data = rawData.toString("base64"); | |
| return { | |
| type: "audio", | |
| data: base64Data, | |
| mimeType: mimeType?.mime ?? "audio/mpeg", | |
| } as const; | |
| }; | |
| abstract class FastMCPError extends Error { | |
| public constructor(message?: string) { | |
| super(message); | |
| this.name = new.target.name; | |
| } | |
| } | |
| type Extra = unknown; | |
| type Extras = Record<string, Extra>; | |
| export class UnexpectedStateError extends FastMCPError { | |
| public extras?: Extras; | |
| public constructor(message: string, extras?: Extras) { | |
| super(message); | |
| this.name = new.target.name; | |
| this.extras = extras; | |
| } | |
| } | |
| /** | |
| * An error that is meant to be surfaced to the user. | |
| */ | |
| export class UserError extends UnexpectedStateError {} | |
| type ToolParameters = StandardSchemaV1; | |
| type Literal = boolean | null | number | string | undefined; | |
| type SerializableValue = | |
| | Literal | |
| | SerializableValue[] | |
| | { [key: string]: SerializableValue }; | |
| type Progress = { | |
| /** | |
| * The progress thus far. This should increase every time progress is made, even if the total is unknown. | |
| */ | |
| progress: number; | |
| /** | |
| * Total number of items to process (or total progress required), if known. | |
| */ | |
| total?: number; | |
| }; | |
| type Context<T extends FastMCPSessionAuth> = { | |
| session: T | undefined; | |
| reportProgress: (progress: Progress) => Promise<void>; | |
| log: { | |
| debug: (message: string, data?: SerializableValue) => void; | |
| error: (message: string, data?: SerializableValue) => void; | |
| info: (message: string, data?: SerializableValue) => void; | |
| warn: (message: string, data?: SerializableValue) => void; | |
| }; | |
| }; | |
| type TextContent = { | |
| type: "text"; | |
| text: string; | |
| }; | |
| const TextContentZodSchema = z | |
| .object({ | |
| type: z.literal("text"), | |
| /** | |
| * The text content of the message. | |
| */ | |
| text: z.string(), | |
| }) | |
| .strict() satisfies z.ZodType<TextContent>; | |
| type ImageContent = { | |
| type: "image"; | |
| data: string; | |
| mimeType: string; | |
| }; | |
| const ImageContentZodSchema = z | |
| .object({ | |
| type: z.literal("image"), | |
| /** | |
| * The base64-encoded image data. | |
| */ | |
| data: z.string().base64(), | |
| /** | |
| * The MIME type of the image. Different providers may support different image types. | |
| */ | |
| mimeType: z.string(), | |
| }) | |
| .strict() satisfies z.ZodType<ImageContent>; | |
| type Content = TextContent | ImageContent; | |
| const ContentZodSchema = z.discriminatedUnion("type", [ | |
| TextContentZodSchema, | |
| ImageContentZodSchema, | |
| ]) satisfies z.ZodType<Content>; | |
| type ContentResult = { | |
| content: Content[]; | |
| isError?: boolean; | |
| }; | |
| const ContentResultZodSchema = z | |
| .object({ | |
| content: ContentZodSchema.array(), | |
| isError: z.boolean().optional(), | |
| }) | |
| .strict() satisfies z.ZodType<ContentResult>; | |
| type Completion = { | |
| values: string[]; | |
| total?: number; | |
| hasMore?: boolean; | |
| }; | |
| /** | |
| * https://github.com/modelcontextprotocol/typescript-sdk/blob/3164da64d085ec4e022ae881329eee7b72f208d4/src/types.ts#L983-L1003 | |
| */ | |
| const CompletionZodSchema = z.object({ | |
| /** | |
| * An array of completion values. Must not exceed 100 items. | |
| */ | |
| values: z.array(z.string()).max(100), | |
| /** | |
| * The total number of completion options available. This can exceed the number of values actually sent in the response. | |
| */ | |
| total: z.optional(z.number().int()), | |
| /** | |
| * Indicates whether there are additional completion options beyond those provided in the current response, even if the exact total is unknown. | |
| */ | |
| hasMore: z.optional(z.boolean()), | |
| }) satisfies z.ZodType<Completion>; | |
| type Tool<T extends FastMCPSessionAuth, Params extends ToolParameters = ToolParameters> = { | |
| name: string; | |
| description?: string; | |
| parameters?: Params; | |
| execute: ( | |
| args: StandardSchemaV1.InferOutput<Params>, | |
| context: Context<T>, | |
| ) => Promise<string | ContentResult | TextContent | ImageContent | AudioContent>; | |
| }; | |
| type ResourceResult = | |
| | { | |
| text: string; | |
| } | |
| | { | |
| blob: string; | |
| }; | |
| type InputResourceTemplateArgument = Readonly<{ | |
| name: string; | |
| description?: string; | |
| complete?: ArgumentValueCompleter; | |
| }>; | |
| type ResourceTemplateArgument = Readonly<{ | |
| name: string; | |
| description?: string; | |
| complete?: ArgumentValueCompleter; | |
| }>; | |
| type ResourceTemplate< | |
| Arguments extends ResourceTemplateArgument[] = ResourceTemplateArgument[], | |
| > = { | |
| uriTemplate: string; | |
| name: string; | |
| description?: string; | |
| mimeType?: string; | |
| arguments: Arguments; | |
| complete?: (name: string, value: string) => Promise<Completion>; | |
| load: ( | |
| args: ResourceTemplateArgumentsToObject<Arguments>, | |
| ) => Promise<ResourceResult>; | |
| }; | |
| type ResourceTemplateArgumentsToObject<T extends { name: string }[]> = { | |
| [K in T[number]["name"]]: string; | |
| }; | |
| type InputResourceTemplate< | |
| Arguments extends ResourceTemplateArgument[] = ResourceTemplateArgument[], | |
| > = { | |
| uriTemplate: string; | |
| name: string; | |
| description?: string; | |
| mimeType?: string; | |
| arguments: Arguments; | |
| load: ( | |
| args: ResourceTemplateArgumentsToObject<Arguments>, | |
| ) => Promise<ResourceResult>; | |
| }; | |
| type Resource = { | |
| uri: string; | |
| name: string; | |
| description?: string; | |
| mimeType?: string; | |
| load: () => Promise<ResourceResult | ResourceResult[]>; | |
| complete?: (name: string, value: string) => Promise<Completion>; | |
| }; | |
| type ArgumentValueCompleter = (value: string) => Promise<Completion>; | |
| type InputPromptArgument = Readonly<{ | |
| name: string; | |
| description?: string; | |
| required?: boolean; | |
| complete?: ArgumentValueCompleter; | |
| enum?: string[]; | |
| }>; | |
| type PromptArgumentsToObject<T extends { name: string; required?: boolean }[]> = | |
| { | |
| [K in T[number]["name"]]: Extract< | |
| T[number], | |
| { name: K } | |
| >["required"] extends true | |
| ? string | |
| : string | undefined; | |
| }; | |
| type InputPrompt< | |
| Arguments extends InputPromptArgument[] = InputPromptArgument[], | |
| Args = PromptArgumentsToObject<Arguments>, | |
| > = { | |
| name: string; | |
| description?: string; | |
| arguments?: InputPromptArgument[]; | |
| load: (args: Args) => Promise<string>; | |
| }; | |
| type PromptArgument = Readonly<{ | |
| name: string; | |
| description?: string; | |
| required?: boolean; | |
| complete?: ArgumentValueCompleter; | |
| enum?: string[]; | |
| }>; | |
| type Prompt< | |
| Arguments extends PromptArgument[] = PromptArgument[], | |
| Args = PromptArgumentsToObject<Arguments>, | |
| > = { | |
| arguments?: PromptArgument[]; | |
| complete?: (name: string, value: string) => Promise<Completion>; | |
| description?: string; | |
| load: (args: Args) => Promise<string>; | |
| name: string; | |
| }; | |
| type ServerOptions<T extends FastMCPSessionAuth> = { | |
| name: string; | |
| version: `${number}.${number}.${number}`; | |
| authenticate?: Authenticate<T>; | |
| }; | |
| type LoggingLevel = | |
| | "debug" | |
| | "info" | |
| | "notice" | |
| | "warning" | |
| | "error" | |
| | "critical" | |
| | "alert" | |
| | "emergency"; | |
| const FastMCPSessionEventEmitterBase: { | |
| new (): StrictEventEmitter<EventEmitter, FastMCPSessionEvents>; | |
| } = EventEmitter; | |
| class FastMCPSessionEventEmitter extends FastMCPSessionEventEmitterBase {} | |
| type SamplingResponse = { | |
| model: string; | |
| stopReason?: "endTurn" | "stopSequence" | "maxTokens" | string; | |
| role: "user" | "assistant"; | |
| content: TextContent | ImageContent | AudioContent; | |
| }; | |
| type FastMCPSessionAuth = Record<string, unknown> | undefined; | |
| export class FastMCPSession<T extends FastMCPSessionAuth = FastMCPSessionAuth> extends FastMCPSessionEventEmitter { | |
| #capabilities: ServerCapabilities = {}; | |
| #clientCapabilities?: ClientCapabilities; | |
| #loggingLevel: LoggingLevel = "info"; | |
| #prompts: Prompt[] = []; | |
| #resources: Resource[] = []; | |
| #resourceTemplates: ResourceTemplate[] = []; | |
| #roots: Root[] = []; | |
| #server: Server; | |
| #auth: T | undefined; | |
| constructor({ | |
| auth, | |
| name, | |
| version, | |
| tools, | |
| resources, | |
| resourcesTemplates, | |
| prompts, | |
| }: { | |
| auth?: T; | |
| name: string; | |
| version: string; | |
| tools: Tool<T>[]; | |
| resources: Resource[]; | |
| resourcesTemplates: InputResourceTemplate[]; | |
| prompts: Prompt[]; | |
| }) { | |
| super(); | |
| this.#auth = auth; | |
| if (tools.length) { | |
| this.#capabilities.tools = {}; | |
| } | |
| if (resources.length || resourcesTemplates.length) { | |
| this.#capabilities.resources = {}; | |
| } | |
| if (prompts.length) { | |
| for (const prompt of prompts) { | |
| this.addPrompt(prompt); | |
| } | |
| this.#capabilities.prompts = {}; | |
| } | |
| this.#capabilities.logging = {}; | |
| this.#server = new Server( | |
| { name: name, version: version }, | |
| { capabilities: this.#capabilities }, | |
| ); | |
| this.setupErrorHandling(); | |
| this.setupLoggingHandlers(); | |
| this.setupRootsHandlers(); | |
| this.setupCompleteHandlers(); | |
| if (tools.length) { | |
| this.setupToolHandlers(tools); | |
| } | |
| if (resources.length || resourcesTemplates.length) { | |
| for (const resource of resources) { | |
| this.addResource(resource); | |
| } | |
| this.setupResourceHandlers(resources); | |
| if (resourcesTemplates.length) { | |
| for (const resourceTemplate of resourcesTemplates) { | |
| this.addResourceTemplate(resourceTemplate); | |
| } | |
| this.setupResourceTemplateHandlers(resourcesTemplates); | |
| } | |
| } | |
| if (prompts.length) { | |
| this.setupPromptHandlers(prompts); | |
| } | |
| } | |
| private addResource(inputResource: Resource) { | |
| this.#resources.push(inputResource); | |
| } | |
| private addResourceTemplate(inputResourceTemplate: InputResourceTemplate) { | |
| const completers: Record<string, ArgumentValueCompleter> = {}; | |
| for (const argument of inputResourceTemplate.arguments ?? []) { | |
| if (argument.complete) { | |
| completers[argument.name] = argument.complete; | |
| } | |
| } | |
| const resourceTemplate = { | |
| ...inputResourceTemplate, | |
| complete: async (name: string, value: string) => { | |
| if (completers[name]) { | |
| return await completers[name](value); | |
| } | |
| return { | |
| values: [], | |
| }; | |
| }, | |
| }; | |
| this.#resourceTemplates.push(resourceTemplate); | |
| } | |
| private addPrompt(inputPrompt: InputPrompt) { | |
| const completers: Record<string, ArgumentValueCompleter> = {}; | |
| const enums: Record<string, string[]> = {}; | |
| for (const argument of inputPrompt.arguments ?? []) { | |
| if (argument.complete) { | |
| completers[argument.name] = argument.complete; | |
| } | |
| if (argument.enum) { | |
| enums[argument.name] = argument.enum; | |
| } | |
| } | |
| const prompt = { | |
| ...inputPrompt, | |
| complete: async (name: string, value: string) => { | |
| if (completers[name]) { | |
| return await completers[name](value); | |
| } | |
| if (enums[name]) { | |
| const fuse = new Fuse(enums[name], { | |
| keys: ["value"], | |
| }); | |
| const result = fuse.search(value); | |
| return { | |
| values: result.map((item) => item.item), | |
| total: result.length, | |
| }; | |
| } | |
| return { | |
| values: [], | |
| }; | |
| }, | |
| }; | |
| this.#prompts.push(prompt); | |
| } | |
| public get clientCapabilities(): ClientCapabilities | null { | |
| return this.#clientCapabilities ?? null; | |
| } | |
| public get server(): Server { | |
| return this.#server; | |
| } | |
| #pingInterval: ReturnType<typeof setInterval> | null = null; | |
| public async requestSampling( | |
| message: z.infer<typeof CreateMessageRequestSchema>["params"], | |
| ): Promise<SamplingResponse> { | |
| return this.#server.createMessage(message); | |
| } | |
| public async connect(transport: Transport) { | |
| if (this.#server.transport) { | |
| throw new UnexpectedStateError("Server is already connected"); | |
| } | |
| await this.#server.connect(transport); | |
| let attempt = 0; | |
| while (attempt++ < 10) { | |
| const capabilities = await this.#server.getClientCapabilities(); | |
| if (capabilities) { | |
| this.#clientCapabilities = capabilities; | |
| break; | |
| } | |
| await delay(100); | |
| } | |
| if (!this.#clientCapabilities) { | |
| console.warn('[FastMCP warning] could not infer client capabilities') | |
| } | |
| if (this.#clientCapabilities?.roots?.listChanged) { | |
| try { | |
| const roots = await this.#server.listRoots(); | |
| this.#roots = roots.roots; | |
| } catch(e) { | |
| console.error(`[FastMCP error] received error listing roots.\n\n${e instanceof Error ? e.stack : JSON.stringify(e)}`) | |
| } | |
| } | |
| if (this.#clientCapabilities) { | |
| this.#pingInterval = setInterval(async () => { | |
| try { | |
| await this.#server.ping(); | |
| } catch { | |
| // The reason we are not emitting an error here is because some clients | |
| // seem to not respond to the ping request, and we don't want to crash the server, | |
| // e.g., https://github.com/punkpeye/fastmcp/issues/38. | |
| console.warn("[FastMCP warning] server is not responding to ping") | |
| } | |
| }, 1000); | |
| } | |
| } | |
| public get roots(): Root[] { | |
| return this.#roots; | |
| } | |
| public async close() { | |
| if (this.#pingInterval) { | |
| clearInterval(this.#pingInterval); | |
| } | |
| try { | |
| await this.#server.close(); | |
| } catch (error) { | |
| console.error("[FastMCP error]", "could not close server", error); | |
| } | |
| } | |
| private setupErrorHandling() { | |
| this.#server.onerror = (error) => { | |
| console.error("[FastMCP error]", error); | |
| }; | |
| } | |
| public get loggingLevel(): LoggingLevel { | |
| return this.#loggingLevel; | |
| } | |
| private setupCompleteHandlers() { | |
| this.#server.setRequestHandler(CompleteRequestSchema, async (request) => { | |
| if (request.params.ref.type === "ref/prompt") { | |
| const prompt = this.#prompts.find( | |
| (prompt) => prompt.name === request.params.ref.name, | |
| ); | |
| if (!prompt) { | |
| throw new UnexpectedStateError("Unknown prompt", { | |
| request, | |
| }); | |
| } | |
| if (!prompt.complete) { | |
| throw new UnexpectedStateError("Prompt does not support completion", { | |
| request, | |
| }); | |
| } | |
| const completion = CompletionZodSchema.parse( | |
| await prompt.complete( | |
| request.params.argument.name, | |
| request.params.argument.value, | |
| ), | |
| ); | |
| return { | |
| completion, | |
| }; | |
| } | |
| if (request.params.ref.type === "ref/resource") { | |
| const resource = this.#resourceTemplates.find( | |
| (resource) => resource.uriTemplate === request.params.ref.uri, | |
| ); | |
| if (!resource) { | |
| throw new UnexpectedStateError("Unknown resource", { | |
| request, | |
| }); | |
| } | |
| if (!("uriTemplate" in resource)) { | |
| throw new UnexpectedStateError("Unexpected resource"); | |
| } | |
| if (!resource.complete) { | |
| throw new UnexpectedStateError( | |
| "Resource does not support completion", | |
| { | |
| request, | |
| }, | |
| ); | |
| } | |
| const completion = CompletionZodSchema.parse( | |
| await resource.complete( | |
| request.params.argument.name, | |
| request.params.argument.value, | |
| ), | |
| ); | |
| return { | |
| completion, | |
| }; | |
| } | |
| throw new UnexpectedStateError("Unexpected completion request", { | |
| request, | |
| }); | |
| }); | |
| } | |
| private setupRootsHandlers() { | |
| this.#server.setNotificationHandler( | |
| RootsListChangedNotificationSchema, | |
| () => { | |
| this.#server.listRoots().then((roots) => { | |
| this.#roots = roots.roots; | |
| this.emit("rootsChanged", { | |
| roots: roots.roots, | |
| }); | |
| }); | |
| }, | |
| ); | |
| } | |
| private setupLoggingHandlers() { | |
| this.#server.setRequestHandler(SetLevelRequestSchema, (request) => { | |
| this.#loggingLevel = request.params.level; | |
| return {}; | |
| }); | |
| } | |
| private setupToolHandlers(tools: Tool<T>[]) { | |
| this.#server.setRequestHandler(ListToolsRequestSchema, async () => { | |
| return { | |
| tools: await Promise.all(tools.map(async (tool) => { | |
| return { | |
| name: tool.name, | |
| description: tool.description, | |
| inputSchema: tool.parameters | |
| ? await toJsonSchema(tool.parameters) | |
| : undefined, | |
| }; | |
| })), | |
| }; | |
| }); | |
| this.#server.setRequestHandler(CallToolRequestSchema, async (request) => { | |
| const tool = tools.find((tool) => tool.name === request.params.name); | |
| if (!tool) { | |
| throw new McpError( | |
| ErrorCode.MethodNotFound, | |
| `Unknown tool: ${request.params.name}`, | |
| ); | |
| } | |
| let args: any = undefined; | |
| if (tool.parameters) { | |
| const parsed = await tool.parameters["~standard"].validate( | |
| request.params.arguments | |
| ); | |
| if (parsed.issues) { | |
| throw new McpError( | |
| ErrorCode.InvalidParams, | |
| `Invalid ${request.params.name} parameters`, | |
| ); | |
| } | |
| args = parsed.value; | |
| } | |
| const progressToken = request.params?._meta?.progressToken; | |
| let result: ContentResult; | |
| try { | |
| const reportProgress = async (progress: Progress) => { | |
| await this.#server.notification({ | |
| method: "notifications/progress", | |
| params: { | |
| ...progress, | |
| progressToken, | |
| }, | |
| }); | |
| }; | |
| const log = { | |
| debug: (message: string, context?: SerializableValue) => { | |
| this.#server.sendLoggingMessage({ | |
| level: "debug", | |
| data: { | |
| message, | |
| context, | |
| }, | |
| }); | |
| }, | |
| error: (message: string, context?: SerializableValue) => { | |
| this.#server.sendLoggingMessage({ | |
| level: "error", | |
| data: { | |
| message, | |
| context, | |
| }, | |
| }); | |
| }, | |
| info: (message: string, context?: SerializableValue) => { | |
| this.#server.sendLoggingMessage({ | |
| level: "info", | |
| data: { | |
| message, | |
| context, | |
| }, | |
| }); | |
| }, | |
| warn: (message: string, context?: SerializableValue) => { | |
| this.#server.sendLoggingMessage({ | |
| level: "warning", | |
| data: { | |
| message, | |
| context, | |
| }, | |
| }); | |
| }, | |
| }; | |
| const maybeStringResult = await tool.execute(args, { | |
| reportProgress, | |
| log, | |
| session: this.#auth, | |
| }); | |
| if (typeof maybeStringResult === "string") { | |
| result = ContentResultZodSchema.parse({ | |
| content: [{ type: "text", text: maybeStringResult }], | |
| }); | |
| } else if ("type" in maybeStringResult) { | |
| result = ContentResultZodSchema.parse({ | |
| content: [maybeStringResult], | |
| }); | |
| } else { | |
| result = ContentResultZodSchema.parse(maybeStringResult); | |
| } | |
| } catch (error) { | |
| if (error instanceof UserError) { | |
| return { | |
| content: [{ type: "text", text: error.message }], | |
| isError: true, | |
| }; | |
| } | |
| return { | |
| content: [{ type: "text", text: `Error: ${error}` }], | |
| isError: true, | |
| }; | |
| } | |
| return result; | |
| }); | |
| } | |
| private setupResourceHandlers(resources: Resource[]) { | |
| this.#server.setRequestHandler(ListResourcesRequestSchema, async () => { | |
| return { | |
| resources: resources.map((resource) => { | |
| return { | |
| uri: resource.uri, | |
| name: resource.name, | |
| mimeType: resource.mimeType, | |
| }; | |
| }), | |
| }; | |
| }); | |
| this.#server.setRequestHandler( | |
| ReadResourceRequestSchema, | |
| async (request) => { | |
| if ("uri" in request.params) { | |
| const resource = resources.find( | |
| (resource) => | |
| "uri" in resource && resource.uri === request.params.uri, | |
| ); | |
| if (!resource) { | |
| for (const resourceTemplate of this.#resourceTemplates) { | |
| const uriTemplate = parseURITemplate( | |
| resourceTemplate.uriTemplate, | |
| ); | |
| const match = uriTemplate.fromUri(request.params.uri); | |
| if (!match) { | |
| continue; | |
| } | |
| const uri = uriTemplate.fill(match); | |
| const result = await resourceTemplate.load(match); | |
| return { | |
| contents: [ | |
| { | |
| uri: uri, | |
| mimeType: resourceTemplate.mimeType, | |
| name: resourceTemplate.name, | |
| ...result, | |
| }, | |
| ], | |
| }; | |
| } | |
| throw new McpError( | |
| ErrorCode.MethodNotFound, | |
| `Unknown resource: ${request.params.uri}`, | |
| ); | |
| } | |
| if (!("uri" in resource)) { | |
| throw new UnexpectedStateError("Resource does not support reading"); | |
| } | |
| let maybeArrayResult: Awaited<ReturnType<Resource["load"]>>; | |
| try { | |
| maybeArrayResult = await resource.load(); | |
| } catch (error) { | |
| throw new McpError( | |
| ErrorCode.InternalError, | |
| `Error reading resource: ${error}`, | |
| { | |
| uri: resource.uri, | |
| }, | |
| ); | |
| } | |
| if (Array.isArray(maybeArrayResult)) { | |
| return { | |
| contents: maybeArrayResult.map((result) => ({ | |
| uri: resource.uri, | |
| mimeType: resource.mimeType, | |
| name: resource.name, | |
| ...result, | |
| })), | |
| }; | |
| } else { | |
| return { | |
| contents: [ | |
| { | |
| uri: resource.uri, | |
| mimeType: resource.mimeType, | |
| name: resource.name, | |
| ...maybeArrayResult, | |
| }, | |
| ], | |
| }; | |
| } | |
| } | |
| throw new UnexpectedStateError("Unknown resource request", { | |
| request, | |
| }); | |
| }, | |
| ); | |
| } | |
| private setupResourceTemplateHandlers(resourceTemplates: ResourceTemplate[]) { | |
| this.#server.setRequestHandler( | |
| ListResourceTemplatesRequestSchema, | |
| async () => { | |
| return { | |
| resourceTemplates: resourceTemplates.map((resourceTemplate) => { | |
| return { | |
| name: resourceTemplate.name, | |
| uriTemplate: resourceTemplate.uriTemplate, | |
| }; | |
| }), | |
| }; | |
| }, | |
| ); | |
| } | |
| private setupPromptHandlers(prompts: Prompt[]) { | |
| this.#server.setRequestHandler(ListPromptsRequestSchema, async () => { | |
| return { | |
| prompts: prompts.map((prompt) => { | |
| return { | |
| name: prompt.name, | |
| description: prompt.description, | |
| arguments: prompt.arguments, | |
| complete: prompt.complete, | |
| }; | |
| }), | |
| }; | |
| }); | |
| this.#server.setRequestHandler(GetPromptRequestSchema, async (request) => { | |
| const prompt = prompts.find( | |
| (prompt) => prompt.name === request.params.name, | |
| ); | |
| if (!prompt) { | |
| throw new McpError( | |
| ErrorCode.MethodNotFound, | |
| `Unknown prompt: ${request.params.name}`, | |
| ); | |
| } | |
| const args = request.params.arguments; | |
| for (const arg of prompt.arguments ?? []) { | |
| if (arg.required && !(args && arg.name in args)) { | |
| throw new McpError( | |
| ErrorCode.InvalidRequest, | |
| `Missing required argument: ${arg.name}`, | |
| ); | |
| } | |
| } | |
| let result: Awaited<ReturnType<Prompt["load"]>>; | |
| try { | |
| result = await prompt.load(args as Record<string, string | undefined>); | |
| } catch (error) { | |
| throw new McpError( | |
| ErrorCode.InternalError, | |
| `Error loading prompt: ${error}`, | |
| ); | |
| } | |
| return { | |
| description: prompt.description, | |
| messages: [ | |
| { | |
| role: "user", | |
| content: { type: "text", text: result }, | |
| }, | |
| ], | |
| }; | |
| }); | |
| } | |
| } | |
| const FastMCPEventEmitterBase: { | |
| new (): StrictEventEmitter<EventEmitter, FastMCPEvents<FastMCPSessionAuth>>; | |
| } = EventEmitter; | |
| class FastMCPEventEmitter extends FastMCPEventEmitterBase {} | |
| type Authenticate<T> = (request: http.IncomingMessage) => Promise<T>; | |
| export class FastMCP<T extends Record<string, unknown> | undefined = undefined> extends FastMCPEventEmitter { | |
| #options: ServerOptions<T>; | |
| #prompts: InputPrompt[] = []; | |
| #resources: Resource[] = []; | |
| #resourcesTemplates: InputResourceTemplate[] = []; | |
| #sessions: FastMCPSession<T>[] = []; | |
| #sseServer: SSEServer | null = null; | |
| #tools: Tool<T>[] = []; | |
| #authenticate: Authenticate<T> | undefined; | |
| constructor(public options: ServerOptions<T>) { | |
| super(); | |
| this.#options = options; | |
| this.#authenticate = options.authenticate; | |
| } | |
| public get sessions(): FastMCPSession<T>[] { | |
| return this.#sessions; | |
| } | |
| /** | |
| * Adds a tool to the server. | |
| */ | |
| public addTool<Params extends ToolParameters>(tool: Tool<T, Params>) { | |
| this.#tools.push(tool as unknown as Tool<T>); | |
| } | |
| /** | |
| * Adds a resource to the server. | |
| */ | |
| public addResource(resource: Resource) { | |
| this.#resources.push(resource); | |
| } | |
| /** | |
| * Adds a resource template to the server. | |
| */ | |
| public addResourceTemplate< | |
| const Args extends InputResourceTemplateArgument[], | |
| >(resource: InputResourceTemplate<Args>) { | |
| this.#resourcesTemplates.push(resource); | |
| } | |
| /** | |
| * Adds a prompt to the server. | |
| */ | |
| public addPrompt<const Args extends InputPromptArgument[]>( | |
| prompt: InputPrompt<Args>, | |
| ) { | |
| this.#prompts.push(prompt); | |
| } | |
| /** | |
| * Starts the server. | |
| */ | |
| public async start( | |
| options: | |
| | { transportType: "stdio" } | |
| | { | |
| transportType: "sse"; | |
| sse: { endpoint: `/${string}`; port: number }; | |
| } = { | |
| transportType: "stdio", | |
| }, | |
| ) { | |
| if (options.transportType === "stdio") { | |
| const transport = new StdioServerTransport(); | |
| const session = new FastMCPSession<T>({ | |
| name: this.#options.name, | |
| version: this.#options.version, | |
| tools: this.#tools, | |
| resources: this.#resources, | |
| resourcesTemplates: this.#resourcesTemplates, | |
| prompts: this.#prompts, | |
| }); | |
| await session.connect(transport); | |
| this.#sessions.push(session); | |
| this.emit("connect", { | |
| session, | |
| }); | |
| } else if (options.transportType === "sse") { | |
| this.#sseServer = await startSSEServer<FastMCPSession<T>>({ | |
| endpoint: options.sse.endpoint as `/${string}`, | |
| port: options.sse.port, | |
| createServer: async (request) => { | |
| let auth: T | undefined; | |
| if (this.#authenticate) { | |
| auth = await this.#authenticate(request); | |
| } | |
| return new FastMCPSession<T>({ | |
| auth, | |
| name: this.#options.name, | |
| version: this.#options.version, | |
| tools: this.#tools, | |
| resources: this.#resources, | |
| resourcesTemplates: this.#resourcesTemplates, | |
| prompts: this.#prompts, | |
| }); | |
| }, | |
| onClose: (session) => { | |
| this.emit("disconnect", { | |
| session, | |
| }); | |
| }, | |
| onConnect: async (session) => { | |
| this.#sessions.push(session); | |
| this.emit("connect", { | |
| session, | |
| }); | |
| }, | |
| }); | |
| console.info( | |
| `[FastMCP info] server is running on SSE at http://localhost:${options.sse.port}${options.sse.endpoint}`, | |
| ); | |
| } else { | |
| throw new Error("Invalid transport type"); | |
| } | |
| } | |
| /** | |
| * Stops the server. | |
| */ | |
| public async stop() { | |
| if (this.#sseServer) { | |
| this.#sseServer.close(); | |
| } | |
| } | |
| } | |
| export type { Context }; | |
| export type { Tool, ToolParameters }; | |
| export type { Content, TextContent, ImageContent, ContentResult }; | |
| export type { Progress, SerializableValue }; | |
| export type { Resource, ResourceResult }; | |
| export type { ResourceTemplate, ResourceTemplateArgument }; | |
| export type { Prompt, PromptArgument }; | |
| export type { InputPrompt, InputPromptArgument }; | |
| export type { ServerOptions, LoggingLevel }; | |
| export type { FastMCPEvents, FastMCPSessionEvents }; | |
| ================================================ | |
| FILE: src/bin/fastmcp.ts | |
| ================================================ | |
| #!/usr/bin/env node | |
| import yargs from "yargs"; | |
| import { hideBin } from "yargs/helpers"; | |
| import { execa } from "execa"; | |
| await yargs(hideBin(process.argv)) | |
| .scriptName("fastmcp") | |
| .command( | |
| "dev <file>", | |
| "Start a development server", | |
| (yargs) => { | |
| return yargs.positional("file", { | |
| type: "string", | |
| describe: "The path to the server file", | |
| demandOption: true, | |
| }); | |
| }, | |
| async (argv) => { | |
| try { | |
| await execa({ | |
| stdin: "inherit", | |
| stdout: "inherit", | |
| stderr: "inherit", | |
| })`npx @wong2/mcp-cli npx tsx ${argv.file}`; | |
| } catch { | |
| process.exit(1); | |
| } | |
| }, | |
| ) | |
| .command( | |
| "inspect <file>", | |
| "Inspect a server file", | |
| (yargs) => { | |
| return yargs.positional("file", { | |
| type: "string", | |
| describe: "The path to the server file", | |
| demandOption: true, | |
| }); | |
| }, | |
| async (argv) => { | |
| try { | |
| await execa({ | |
| stdout: "inherit", | |
| stderr: "inherit", | |
| })`npx @modelcontextprotocol/inspector npx tsx ${argv.file}`; | |
| } catch { | |
| process.exit(1); | |
| } | |
| }, | |
| ) | |
| .help() | |
| .parseAsync(); | |
| ================================================ | |
| FILE: src/examples/addition.ts | |
| ================================================ | |
| /** | |
| * This is a complete example of an MCP server. | |
| */ | |
| import { FastMCP } from "../FastMCP.js"; | |
| import { z } from "zod"; | |
| import { type } from "arktype"; | |
| import * as v from "valibot"; | |
| const server = new FastMCP({ | |
| name: "Addition", | |
| version: "1.0.0", | |
| }); | |
| // --- Zod Example --- | |
| const AddParamsZod = z.object({ | |
| a: z.number().describe("The first number"), | |
| b: z.number().describe("The second number"), | |
| }); | |
| server.addTool({ | |
| name: "add-zod", | |
| description: "Add two numbers (using Zod schema)", | |
| parameters: AddParamsZod, | |
| execute: async (args) => { | |
| // args is typed as { a: number, b: number } | |
| console.log(`[Zod] Adding ${args.a} and ${args.b}`); | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| // --- ArkType Example --- | |
| const AddParamsArkType = type({ | |
| a: "number", | |
| b: "number", | |
| }); | |
| server.addTool({ | |
| name: "add-arktype", | |
| description: "Add two numbers (using ArkType schema)", | |
| parameters: AddParamsArkType, | |
| execute: async (args) => { | |
| // args is typed as { a: number, b: number } based on AddParamsArkType.infer | |
| console.log(`[ArkType] Adding ${args.a} and ${args.b}`); | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| // --- Valibot Example --- | |
| const AddParamsValibot = v.object({ | |
| a: v.number("The first number"), | |
| b: v.number("The second number"), | |
| }); | |
| server.addTool({ | |
| name: "add-valibot", | |
| description: "Add two numbers (using Valibot schema)", | |
| parameters: AddParamsValibot, | |
| execute: async (args) => { | |
| console.log(`[Valibot] Adding ${args.a} and ${args.b}`); | |
| return String(args.a + args.b); | |
| }, | |
| }); | |
| server.addResource({ | |
| uri: "file:///logs/app.log", | |
| name: "Application Logs", | |
| mimeType: "text/plain", | |
| async load() { | |
| return { | |
| text: "Example log content", | |
| }; | |
| }, | |
| }); | |
| server.addPrompt({ | |
| name: "git-commit", | |
| description: "Generate a Git commit message", | |
| arguments: [ | |
| { | |
| name: "changes", | |
| description: "Git diff or description of changes", | |
| required: true, | |
| }, | |
| ], | |
| load: async (args) => { | |
| return `Generate a concise but descriptive commit message for these changes:\n\n${args.changes}`; | |
| }, | |
| }); | |
| server.start({ | |
| transportType: "stdio", | |
| }); | |
| ================================================ | |
| FILE: .github/workflows/feature.yaml | |
| ================================================ | |
| name: Run Tests | |
| on: | |
| pull_request: | |
| branches: | |
| - main | |
| types: | |
| - opened | |
| - synchronize | |
| - reopened | |
| - ready_for_review | |
| jobs: | |
| test: | |
| runs-on: ubuntu-latest | |
| name: Test | |
| strategy: | |
| fail-fast: true | |
| matrix: | |
| node: | |
| - 22 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - uses: pnpm/action-setup@v4 | |
| with: | |
| version: 9 | |
| - name: Setup NodeJS ${{ matrix.node }} | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| cache: "pnpm" | |
| cache-dependency-path: "**/pnpm-lock.yaml" | |
| - name: Install dependencies | |
| run: pnpm install | |
| - name: Run tests | |
| run: pnpm test | |
| ================================================ | |
| FILE: .github/workflows/main.yaml | |
| ================================================ | |
| name: Release | |
| on: | |
| push: | |
| branches: | |
| - main | |
| jobs: | |
| test: | |
| environment: release | |
| name: Test | |
| strategy: | |
| fail-fast: true | |
| matrix: | |
| node: | |
| - 22 | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| id-token: write | |
| steps: | |
| - name: setup repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - uses: pnpm/action-setup@v4 | |
| with: | |
| version: 9 | |
| - name: setup node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| cache: "pnpm" | |
| node-version: ${{ matrix.node }} | |
| - name: Setup NodeJS ${{ matrix.node }} | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| cache: "pnpm" | |
| cache-dependency-path: "**/pnpm-lock.yaml" | |
| - name: Install dependencies | |
| run: pnpm install | |
| - name: Run tests | |
| run: pnpm test | |
| - name: Build | |
| run: pnpm build | |
| - name: Release | |
| run: pnpm semantic-release | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| NPM_TOKEN: ${{ secrets.NPM_TOKEN }} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment