diff --git a/README.md b/README.md
index b0f2c8f4..7845de6e 100644
--- a/README.md
+++ b/README.md
@@ -32,6 +32,7 @@
| [copy](js-plugins/copy) | Copy files and folders Inspired by [rollup-plugin-copy](https://github.com/vladshcherbin/rollup-plugin-copy) |
| | |
| [vuetify](js-plugins/vuetify) | Plugin for [Vuetify](https://vuetifyjs.com/) |
+| [mcp](js-plugins/mcp) | Farm plugin mcp inspired by [nuxt-mcp](https://github.com/antfu/nuxt-mcp) |
## Contributors ✨
diff --git a/examples/mcp/README.md b/examples/mcp/README.md
new file mode 100644
index 00000000..5802e857
--- /dev/null
+++ b/examples/mcp/README.md
@@ -0,0 +1,37 @@
+# Farm + React
+
+This template should help you start developing using React and TypeScript in Farm.
+
+## Setup
+
+Install the dependencies:
+
+```bash
+pnpm install
+```
+
+## Get Started
+
+Start the dev server:
+
+```bash
+pnpm start
+```
+
+Build the app for production:
+
+```bash
+pnpm build
+```
+
+Preview the Production build product:
+
+```bash
+pnpm preview
+```
+
+Clear persistent cache local files
+
+```bash
+pnpm clean
+```
diff --git a/examples/mcp/farm.config.ts b/examples/mcp/farm.config.ts
new file mode 100644
index 00000000..6b8d15a7
--- /dev/null
+++ b/examples/mcp/farm.config.ts
@@ -0,0 +1,16 @@
+import { defineConfig } from "@farmfe/core";
+import farmPluginMcp from "@farmfe/plugin-mcp"
+
+export default defineConfig({
+ compilation: {
+ input: {
+ index: "./index.html",
+ },
+ persistentCache: false,
+ progress: false,
+ },
+ plugins: [
+ ["@farmfe/plugin-react", { runtime: "automatic" }],
+ farmPluginMcp({})
+ ],
+});
diff --git a/examples/mcp/index.html b/examples/mcp/index.html
new file mode 100644
index 00000000..737db97b
--- /dev/null
+++ b/examples/mcp/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+ Farm + React + TS
+
+
+
+
+
+
diff --git a/examples/mcp/index.js b/examples/mcp/index.js
new file mode 100644
index 00000000..065718f5
--- /dev/null
+++ b/examples/mcp/index.js
@@ -0,0 +1 @@
+console.log("lib")
diff --git a/examples/mcp/package.json b/examples/mcp/package.json
new file mode 100644
index 00000000..bc5c354b
--- /dev/null
+++ b/examples/mcp/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "playground",
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "farm start",
+ "start": "farm start",
+ "build": "farm build",
+ "preview": "farm preview",
+ "clean": "farm clean"
+ },
+ "dependencies": {
+ "clsx": "^1.2.1",
+ "react": "18",
+ "react-dom": "18",
+ "@farmfe/plugin-mcp": "workspace:*"
+ },
+ "devDependencies": {
+ "@farmfe/cli": "^1.0.0",
+ "@farmfe/core": "^1.0.22",
+ "@farmfe/plugin-react": "^1.0.1",
+ "@types/react": "18",
+ "core-js": "^3.36.1",
+ "@types/react-dom": "18",
+ "react-refresh": "^0.14.0"
+ }
+}
\ No newline at end of file
diff --git a/examples/mcp/public/favicon.ico b/examples/mcp/public/favicon.ico
new file mode 100644
index 00000000..80465ded
Binary files /dev/null and b/examples/mcp/public/favicon.ico differ
diff --git a/examples/mcp/src/assets/logo.png b/examples/mcp/src/assets/logo.png
new file mode 100644
index 00000000..0caeb438
Binary files /dev/null and b/examples/mcp/src/assets/logo.png differ
diff --git a/examples/mcp/src/assets/react.svg b/examples/mcp/src/assets/react.svg
new file mode 100644
index 00000000..6c87de9b
--- /dev/null
+++ b/examples/mcp/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/examples/mcp/src/index.css b/examples/mcp/src/index.css
new file mode 100644
index 00000000..6cc4daf9
--- /dev/null
+++ b/examples/mcp/src/index.css
@@ -0,0 +1,69 @@
+:root {
+ font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ font-weight: 500;
+ color: #9f1a8f;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #9f1a8f;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #9f1a8f;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #9F1A8F;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/examples/mcp/src/index.tsx b/examples/mcp/src/index.tsx
new file mode 100644
index 00000000..06a4dd2d
--- /dev/null
+++ b/examples/mcp/src/index.tsx
@@ -0,0 +1,10 @@
+import React from 'react';
+import { createRoot } from 'react-dom/client';
+import { Main } from './main';
+import './index.css'
+
+
+const container = document.querySelector('#root');
+const root = createRoot(container);
+
+root.render();
diff --git a/examples/mcp/src/main.css b/examples/mcp/src/main.css
new file mode 100644
index 00000000..ff29d412
--- /dev/null
+++ b/examples/mcp/src/main.css
@@ -0,0 +1,42 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+ transition: filter 300ms;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #9F1A8Faa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/examples/mcp/src/main.tsx b/examples/mcp/src/main.tsx
new file mode 100644
index 00000000..67c183c5
--- /dev/null
+++ b/examples/mcp/src/main.tsx
@@ -0,0 +1,32 @@
+import React, { useState } from "react";
+import "./main.css";
+import reactLogo from "./assets/react.svg";
+import FarmLogo from "./assets/logo.png";
+export function Main() {
+ const [count, setCount] = useState(0);
+ console.log("rendering Main component")
+ return (
+ <>
+
+ Farm + React
+
+
+
+ Edit src/main.tsx and save to test HMR
+
+
+
+ Click on the Farm and React logos to learn more
+
+ >
+ );
+}
diff --git a/examples/mcp/src/typings.d.ts b/examples/mcp/src/typings.d.ts
new file mode 100644
index 00000000..fa0a2da5
--- /dev/null
+++ b/examples/mcp/src/typings.d.ts
@@ -0,0 +1,3 @@
+declare module '*.svg';
+declare module '*.png';
+declare module '*.css';
diff --git a/examples/mcp/tsconfig.json b/examples/mcp/tsconfig.json
new file mode 100644
index 00000000..7a7611e4
--- /dev/null
+++ b/examples/mcp/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
\ No newline at end of file
diff --git a/examples/mcp/tsconfig.node.json b/examples/mcp/tsconfig.node.json
new file mode 100644
index 00000000..8d423251
--- /dev/null
+++ b/examples/mcp/tsconfig.node.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true,
+ "strict": true
+ },
+ "include": ["farm.config.ts"]
+}
diff --git a/js-plugins/mcp/.gitignore b/js-plugins/mcp/.gitignore
new file mode 100644
index 00000000..d9c2bd2a
--- /dev/null
+++ b/js-plugins/mcp/.gitignore
@@ -0,0 +1,198 @@
+# Created by https://www.toptal.com/developers/gitignore/api/node
+# Edit at https://www.toptal.com/developers/gitignore?templates=node
+
+### Node ###
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# TypeScript v1 declaration files
+typings/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+
+# Next.js build output
+.next
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# End of https://www.toptal.com/developers/gitignore/api/node
+
+# Created by https://www.toptal.com/developers/gitignore/api/macos
+# Edit at https://www.toptal.com/developers/gitignore?templates=macos
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### macOS Patch ###
+# iCloud generated files
+*.icloud
+
+# End of https://www.toptal.com/developers/gitignore/api/macos
+
+# Created by https://www.toptal.com/developers/gitignore/api/windows
+# Edit at https://www.toptal.com/developers/gitignore?templates=windows
+
+### Windows ###
+# Windows thumbnail cache files
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+# End of https://www.toptal.com/developers/gitignore/api/windows
+
+#Added by cargo
+
+/target
+Cargo.lock
+
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/sdks
+!.yarn/versions
+
+*.farm
+build
\ No newline at end of file
diff --git a/js-plugins/mcp/farm.config.ts b/js-plugins/mcp/farm.config.ts
new file mode 100644
index 00000000..f40c99d7
--- /dev/null
+++ b/js-plugins/mcp/farm.config.ts
@@ -0,0 +1,41 @@
+import { defineConfig } from '@farmfe/core';
+import farmDtsPlugin from '@farmfe/js-plugin-dts';
+
+const format = (process.env.FARM_FORMAT as 'esm' | 'cjs') || 'esm';
+const ext = format === 'esm' ? 'mjs' : 'cjs';
+
+export default defineConfig({
+ compilation: {
+ input: {
+ index: './src/index.ts'
+ },
+ output: {
+ path: `build/${format}`,
+ entryFilename: `[entryName].${ext}`,
+ targetEnv: 'node',
+ format
+ },
+ partialBundling: {
+ enforceResources: [
+ {
+ name: 'index',
+ test: ['.+']
+ }
+ ]
+ },
+ minify: false,
+ sourcemap: false,
+ presetEnv: false,
+ persistentCache: {
+ envs: {
+ FARM_FORMAT: format
+ }
+ }
+ },
+ server: {
+ hmr: false
+ },
+ plugins: [
+ farmDtsPlugin()
+ ]
+});
\ No newline at end of file
diff --git a/js-plugins/mcp/package.json b/js-plugins/mcp/package.json
new file mode 100644
index 00000000..584385f9
--- /dev/null
+++ b/js-plugins/mcp/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "@farmfe/plugin-mcp",
+ "version": "0.0.0",
+ "description": "",
+ "main": "./build/cjs/index.cjs",
+ "types": "./build/esm/index.d.ts",
+ "type": "module",
+ "exports": {
+ ".": {
+ "default": "./build/esm/index.mjs",
+ "require": "./build/cjs/index.cjs",
+ "import": "./build/esm/index.mjs",
+ "types": "./build/esm/index.d.ts"
+ }
+ },
+ "scripts": {
+ "build:cjs": "cross-env FARM_FORMAT=cjs farm build",
+ "build": "farm build && npm run build:cjs",
+ "start": "farm watch",
+ "dev": "farm watch",
+ "prepublishOnly": "npm run build"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "@modelcontextprotocol/sdk": "^1.9.0",
+ "zod": "^3.24.2"
+ },
+ "devDependencies": {
+ "@farmfe/cli": "^1.0.4",
+ "@farmfe/core": "^1.7.2",
+ "@farmfe/js-plugin-dts": "^0.5.1",
+ "@types/node": "^18.19.67",
+ "cross-env": "^7.0.3",
+ "@types/koa": "^2.13.4"
+ },
+ "files": [
+ "build"
+ ]
+}
diff --git a/js-plugins/mcp/src/connect.ts b/js-plugins/mcp/src/connect.ts
new file mode 100644
index 00000000..ed5a3fde
--- /dev/null
+++ b/js-plugins/mcp/src/connect.ts
@@ -0,0 +1,58 @@
+import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
+import type { Server } from '@farmfe/core'
+import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js'
+import { Context, Next } from "koa"
+
+
+export async function setupRoutes(base: string, mcpServer: McpServer, farmServer: Server): Promise {
+ const transports = new Map()
+
+ farmServer.applyMiddlewares([() => {
+
+ return async (ctx: Context, next: Next) => {
+ if (!ctx.url.includes(`${base}/sse`)) {
+ return next()
+ }
+ const transport = new SSEServerTransport(`${base}/messages`, ctx.res);
+ transports.set(transport.sessionId, transport);
+ ctx.res.on('close', () => {
+ transports.delete(transport.sessionId);
+ });
+ await mcpServer.connect(transport)
+ }
+
+ }])
+
+ farmServer.applyMiddlewares([() => {
+ return async (ctx: Context, next: Next) => {
+ if (!ctx.url?.includes(`${base}/messages`)) {
+ return next()
+ }
+ if (ctx.method !== 'POST') {
+ ctx.status = 405
+ ctx.body = 'Method Not Allowed'
+ return
+ }
+
+ const query = new URLSearchParams(ctx.url?.split('?').pop() || '')
+ const clientId = query.get('sessionId')
+
+ if (!clientId || typeof clientId !== 'string') {
+ ctx.status = 400
+ ctx.body = 'Bad Request'
+ return
+ }
+
+ const transport = transports.get(clientId)
+ if (!transport) {
+ ctx.status = 404
+ ctx.body = 'Not Found'
+ return
+ }
+
+ await transport.handlePostMessage(ctx.req, ctx.res)
+ next()
+ }
+ }])
+
+}
\ No newline at end of file
diff --git a/js-plugins/mcp/src/index.ts b/js-plugins/mcp/src/index.ts
new file mode 100644
index 00000000..17922ddf
--- /dev/null
+++ b/js-plugins/mcp/src/index.ts
@@ -0,0 +1,79 @@
+import type { JsPlugin, ResolvedUserConfig } from '@farmfe/core';
+import { FarmMcpOptions } from './types.js';
+import { setupRoutes } from './connect.js';
+import { createMcpDefaultServer } from "./server.js"
+import { searchForWorkspaceRoot } from "./search-root.js"
+import p from "picocolors"
+import fs from 'fs/promises';
+import { existsSync } from 'fs';
+import { join } from 'path';
+
+
+export default function farmPluginMcp(options: FarmMcpOptions): JsPlugin {
+ const {
+ mcpPath = '/__mcp',
+ updateCursorMcpJson = true,
+ updateVSCodeMcpJson = true,
+ printUrl = true,
+ } = options
+ const cursorMcpOptions = typeof updateCursorMcpJson == 'boolean'
+ ? { enabled: updateCursorMcpJson }
+ : updateCursorMcpJson
+
+ const vscodeMcpOptions = typeof updateVSCodeMcpJson == 'boolean'
+ ? { enabled: updateVSCodeMcpJson }
+ : updateVSCodeMcpJson
+ let farmConfig: ResolvedUserConfig = {}
+ return {
+ name: 'mcp',
+ configResolved(config) {
+ config = config
+ },
+ async configureDevServer(server) {
+ const compiler = server.getCompiler();
+ let mcp = await createMcpDefaultServer(options, compiler);
+ mcp = await options.mcpServerSetup?.(mcp, compiler) || mcp;
+ setupRoutes(mcpPath || '/__mcp', mcp, server);
+
+ // const config =
+ const port = server.config.port;
+ const protocol = server.config.https ? 'https' : 'http'
+ const sseUrl = `${protocol}://${options.host || 'localhost'}:${options.port || port}${mcpPath}/sse`
+
+
+ const root = searchForWorkspaceRoot(farmConfig.root ?? process.cwd());
+ if (cursorMcpOptions.enabled) {
+ if (existsSync(join(root, '.cursor'))) {
+ const mcp = existsSync(join(root, '.cursor/mcp.json'))
+ ? JSON.parse(await fs.readFile(join(root, '.cursor/mcp.json'), 'utf-8') || '{}')
+ : {}
+ mcp.mcpServers ||= {}
+ mcp.mcpServers[cursorMcpOptions.serverName || 'farm'] = { url: sseUrl }
+ await fs.writeFile(join(root, '.cursor/mcp.json'), `${JSON.stringify(mcp, null, 2)}\n`)
+ }
+ }
+
+ if (vscodeMcpOptions.enabled) {
+ const vscodeConfig = join(root, '.vscode/settings.json')
+ if (existsSync(vscodeConfig)) {
+ const mcp = existsSync(join(root, '.vscode/mcp.json'))
+ ? JSON.parse(await fs.readFile(join(root, '.vscode/mcp.json'), 'utf-8') || '{}')
+ : {}
+ mcp.servers ||= {}
+ mcp.servers[vscodeMcpOptions.serverName || 'farm'] = {
+ type: 'sse',
+ url: sseUrl,
+ }
+ await fs.writeFile(join(root, '.vscode/mcp.json'), `${JSON.stringify(mcp, null, 2)}\n`)
+ }
+ }
+
+ if (printUrl) {
+ setTimeout(() => {
+ console.log(`${p.yellow(` ➜ MCP: Server is running at ${sseUrl}`)}`)
+ }, 300)
+ }
+
+ },
+ };
+}
diff --git a/js-plugins/mcp/src/search-root.ts b/js-plugins/mcp/src/search-root.ts
new file mode 100644
index 00000000..93ba28d7
--- /dev/null
+++ b/js-plugins/mcp/src/search-root.ts
@@ -0,0 +1,100 @@
+// copy form vite https://github.com/vitejs/vite/blob/e360f0a65426f576cd25f14cafbd6005df78dbf0/packages/vite/src/node/server/searchRoot.ts#L63
+import fs from 'node:fs'
+import { dirname, join } from 'node:path'
+
+export function tryStatSync(file: string): fs.Stats | undefined {
+ try {
+ // The "throwIfNoEntry" is a performance optimization for cases where the file does not exist
+ return fs.statSync(file, { throwIfNoEntry: false })
+ } catch {
+ // Ignore errors
+ }
+}
+
+export function isFileReadable(filename: string): boolean {
+ if (!tryStatSync(filename)) {
+ return false
+ }
+
+ try {
+ // Check if current process has read permission to the file
+ fs.accessSync(filename, fs.constants.R_OK)
+
+ return true
+ } catch {
+ return false
+ }
+}
+
+
+// https://github.com/vitejs/vite/issues/2820#issuecomment-812495079
+const ROOT_FILES = [
+ // '.git',
+
+ // https://pnpm.io/workspaces/
+ 'pnpm-workspace.yaml',
+
+ // https://rushjs.io/pages/advanced/config_files/
+ // 'rush.json',
+
+ // https://nx.dev/latest/react/getting-started/nx-setup
+ // 'workspace.json',
+ // 'nx.json',
+
+ // https://github.com/lerna/lerna#lernajson
+ 'lerna.json',
+]
+
+// npm: https://docs.npmjs.com/cli/v7/using-npm/workspaces#installing-workspaces
+// yarn: https://classic.yarnpkg.com/en/docs/workspaces/#toc-how-to-use-it
+function hasWorkspacePackageJSON(root: string): boolean {
+ const path = join(root, 'package.json')
+ if (!isFileReadable(path)) {
+ return false
+ }
+ try {
+ const content = JSON.parse(fs.readFileSync(path, 'utf-8')) || {}
+ return !!content.workspaces
+ } catch {
+ return false
+ }
+}
+
+function hasRootFile(root: string): boolean {
+ return ROOT_FILES.some((file) => fs.existsSync(join(root, file)))
+}
+
+function hasPackageJSON(root: string) {
+ const path = join(root, 'package.json')
+ return fs.existsSync(path)
+}
+
+/**
+ * Search up for the nearest `package.json`
+ */
+export function searchForPackageRoot(current: string, root = current): string {
+ if (hasPackageJSON(current)) return current
+
+ const dir = dirname(current)
+ // reach the fs root
+ if (!dir || dir === current) return root
+
+ return searchForPackageRoot(dir, root)
+}
+
+/**
+ * Search up for the nearest workspace root
+ */
+export function searchForWorkspaceRoot(
+ current: string,
+ root = searchForPackageRoot(current),
+): string {
+ if (hasRootFile(current)) return current
+ if (hasWorkspacePackageJSON(current)) return current
+
+ const dir = dirname(current)
+ // reach the fs root
+ if (!dir || dir === current) return root
+
+ return searchForWorkspaceRoot(dir, root)
+}
\ No newline at end of file
diff --git a/js-plugins/mcp/src/server.ts b/js-plugins/mcp/src/server.ts
new file mode 100644
index 00000000..a963b350
--- /dev/null
+++ b/js-plugins/mcp/src/server.ts
@@ -0,0 +1,59 @@
+import type { Compiler, Resource } from '@farmfe/core'
+import type { FarmMcpOptions } from './types.js'
+import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
+import { z } from 'zod'
+import * as pkg from '../package.json'
+
+
+export const createMcpDefaultServer = async (options: FarmMcpOptions, compiler: Compiler) => {
+
+ const server = new McpServer(
+ {
+ name: 'farm',
+ // @ts-ignore
+ version: pkg.version,
+ ...options.mcpServerInfo,
+ },
+ )
+
+ server.tool("get-farm-config", "Get the Vite config digest, including the root, resolve, plugins", {}, async () => {
+
+ const result = {
+ root: compiler.config.config.root,
+ resolve: compiler.config.config.resolve,
+ plugins: compiler.config.jsPlugins.map(p => p.name).concat(compiler.config.rustPlugins.map(p => p[0])).filter(Boolean),
+ }
+
+ return {
+ content: [{
+ type: "text",
+ text: JSON.stringify(result),
+ }]
+ }
+ })
+
+
+ server.tool("get-farm-resource-info", "Get graph information of a module, including importers, dynamicImports, importedBindings and exports,modules.", {
+ filepath: z.string()
+ .describe('The absolute filepath of the module'),
+ }, async ({ filepath }) => {
+
+ let resource = compiler.resourcesMap[filepath as keyof typeof compiler.resourcesMap] as Resource
+ const result = {
+ importers: resource.info?.data?.imports,
+ dynamicImports: resource.info?.data?.dynamicImports,
+ exports: resource.info?.data?.exports,
+ importedBindings: resource.info?.data?.importedBindings,
+ modules: resource.info?.modules,
+ };
+
+ return {
+ content: [{
+ type: "text",
+ text: JSON.stringify(result),
+ }]
+ }
+ })
+
+ return server;
+}
\ No newline at end of file
diff --git a/js-plugins/mcp/src/types.ts b/js-plugins/mcp/src/types.ts
new file mode 100644
index 00000000..96509ac7
--- /dev/null
+++ b/js-plugins/mcp/src/types.ts
@@ -0,0 +1,71 @@
+import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
+import type { Implementation as McpServerInfo } from '@modelcontextprotocol/sdk/types.js'
+import { Compiler, type Server } from "@farmfe/core"
+
+export type { McpServer }
+
+type Awaitable = T | PromiseLike;
+
+
+export interface FarmMcpOptions {
+ /**
+ * The host to listen on, default is `localhost`
+ */
+ host?: string
+
+ /**
+ * The port to listen on, default is the port of the Vite dev server
+ */
+ port?: number
+
+ /**
+ * Print the MCP server URL in the console
+ *
+ * @default true
+ */
+ printUrl?: boolean
+
+ /**
+ * The MCP server info. Ingored when `mcpServer` is provided
+ */
+ mcpServerInfo?: McpServerInfo
+
+ /**
+ * Setup the MCP server, this is called when the MCP server is created
+ * You may also return a new MCP server to replace the default one
+ */
+ mcpServerSetup?: (server: McpServer, farmServer: Compiler) => Awaitable
+
+ /**
+ * The path to the MCP server, default is `/__mcp`
+ */
+ mcpPath?: string
+
+ /**
+ * Update the address of the MCP server in the cursor config file `.cursor/mcp.json`,
+ * if `.cursor` folder exists.
+ *
+ * @default true
+ */
+ updateCursorMcpJson?: boolean | {
+ enabled: boolean
+ /**
+ * The name of the MCP server, default is `vite`
+ */
+ serverName?: string
+ }
+
+ /**
+ * Update the address of the MCP server in the VSCode config file `settings.json`,
+ * if VSCode config file exists.
+ *
+ * @default true
+ */
+ updateVSCodeMcpJson?: boolean | {
+ enabled: boolean
+ /**
+ * The name of the MCP server, default is `vite`
+ */
+ serverName?: string
+ }
+}
\ No newline at end of file
diff --git a/js-plugins/mcp/tsconfig.json b/js-plugins/mcp/tsconfig.json
new file mode 100644
index 00000000..888cf9d0
--- /dev/null
+++ b/js-plugins/mcp/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "exclude": ["node_modules"],
+ "include": ["src/**/*"],
+ "compilerOptions": {
+ "noUnusedParameters": false,
+ "noUnusedLocals": false,
+ "outDir": "dist",
+ "rootDir": "src",
+ "lib": ["DOM", "ESNext"],
+ "noImplicitAny": true,
+ "sourceMap": true,
+ "target": "es2020",
+ "module": "node16",
+ "moduleResolution": "node16",
+ "declaration": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "skipDefaultLibCheck": true,
+ "skipLibCheck": true,
+ "resolveJsonModule": true
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 19bb9b70..8ebb38fe 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -67,6 +67,43 @@ importers:
specifier: ^0.14.0
version: 0.14.2
+ examples/mcp:
+ dependencies:
+ '@farmfe/plugin-mcp':
+ specifier: workspace:*
+ version: link:../../js-plugins/mcp
+ clsx:
+ specifier: ^1.2.1
+ version: 1.2.1
+ react:
+ specifier: '18'
+ version: 18.3.1
+ react-dom:
+ specifier: '18'
+ version: 18.3.1(react@18.3.1)
+ devDependencies:
+ '@farmfe/cli':
+ specifier: ^1.0.0
+ version: 1.0.4
+ '@farmfe/core':
+ specifier: ^1.0.22
+ version: 1.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.5)
+ '@farmfe/plugin-react':
+ specifier: ^1.0.1
+ version: 1.2.6
+ '@types/react':
+ specifier: '18'
+ version: 18.3.18
+ '@types/react-dom':
+ specifier: '18'
+ version: 18.3.5(@types/react@18.3.18)
+ core-js:
+ specifier: ^3.36.1
+ version: 3.39.0
+ react-refresh:
+ specifier: ^0.14.0
+ version: 0.14.2
+
examples/mdx:
dependencies:
react:
@@ -258,6 +295,34 @@ importers:
specifier: ^7.0.3
version: 7.0.3
+ js-plugins/mcp:
+ dependencies:
+ '@modelcontextprotocol/sdk':
+ specifier: ^1.9.0
+ version: 1.9.0
+ zod:
+ specifier: ^3.24.2
+ version: 3.24.2
+ devDependencies:
+ '@farmfe/cli':
+ specifier: ^1.0.4
+ version: 1.0.4
+ '@farmfe/core':
+ specifier: ^1.7.2
+ version: 1.7.2(bufferutil@4.0.8)(utf-8-validate@6.0.5)
+ '@farmfe/js-plugin-dts':
+ specifier: ^0.5.1
+ version: 0.5.2
+ '@types/koa':
+ specifier: ^2.13.4
+ version: 2.15.0
+ '@types/node':
+ specifier: ^18.19.67
+ version: 18.19.84
+ cross-env:
+ specifier: ^7.0.3
+ version: 7.0.3
+
js-plugins/react-compiler:
dependencies:
'@babel/plugin-syntax-jsx':
@@ -1146,6 +1211,10 @@ packages:
'@mdn/browser-compat-data@5.6.26':
resolution: {integrity: sha512-7NdgdOR7lkzrN70zGSULmrcvKyi/aJjpTJRCbuy8IZuHiLkPTvsr10jW0MJgWzK2l2wTmhdQvegTw6yNU5AVNQ==}
+ '@modelcontextprotocol/sdk@1.9.0':
+ resolution: {integrity: sha512-Jq2EUCQpe0iyO5FGpzVYDNFR6oR53AIrwph9yWl7uSc7IWUMsrmpmSaTGra5hQNunXpM+9oit85p924jWuHzUA==}
+ engines: {node: '>=18'}
+
'@monaco-editor/loader@1.4.0':
resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==}
peerDependencies:
@@ -1296,6 +1365,9 @@ packages:
'@tsconfig/node22@22.0.1':
resolution: {integrity: sha512-VkgOa3n6jvs1p+r3DiwBqeEwGAwEvnVCg/hIjiANl5IEcqP3G0u5m8cBJspe1t9qjZRlZ7WFgqq5bJrGdgAKMg==}
+ '@types/accepts@1.3.7':
+ resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==}
+
'@types/babel__core@7.20.5':
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
@@ -1308,15 +1380,39 @@ packages:
'@types/babel__traverse@7.20.6':
resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+ '@types/body-parser@1.19.5':
+ resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
+
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+ '@types/content-disposition@0.5.8':
+ resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==}
+
'@types/conventional-commits-parser@5.0.1':
resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==}
+ '@types/cookies@0.9.0':
+ resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==}
+
'@types/estree@1.0.7':
resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
+ '@types/express-serve-static-core@5.0.6':
+ resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==}
+
+ '@types/express@5.0.1':
+ resolution: {integrity: sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==}
+
'@types/fs-extra@11.0.4':
resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
+ '@types/http-assert@1.5.6':
+ resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==}
+
+ '@types/http-errors@2.0.4':
+ resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
+
'@types/http-proxy@1.17.15':
resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==}
@@ -1326,6 +1422,18 @@ packages:
'@types/jsonfile@6.1.4':
resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
+ '@types/keygrip@1.0.6':
+ resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==}
+
+ '@types/koa-compose@3.2.8':
+ resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==}
+
+ '@types/koa@2.15.0':
+ resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==}
+
+ '@types/mime@1.3.5':
+ resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+
'@types/node@12.20.55':
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
@@ -1347,6 +1455,12 @@ packages:
'@types/prop-types@15.7.14':
resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
+ '@types/qs@6.9.18':
+ resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==}
+
+ '@types/range-parser@1.2.7':
+ resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+
'@types/react-dom@18.3.5':
resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==}
peerDependencies:
@@ -1366,6 +1480,12 @@ packages:
'@types/semver@7.5.8':
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
+ '@types/send@0.17.4':
+ resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
+
+ '@types/serve-static@1.15.7':
+ resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
+
'@types/ua-parser-js@0.7.39':
resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==}
@@ -1503,6 +1623,10 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
+ 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:
@@ -1589,6 +1713,10 @@ packages:
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ body-parser@2.2.0:
+ resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==}
+ engines: {node: '>=18'}
+
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
@@ -1641,10 +1769,18 @@ packages:
resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
engines: {node: '>= 0.4'}
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
call-bind@1.0.8:
resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
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'}
@@ -1691,6 +1827,10 @@ packages:
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
engines: {node: '>=0.8'}
+ clsx@1.2.1:
+ resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
+ engines: {node: '>=6'}
+
co@4.6.0:
resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
@@ -1740,6 +1880,10 @@ packages:
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
engines: {node: '>= 0.6'}
+ 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'}
@@ -1756,6 +1900,14 @@ packages:
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ 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'}
+
cookies@0.9.1:
resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==}
engines: {node: '>= 0.8'}
@@ -1763,6 +1915,10 @@ packages:
core-js@3.39.0:
resolution: {integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==}
+ cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+
cosmiconfig-typescript-loader@6.1.0:
resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==}
engines: {node: '>=v18'}
@@ -1906,6 +2062,10 @@ packages:
resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
engines: {node: '>= 0.8'}
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
enquirer@2.4.1:
resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
engines: {node: '>=8.6'}
@@ -1938,6 +2098,10 @@ packages:
resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
engines: {node: '>= 0.4'}
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
esbuild@0.25.2:
resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==}
engines: {node: '>=18'}
@@ -2015,9 +2179,21 @@ packages:
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'}
+
eventemitter3@4.0.7:
resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+ 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@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
@@ -2026,6 +2202,16 @@ packages:
resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
engines: {node: ^14.18.0 || ^16.14.0 || >=18.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'}
+
extendable-error@0.1.7:
resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==}
@@ -2129,6 +2315,10 @@ packages:
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@4.1.0:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'}
@@ -2161,10 +2351,18 @@ packages:
resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
engines: {node: '>= 6'}
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
fresh@0.5.2:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
+ fresh@2.0.0:
+ resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
+ engines: {node: '>= 0.8'}
+
fs-extra@11.2.0:
resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
engines: {node: '>=14.14'}
@@ -2197,6 +2395,14 @@ packages:
resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==}
engines: {node: '>= 0.4'}
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ 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'}
@@ -2283,6 +2489,10 @@ packages:
resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==}
engines: {node: '>= 0.6'}
+ http-errors@2.0.0:
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ engines: {node: '>= 0.8'}
+
http-proxy-middleware@3.0.3:
resolution: {integrity: sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -2311,6 +2521,10 @@ packages:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.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==}
@@ -2353,6 +2567,10 @@ packages:
resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==}
engines: {node: '>=14.18.0'}
+ 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==}
@@ -2407,6 +2625,9 @@ packages:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
+ is-promise@4.0.0:
+ resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
+
is-stream@2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
@@ -2622,6 +2843,10 @@ packages:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
+ media-typer@1.1.0:
+ resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
+ engines: {node: '>= 0.8'}
+
memorystream@0.3.1:
resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
engines: {node: '>= 0.10.0'}
@@ -2630,6 +2855,10 @@ packages:
resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
engines: {node: '>=16.10'}
+ 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==}
@@ -2649,10 +2878,18 @@ packages:
resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==}
engines: {node: '>= 0.6'}
+ mime-db@1.54.0:
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+ engines: {node: '>= 0.6'}
+
mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
+ mime-types@3.0.1:
+ resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
+ engines: {node: '>= 0.6'}
+
mimic-fn@2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
@@ -2721,6 +2958,10 @@ packages:
resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
engines: {node: '>= 0.6'}
+ negotiator@1.0.0:
+ resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
+ engines: {node: '>= 0.6'}
+
node-gyp-build@4.8.4:
resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
hasBin: true
@@ -2752,6 +2993,14 @@ packages:
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+ 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'}
+
object-path@0.11.8:
resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==}
engines: {node: '>= 10.12.0'}
@@ -2760,6 +3009,9 @@ packages:
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@5.1.2:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
@@ -2864,6 +3116,10 @@ packages:
resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
engines: {node: '>=12'}
+ 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'}
@@ -2895,6 +3151,10 @@ packages:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
+ pkce-challenge@5.0.0:
+ resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==}
+ engines: {node: '>=16.20.0'}
+
pkg-types@1.3.1:
resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
@@ -2915,6 +3175,10 @@ packages:
engines: {node: '>=10.13.0'}
hasBin: true
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
@@ -2922,9 +3186,21 @@ packages:
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'}
+
react-dom@18.3.1:
resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
peerDependencies:
@@ -3005,6 +3281,10 @@ packages:
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-applescript@5.0.0:
resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
engines: {node: '>=12'}
@@ -3175,6 +3455,14 @@ packages:
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'}
+
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
@@ -3197,6 +3485,22 @@ packages:
resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==}
engines: {node: '>= 0.4'}
+ 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'}
+
signal-exit@3.0.7:
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
@@ -3237,6 +3541,10 @@ packages:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
+ statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -3345,6 +3653,10 @@ packages:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
+ type-is@2.0.1:
+ resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
+ engines: {node: '>= 0.6'}
+
typescript-eslint@8.28.0:
resolution: {integrity: sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3387,6 +3699,10 @@ packages:
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'}
+
unplugin-fonts@1.3.1:
resolution: {integrity: sha512-GmaJWPAWH6lBI4fP8xKdbMZJwTgsnr8PGJOfQE52jlod8QkqSO4M529Nox2L8zYapjB5hox2wCu4N3c/LOal/A==}
peerDependencies:
@@ -3588,6 +3904,9 @@ packages:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
ws@8.18.0:
resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
engines: {node: '>=10.0.0'}
@@ -3631,6 +3950,11 @@ packages:
resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==}
engines: {node: '>=12.20'}
+ zod-to-json-schema@3.24.5:
+ resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==}
+ peerDependencies:
+ zod: ^3.24.1
+
zod-validation-error@1.5.0:
resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==}
engines: {node: '>=16.0.0'}
@@ -3640,6 +3964,9 @@ packages:
zod@3.24.1:
resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==}
+ zod@3.24.2:
+ resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==}
+
snapshots:
'@ampproject/remapping@2.3.0':
@@ -4372,7 +4699,7 @@ snapshots:
'@farmfe/js-plugin-dts@0.5.2':
dependencies:
chalk: 5.4.1
- fast-glob: 3.3.2
+ fast-glob: 3.3.3
fs-extra: 11.2.0
ts-morph: 19.0.0
typescript: 5.6.3
@@ -4529,6 +4856,21 @@ snapshots:
'@mdn/browser-compat-data@5.6.26': {}
+ '@modelcontextprotocol/sdk@1.9.0':
+ 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.2
+ zod-to-json-schema: 3.24.5(zod@3.24.2)
+ transitivePeerDependencies:
+ - supports-color
+
'@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)':
dependencies:
monaco-editor: 0.52.2
@@ -4640,6 +4982,10 @@ snapshots:
'@tsconfig/node22@22.0.1': {}
+ '@types/accepts@1.3.7':
+ dependencies:
+ '@types/node': 22.13.14
+
'@types/babel__core@7.20.5':
dependencies:
'@babel/parser': 7.26.3
@@ -4661,26 +5007,80 @@ snapshots:
dependencies:
'@babel/types': 7.26.3
+ '@types/body-parser@1.19.5':
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 22.13.14
+
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 22.13.14
+
+ '@types/content-disposition@0.5.8': {}
+
'@types/conventional-commits-parser@5.0.1':
dependencies:
'@types/node': 22.13.14
+ '@types/cookies@0.9.0':
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/express': 5.0.1
+ '@types/keygrip': 1.0.6
+ '@types/node': 22.13.14
+
'@types/estree@1.0.7': {}
+ '@types/express-serve-static-core@5.0.6':
+ dependencies:
+ '@types/node': 22.13.14
+ '@types/qs': 6.9.18
+ '@types/range-parser': 1.2.7
+ '@types/send': 0.17.4
+
+ '@types/express@5.0.1':
+ dependencies:
+ '@types/body-parser': 1.19.5
+ '@types/express-serve-static-core': 5.0.6
+ '@types/serve-static': 1.15.7
+
'@types/fs-extra@11.0.4':
dependencies:
'@types/jsonfile': 6.1.4
'@types/node': 22.10.2
+ '@types/http-assert@1.5.6': {}
+
+ '@types/http-errors@2.0.4': {}
+
'@types/http-proxy@1.17.15':
dependencies:
- '@types/node': 22.10.2
+ '@types/node': 22.13.14
'@types/json-schema@7.0.15': {}
'@types/jsonfile@6.1.4':
dependencies:
- '@types/node': 22.10.2
+ '@types/node': 22.13.14
+
+ '@types/keygrip@1.0.6': {}
+
+ '@types/koa-compose@3.2.8':
+ dependencies:
+ '@types/koa': 2.15.0
+
+ '@types/koa@2.15.0':
+ dependencies:
+ '@types/accepts': 1.3.7
+ '@types/content-disposition': 0.5.8
+ '@types/cookies': 0.9.0
+ '@types/http-assert': 1.5.6
+ '@types/http-errors': 2.0.4
+ '@types/keygrip': 1.0.6
+ '@types/koa-compose': 3.2.8
+ '@types/node': 22.13.14
+
+ '@types/mime@1.3.5': {}
'@types/node@12.20.55': {}
@@ -4704,6 +5104,10 @@ snapshots:
'@types/prop-types@15.7.14': {}
+ '@types/qs@6.9.18': {}
+
+ '@types/range-parser@1.2.7': {}
+
'@types/react-dom@18.3.5(@types/react@18.3.18)':
dependencies:
'@types/react': 18.3.18
@@ -4723,6 +5127,17 @@ snapshots:
'@types/semver@7.5.8': {}
+ '@types/send@0.17.4':
+ dependencies:
+ '@types/mime': 1.3.5
+ '@types/node': 22.13.14
+
+ '@types/serve-static@1.15.7':
+ dependencies:
+ '@types/http-errors': 2.0.4
+ '@types/node': 22.13.14
+ '@types/send': 0.17.4
+
'@types/ua-parser-js@0.7.39': {}
'@types/ws@8.5.13':
@@ -4939,6 +5354,11 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
+ 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
@@ -5022,6 +5442,20 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.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
+
boolbase@1.0.0: {}
bplist-parser@0.2.0:
@@ -5077,6 +5511,11 @@ snapshots:
es-errors: 1.3.0
function-bind: 1.1.2
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
call-bind@1.0.8:
dependencies:
call-bind-apply-helpers: 1.0.1
@@ -5084,6 +5523,11 @@ snapshots:
get-intrinsic: 1.2.6
set-function-length: 1.2.2
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
callsites@3.1.0: {}
caniuse-lite@1.0.30001690: {}
@@ -5127,6 +5571,8 @@ snapshots:
clone@1.0.4: {}
+ clsx@1.2.1: {}
+
co@4.6.0: {}
code-block-writer@12.0.0: {}
@@ -5172,6 +5618,10 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
+ content-disposition@1.0.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
content-type@1.0.5: {}
conventional-changelog-angular@7.0.0:
@@ -5187,6 +5637,10 @@ snapshots:
convert-source-map@2.0.0: {}
+ cookie-signature@1.2.2: {}
+
+ cookie@0.7.2: {}
+
cookies@0.9.1:
dependencies:
depd: 2.0.0
@@ -5194,6 +5648,11 @@ snapshots:
core-js@3.39.0: {}
+ cors@2.8.5:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
cosmiconfig-typescript-loader@6.1.0(@types/node@22.13.14)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2):
dependencies:
'@types/node': 22.13.14
@@ -5306,6 +5765,8 @@ snapshots:
encodeurl@1.0.2: {}
+ encodeurl@2.0.0: {}
+
enquirer@2.4.1:
dependencies:
ansi-colors: 4.1.3
@@ -5329,6 +5790,10 @@ snapshots:
dependencies:
es-errors: 1.3.0
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
esbuild@0.25.2:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.2
@@ -5449,8 +5914,16 @@ snapshots:
esutils@2.0.3: {}
+ etag@1.8.1: {}
+
eventemitter3@4.0.7: {}
+ eventsource-parser@3.0.1: {}
+
+ eventsource@3.0.6:
+ dependencies:
+ eventsource-parser: 3.0.1
+
execa@5.1.1:
dependencies:
cross-spawn: 7.0.6
@@ -5475,6 +5948,42 @@ snapshots:
signal-exit: 3.0.7
strip-final-newline: 3.0.0
+ 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
+
extendable-error@0.1.7: {}
external-editor@3.1.0:
@@ -5580,6 +6089,17 @@ snapshots:
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@4.1.0:
dependencies:
locate-path: 5.0.0
@@ -5613,8 +6133,12 @@ snapshots:
combined-stream: 1.0.8
mime-types: 2.1.35
+ forwarded@0.2.0: {}
+
fresh@0.5.2: {}
+ fresh@2.0.0: {}
+
fs-extra@11.2.0:
dependencies:
graceful-fs: 4.2.11
@@ -5655,6 +6179,24 @@ snapshots:
hasown: 2.0.2
math-intrinsics: 1.1.0
+ 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-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
get-stream@6.0.1: {}
git-cz@4.9.0: {}
@@ -5743,6 +6285,14 @@ snapshots:
statuses: 1.5.0
toidentifier: 1.0.1
+ 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-middleware@3.0.3:
dependencies:
'@types/http-proxy': 1.17.15
@@ -5774,6 +6324,10 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
ieee754@1.2.1: {}
ignore@5.3.2: {}
@@ -5820,6 +6374,8 @@ snapshots:
strip-ansi: 6.0.1
wrap-ansi: 6.2.0
+ ipaddr.js@1.9.1: {}
+
is-arrayish@0.2.1: {}
is-binary-path@2.1.0:
@@ -5854,6 +6410,8 @@ snapshots:
is-plain-object@5.0.0: {}
+ is-promise@4.0.0: {}
+
is-stream@2.0.1: {}
is-stream@3.0.0: {}
@@ -6061,10 +6619,14 @@ snapshots:
media-typer@0.3.0: {}
+ media-typer@1.1.0: {}
+
memorystream@0.3.1: {}
meow@12.1.1: {}
+ merge-descriptors@2.0.0: {}
+
merge-stream@2.0.0: {}
merge2@1.4.1: {}
@@ -6078,10 +6640,16 @@ snapshots:
mime-db@1.53.0: {}
+ mime-db@1.54.0: {}
+
mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
+ mime-types@3.0.1:
+ dependencies:
+ mime-db: 1.54.0
+
mimic-fn@2.1.0: {}
mimic-fn@4.0.0: {}
@@ -6129,6 +6697,8 @@ snapshots:
negotiator@0.6.3: {}
+ negotiator@1.0.0: {}
+
node-gyp-build@4.8.4: {}
node-releases@2.0.19: {}
@@ -6160,12 +6730,20 @@ snapshots:
dependencies:
boolbase: 1.0.0
+ object-assign@4.1.1: {}
+
+ object-inspect@1.13.4: {}
+
object-path@0.11.8: {}
on-finished@2.4.1:
dependencies:
ee-first: 1.1.1
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
onetime@5.1.2:
dependencies:
mimic-fn: 2.1.0
@@ -6267,6 +6845,8 @@ snapshots:
path-key@4.0.0: {}
+ path-to-regexp@8.2.0: {}
+
path-type@4.0.0: {}
path-type@5.0.0: {}
@@ -6283,6 +6863,8 @@ snapshots:
pify@4.0.1: {}
+ pkce-challenge@5.0.0: {}
+
pkg-types@1.3.1:
dependencies:
confbox: 0.1.8
@@ -6304,12 +6886,30 @@ snapshots:
prettier@2.8.8: {}
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
proxy-from-env@1.1.0: {}
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
+
react-dom@18.3.1(react@18.3.1):
dependencies:
loose-envify: 1.4.0
@@ -6403,6 +7003,16 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.38.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-applescript@5.0.0:
dependencies:
execa: 5.1.1
@@ -6531,6 +7141,31 @@ snapshots:
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
+
set-function-length@1.2.2:
dependencies:
define-data-property: 1.1.4
@@ -6552,6 +7187,34 @@ snapshots:
shell-quote@1.8.2: {}
+ 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.2.6
+ 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.2.6
+ 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
+
signal-exit@3.0.7: {}
signal-exit@4.1.0: {}
@@ -6581,6 +7244,8 @@ snapshots:
statuses@1.5.0: {}
+ statuses@2.0.1: {}
+
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
@@ -6668,6 +7333,12 @@ snapshots:
media-typer: 0.3.0
mime-types: 2.1.35
+ type-is@2.0.1:
+ dependencies:
+ content-type: 1.0.5
+ media-typer: 1.1.0
+ mime-types: 3.0.1
+
typescript-eslint@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.6.3):
dependencies:
'@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.6.3)
@@ -6696,6 +7367,8 @@ snapshots:
universalify@2.0.1: {}
+ unpipe@1.0.0: {}
+
unplugin-fonts@1.3.1(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(sass-embedded@1.86.0)(sass@1.77.8)):
dependencies:
fast-glob: 3.3.3
@@ -6905,6 +7578,8 @@ snapshots:
string-width: 4.2.3
strip-ansi: 6.0.1
+ wrappy@1.0.2: {}
+
ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5):
optionalDependencies:
bufferutil: 4.0.8
@@ -6934,8 +7609,14 @@ snapshots:
yocto-queue@1.1.1: {}
+ zod-to-json-schema@3.24.5(zod@3.24.2):
+ dependencies:
+ zod: 3.24.2
+
zod-validation-error@1.5.0(zod@3.24.1):
dependencies:
zod: 3.24.1
zod@3.24.1: {}
+
+ zod@3.24.2: {}