├── .nvmrc ├── .cursorignore ├── .env.template ├── .gitignore ├── tsconfig.json ├── src ├── auth │ ├── ClientsStore.ts │ ├── SessionsStore.ts │ ├── TokenStore.ts │ └── OAuthServerProvider.ts ├── mcp │ ├── TransportsStore.ts │ └── Tools.ts └── index.ts ├── package.json ├── README.md └── pnpm-lock.yaml /.nvmrc: -------------------------------------------------------------------------------- 1 | lts/jod -------------------------------------------------------------------------------- /.cursorignore: -------------------------------------------------------------------------------- 1 | .env* 2 | .cursor -------------------------------------------------------------------------------- /.env.template: -------------------------------------------------------------------------------- 1 | LINKEDIN_CLIENT_ID= 2 | LINKEDIN_CLIENT_SECRET= 3 | JWT_SECRET= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | build/ 3 | *.log 4 | .env 5 | .cursor/mcp.json -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "Node16", 5 | "moduleResolution": "Node16", 6 | "outDir": "./build", 7 | "rootDir": "./src", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true 12 | }, 13 | "include": ["src/**/*"], 14 | "exclude": ["node_modules"] 15 | } 16 | -------------------------------------------------------------------------------- /src/auth/ClientsStore.ts: -------------------------------------------------------------------------------- 1 | import { OAuthRegisteredClientsStore } from "@modelcontextprotocol/sdk/server/auth/clients.js"; 2 | import { OAuthClientInformationFull } from "@modelcontextprotocol/sdk/shared/auth.js"; 3 | 4 | export class ClientsStore implements OAuthRegisteredClientsStore { 5 | private _clientsByClientId: Record = {}; 6 | 7 | public getClient = (clientId: string) => this._clientsByClientId[clientId]; 8 | 9 | public registerClient = (client: OAuthClientInformationFull) => { 10 | this._clientsByClientId[client.client_id] = client; 11 | 12 | return client; 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /src/mcp/TransportsStore.ts: -------------------------------------------------------------------------------- 1 | import { AuthInfo } from "@modelcontextprotocol/sdk/server/auth/types.js"; 2 | import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; 3 | import { Response } from "express"; 4 | 5 | export class TransportsStore { 6 | private _transportsBySessionId: Record< 7 | string, 8 | { transport: SSEServerTransport; auth: AuthInfo } 9 | > = {}; 10 | 11 | public getTransport = (sessionId: string) => 12 | this._transportsBySessionId[sessionId]; 13 | 14 | public createTransport = ( 15 | _endpoint: string, 16 | auth: AuthInfo, 17 | res: Response 18 | ) => { 19 | const transport = new SSEServerTransport(_endpoint, res); 20 | this._transportsBySessionId[transport.sessionId] = { transport, auth }; 21 | 22 | return transport; 23 | }; 24 | } 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "linkedin-mcp-server", 3 | "version": "0.1.0", 4 | "description": "MCP server for interacting with Linkedin Marketing API", 5 | "private": true, 6 | "type": "module", 7 | "bin": { 8 | "linkedin-mcp-server": "./build/index.js" 9 | }, 10 | "files": [ 11 | "build" 12 | ], 13 | "scripts": { 14 | "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"", 15 | "dev": "tsx watch --env-file=.env src/index.ts", 16 | "inspector": "npx @modelcontextprotocol/inspector" 17 | }, 18 | "dependencies": { 19 | "@modelcontextprotocol/sdk": "1.7.0", 20 | "axios": "^1.8.3", 21 | "express": "^4.21.2", 22 | "jsonwebtoken": "^9.0.2", 23 | "linkedin-api-client": "^0.3.0", 24 | "raw-body": "^3.0.0", 25 | "vitest": "^3.0.9", 26 | "zod": "^3.24.2" 27 | }, 28 | "devDependencies": { 29 | "@types/express": "^5.0.0", 30 | "@types/jsonwebtoken": "^9.0.9", 31 | "@types/node": "^20.11.24", 32 | "tsx": "^4.19.3", 33 | "typescript": "^5.3.3" 34 | } 35 | } -------------------------------------------------------------------------------- /src/auth/SessionsStore.ts: -------------------------------------------------------------------------------- 1 | import { AuthorizationParams } from "@modelcontextprotocol/sdk/server/auth/provider.js"; 2 | import { OAuthClientInformationFull } from "@modelcontextprotocol/sdk/shared/auth.js"; 3 | 4 | export type Session = { 5 | client: OAuthClientInformationFull; 6 | params: AuthorizationParams; 7 | tokenId?: string; 8 | }; 9 | 10 | export class SessionsStore { 11 | private _sessions: Record = {}; 12 | 13 | // Session are usually retrieved using either an OAuth state parameter or a temporary authorization code 14 | public getSession = (sessionId: string) => this._sessions[sessionId]; 15 | 16 | public registerSession = ( 17 | id: string, 18 | session: Session, 19 | expirationInSeconds?: number 20 | ) => { 21 | this._sessions[id] = session; 22 | 23 | if (expirationInSeconds !== undefined) { 24 | setTimeout(() => { 25 | delete this._sessions[id]; 26 | }, expirationInSeconds * 1000); 27 | } 28 | }; 29 | 30 | public clearSession = (sessionId: string) => { 31 | delete this._sessions[sessionId]; 32 | }; 33 | } 34 | -------------------------------------------------------------------------------- /src/auth/TokenStore.ts: -------------------------------------------------------------------------------- 1 | import { OAuthTokens } from "@modelcontextprotocol/sdk/shared/auth.js"; 2 | import { AccessToken3LResponse } from "linkedin-api-client"; 3 | import jwt from "jsonwebtoken"; 4 | import { randomUUID } from "crypto"; 5 | import { Session } from "./SessionsStore.js"; 6 | 7 | type AccessTokenPayload = { 8 | jti: string; 9 | iat: number; 10 | exp: number; 11 | aud: string; 12 | scopes?: string[]; 13 | }; 14 | 15 | export class TokensStore { 16 | private _tokensById: Record< 17 | string, 18 | { 19 | mcpServerToken: OAuthTokens; 20 | linkedinTokens: OAuthTokens; 21 | } 22 | > = {}; 23 | 24 | private _TOKEN_DURATION_MINUTES = 60; 25 | private _jwtSecret: string; 26 | 27 | constructor() { 28 | this._jwtSecret = process.env.JWT_SECRET as string; 29 | } 30 | 31 | public getTokens = (id: string) => this._tokensById[id]; 32 | 33 | public storeTokens = ( 34 | session: Session, 35 | linkedinTokens: AccessToken3LResponse 36 | ) => { 37 | const id = randomUUID(); 38 | const nowInSeconds = Math.floor(Date.now() / 1000); 39 | const expiresInSeconds = 60 * this._TOKEN_DURATION_MINUTES; 40 | const payload: AccessTokenPayload = { 41 | jti: id, 42 | iat: nowInSeconds, 43 | exp: nowInSeconds + expiresInSeconds, 44 | aud: session.client.client_id, 45 | scopes: session.params.scopes, 46 | }; 47 | 48 | const accessToken = jwt.sign(payload, this._jwtSecret); 49 | 50 | this._tokensById[id] = { 51 | mcpServerToken: { 52 | access_token: accessToken, 53 | token_type: "Bearer", 54 | expires_in: expiresInSeconds, 55 | scope: session.params.scopes?.join(" "), 56 | }, 57 | linkedinTokens: { ...linkedinTokens, token_type: "Bearer" }, 58 | }; 59 | 60 | return { id }; 61 | }; 62 | 63 | public parseAccessToken = (accessToken: string) => 64 | jwt.verify(accessToken, this._jwtSecret) as AccessTokenPayload; 65 | } 66 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Linkedin MCP Server 2 | 3 | MCP server for interacting with [Linkedin Community Management API](https://learn.microsoft.com/en-us/linkedin/marketing/community-management/community-management-overview?view=li-lms-2025-03). 4 | 5 | This MCP server: 6 | 7 | - Can be hosted locally or remotely : uses [HTTP+SSE transport](https://spec.modelcontextprotocol.io/specification/2024-11-05/basic/transports/#http-with-sse) defined in MCP 8 | - Implements the [Draft Third-Party Authorization Flow from MCP specs](https://spec.modelcontextprotocol.io/specification/draft/basic/authorization/#29-third-party-authorization-flow) to delegate authorization to LinkedIn's OAuth authorization server 9 | 10 | > ⚠️ Disclaimer: The Third-Party Authorization Flow proposal status is currently in draft. The only MCP client, to my knowledge, that currently implements this specification of the protocol is the [MCP Inspector](https://github.com/modelcontextprotocol/inspector) 11 | 12 | ## Features 13 | 14 | ### Tools 15 | 16 | - `user-info` - Get current logged in user infos (name, headline and profile picture) 17 | - `create-post` - Create a new post on LinkedIn 18 | 19 | ## Installation 20 | 21 | Follow those instructions to run Linkedin MCP server on your host. You'll need to provide your own Linkedin client. 22 | 23 | ### Requirements 24 | 25 | - Node 22 (`lts/jod`) 26 | - pnpm 10 27 | - a Linkedin client with `Community Management API` product installed and `http://localhost:3001/callback` added to the authorized redirect URLs 28 | 29 | ### Instructions 30 | 31 | - Install dependencies: 32 | 33 | ```bash 34 | pnpm install 35 | ``` 36 | 37 | - Create env file and populate with your Linkedin client credentials and a random string secret value for `JWT_SECRET`: 38 | 39 | ```bash 40 | cp .env.template .env && vi .env 41 | ``` 42 | 43 | - Run the server: 44 | 45 | ```bash 46 | pnpm run dev 47 | ``` 48 | 49 | - Configure your favorite MCP client to use this new server: 50 | 51 | ```json 52 | { 53 | "mcpServers": { 54 | "linkedin": { 55 | "url": "http://localhost:3001/sse" 56 | } 57 | } 58 | } 59 | ``` 60 | 61 | ### Debugging 62 | 63 | Start the [MCP Inspector](https://github.com/modelcontextprotocol/inspector) to debug this server, which is available as a package script: 64 | 65 | ```bash 66 | pnpm run inspector 67 | ``` 68 | 69 | Access the inspector in your browser at `http://localhost:5173` 70 | 71 | ## Acknowledgment 72 | 73 | - [Den Delimarsky](https://www.linkedin.com/in/dendeli/) that bravely gave a first shot at this new authorization flow with Microsoft Entra ID and detailed his results in his blog post: https://den.dev/blog/auth-modelcontextprotocol-entra-id/ 74 | - [Matt Pocock](https://www.linkedin.com/in/mapocock/) and his always welcome neat TS tricks specifically in the context of writting your own MCP server on AI Hero: https://www.aihero.dev/publish-your-mcp-server-to-npm 75 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 2 | import { mcpAuthRouter } from "@modelcontextprotocol/sdk/server/auth/router.js"; 3 | import { requireBearerAuth } from "@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js"; 4 | import { OAuthTokens } from "@modelcontextprotocol/sdk/shared/auth.js"; 5 | import { AuthInfo } from "@modelcontextprotocol/sdk/server/auth/types.js"; 6 | import express from "express"; 7 | import { z } from "zod"; 8 | 9 | import { Tools } from "./mcp/Tools.js"; 10 | import { OAuthServerProvider } from "./auth/OAuthServerProvider.js"; 11 | import { TransportsStore } from "./mcp/TransportsStore.js"; 12 | 13 | // Create an MCP server 14 | const server = new McpServer( 15 | { 16 | name: "Linkedin", 17 | version: "0.1.0", 18 | }, 19 | { 20 | capabilities: { tools: { listChanged: true } }, 21 | instructions: 22 | "This MCP server can help with LinkedIn related tasks. It can get informations on the currently logged in user and create posts on his behalf.", 23 | } 24 | ); 25 | 26 | const provider = new OAuthServerProvider({ 27 | clientId: process.env.LINKEDIN_CLIENT_ID as string, 28 | clientSecret: process.env.LINKEDIN_CLIENT_SECRET as string, 29 | redirectUrl: "http://localhost:3001/callback", 30 | }); 31 | 32 | const transportsStore = new TransportsStore(); 33 | 34 | const app = express(); 35 | app.use( 36 | mcpAuthRouter({ 37 | issuerUrl: new URL("http://localhost:3001"), 38 | provider, 39 | }) 40 | ); 41 | 42 | const tools = new Tools(); 43 | 44 | server.tool( 45 | "user-info", 46 | "Get information about currently logged in LinkedIn user", 47 | async ({ sessionId }) => { 48 | if (!sessionId) { 49 | throw new Error("No sessionId found"); 50 | } 51 | 52 | const { auth } = transportsStore.getTransport(sessionId); 53 | const { linkedinTokens } = ( 54 | auth as unknown as { extra: { linkedinTokens: OAuthTokens } } 55 | ).extra; 56 | 57 | return tools.userInfo(linkedinTokens); 58 | } 59 | ); 60 | 61 | server.tool( 62 | "create-post", 63 | "Create a new post on LinkedIn", 64 | { content: z.string() }, 65 | async ({ content }, { sessionId }) => { 66 | if (!sessionId) { 67 | throw new Error("No sessionId found"); 68 | } 69 | 70 | const { auth } = transportsStore.getTransport(sessionId); 71 | const { linkedinTokens } = ( 72 | auth as unknown as { extra: { linkedinTokens: OAuthTokens } } 73 | ).extra; 74 | 75 | return tools.createPost({ content }, linkedinTokens); 76 | } 77 | ); 78 | 79 | app.get("/callback", async ({ query: { code, state } }, res) => { 80 | if ( 81 | !code || 82 | !state || 83 | typeof code !== "string" || 84 | typeof state !== "string" 85 | ) { 86 | res.status(400).send("Invalid request parameters"); 87 | return; 88 | } 89 | 90 | await provider.callback(code, state, res); 91 | }); 92 | 93 | app.get( 94 | "/sse", 95 | requireBearerAuth({ provider, requiredScopes: [] }), 96 | async (req, res) => { 97 | const transport = transportsStore.createTransport( 98 | "/messages", 99 | req.auth as AuthInfo, 100 | res 101 | ); 102 | await server.connect(transport); 103 | } 104 | ); 105 | 106 | app.post( 107 | "/messages", 108 | requireBearerAuth({ provider, requiredScopes: [] }), 109 | async (req, res) => { 110 | const sessionId = req.query.sessionId as string; 111 | const { transport } = transportsStore.getTransport(sessionId); 112 | if (!transport) { 113 | res.status(400).send("No transport found"); 114 | return; 115 | } 116 | 117 | await transport.handlePostMessage(req, res); 118 | } 119 | ); 120 | 121 | app.listen(3001, () => { 122 | console.log("Server running on port 3001"); 123 | }); 124 | -------------------------------------------------------------------------------- /src/auth/OAuthServerProvider.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AuthorizationParams, 3 | OAuthServerProvider as OAuthServerProviderInterface, 4 | } from "@modelcontextprotocol/sdk/server/auth/provider.js"; 5 | import { OAuthClientInformationFull } from "@modelcontextprotocol/sdk/shared/auth.js"; 6 | import { AuthClient as LinkedinAuthClient } from "linkedin-api-client"; 7 | import { Response } from "express"; 8 | import { randomBytes } from "crypto"; 9 | 10 | import { ClientsStore } from "./ClientsStore.js"; 11 | import { SessionsStore } from "./SessionsStore.js"; 12 | import { TokensStore } from "./TokenStore.js"; 13 | 14 | export class OAuthServerProvider implements OAuthServerProviderInterface { 15 | private _LINKEDIN_SCOPES = ["r_basicprofile", "w_member_social"]; 16 | private _linkedinAuthClient: LinkedinAuthClient; 17 | 18 | private _clientsStore: ClientsStore; 19 | private _sessionsStore: SessionsStore; 20 | private _tokensStore: TokensStore; 21 | 22 | constructor(clientConfiguration: { 23 | clientId: string; 24 | clientSecret: string; 25 | redirectUrl: string; 26 | }) { 27 | this._linkedinAuthClient = new LinkedinAuthClient(clientConfiguration); 28 | 29 | this._clientsStore = new ClientsStore(); 30 | this._sessionsStore = new SessionsStore(); 31 | this._tokensStore = new TokensStore(); 32 | } 33 | 34 | public get clientsStore() { 35 | return this._clientsStore; 36 | } 37 | 38 | public authorize = async ( 39 | client: OAuthClientInformationFull, 40 | params: AuthorizationParams, 41 | res: Response 42 | ) => { 43 | try { 44 | const session = { client, params }; 45 | const state = randomBytes(32).toString("hex"); 46 | this._sessionsStore.registerSession(state, session); 47 | const url = this._linkedinAuthClient.generateMemberAuthorizationUrl( 48 | this._LINKEDIN_SCOPES, 49 | state 50 | ); 51 | 52 | res.redirect(url); 53 | } catch (error) { 54 | console.error("OAuthServerProvider authorize error:", error); 55 | 56 | res.status(500).send("Server error"); 57 | } 58 | }; 59 | 60 | public callback = async ( 61 | authorizationCode: string, 62 | state: string, 63 | res: Response 64 | ) => { 65 | try { 66 | const session = this._sessionsStore.getSession(state); 67 | if (!session) { 68 | console.error( 69 | `OAuthServerProvider callback error: No session found for state ${state}` 70 | ); 71 | res.status(400).send("Bad request"); 72 | } 73 | 74 | const linkedinTokens = 75 | await this._linkedinAuthClient.exchangeAuthCodeForAccessToken( 76 | authorizationCode 77 | ); 78 | const { id } = this._tokensStore.storeTokens(session, linkedinTokens); 79 | 80 | const code = randomBytes(32).toString("hex"); 81 | this._sessionsStore.registerSession( 82 | code, 83 | { ...session, tokenId: id }, 84 | 5 * 60 85 | ); 86 | this._sessionsStore.clearSession(state); 87 | const redirectUrl = new URL(session.params.redirectUri); 88 | redirectUrl.searchParams.set("code", code); 89 | if (session.params.state) { 90 | redirectUrl.searchParams.set("state", session.params.state); 91 | } 92 | 93 | res.redirect(redirectUrl.toString()); 94 | } catch (error) { 95 | console.error("OAuthServerProvider callback error:", error); 96 | res.status(500).send("Server error"); 97 | } 98 | }; 99 | 100 | public challengeForAuthorizationCode = async ( 101 | _client: OAuthClientInformationFull, 102 | authorizationCode: string 103 | ) => { 104 | const session = this._sessionsStore.getSession(authorizationCode); 105 | if (!session) { 106 | throw new Error("No session found for authorization code"); 107 | } 108 | 109 | return session.params.codeChallenge; 110 | }; 111 | 112 | public verifyAccessToken = async (accessToken: string) => { 113 | const { jti, aud, exp, scopes } = 114 | this._tokensStore.parseAccessToken(accessToken); 115 | 116 | const linkedinTokens = this._tokensStore.getTokens(jti)?.linkedinTokens; 117 | 118 | return { 119 | token: accessToken, 120 | clientId: aud, 121 | scopes: scopes ?? [], 122 | expiresAt: exp, 123 | extra: { linkedinTokens }, 124 | }; 125 | }; 126 | 127 | public exchangeRefreshToken = async () => { 128 | throw new Error("Not implemented"); 129 | }; 130 | 131 | public exchangeAuthorizationCode = async ( 132 | _client: OAuthClientInformationFull, 133 | authorizationCode: string 134 | ) => { 135 | const session = this._sessionsStore.getSession(authorizationCode); 136 | if (!session) { 137 | throw new Error("No session found for authorization code"); 138 | } 139 | 140 | if (!session.tokenId) { 141 | throw new Error("Session has no token id"); 142 | } 143 | 144 | const { mcpServerToken } = this._tokensStore.getTokens(session.tokenId); 145 | 146 | return mcpServerToken; 147 | }; 148 | } 149 | -------------------------------------------------------------------------------- /src/mcp/Tools.ts: -------------------------------------------------------------------------------- 1 | import { CallToolResult, Tool } from "@modelcontextprotocol/sdk/types.js"; 2 | import { RestliClient as LinkedinClient } from "linkedin-api-client"; 3 | import axios, { isAxiosError } from "axios"; 4 | import { z } from "zod"; 5 | import { OAuthTokens } from "@modelcontextprotocol/sdk/shared/auth.js"; 6 | 7 | export class Tools { 8 | private _linkedinClient: LinkedinClient; 9 | constructor() { 10 | this._linkedinClient = new LinkedinClient(); 11 | } 12 | 13 | public userInfo = async ( 14 | linkedinTokens: OAuthTokens 15 | ): Promise => { 16 | try { 17 | const { data } = await this._linkedinClient.get({ 18 | resourcePath: "/me", 19 | queryParams: { 20 | projection: `(${[ 21 | "localizedFirstName", 22 | "localizedLastName", 23 | "localizedHeadline", 24 | "profilePicture(displayImage~digitalmediaAsset:playableStreams)", 25 | ].join(",")})`, 26 | }, 27 | accessToken: linkedinTokens.access_token, 28 | }); 29 | const { 30 | localizedHeadline, 31 | localizedFirstName, 32 | localizedLastName, 33 | profilePicture, 34 | } = await z 35 | .object({ 36 | localizedHeadline: z.string(), 37 | localizedFirstName: z.string(), 38 | localizedLastName: z.string(), 39 | profilePicture: z 40 | .object({ 41 | "displayImage~": z.object({ 42 | elements: z.array( 43 | z.object({ 44 | identifiers: z.tuple([ 45 | z.object({ 46 | identifier: z.string().url(), 47 | }), 48 | ]), 49 | }) 50 | ), 51 | }), 52 | }) 53 | .transform(async (profilePicture) => { 54 | const profilePicureUrl = profilePicture["displayImage~"].elements 55 | .pop() 56 | ?.identifiers.pop()?.identifier; 57 | if (!profilePicureUrl) { 58 | return undefined; 59 | } 60 | 61 | const { data, headers } = await axios.get(profilePicureUrl, { 62 | responseType: "arraybuffer", 63 | }); 64 | const mimeType = headers["content-type"]; 65 | const base64Data = Buffer.from(data, "binary").toString("base64"); 66 | return { mimeType, data: base64Data }; 67 | }), 68 | }) 69 | .parseAsync(data); 70 | 71 | const content: CallToolResult["content"] = [ 72 | { 73 | type: "text", 74 | text: `Currently logged in user is ${[ 75 | localizedFirstName, 76 | localizedLastName, 77 | ].join(" ")} - ${localizedHeadline}`, 78 | }, 79 | ]; 80 | 81 | if (profilePicture) { 82 | content.push({ 83 | type: "image", 84 | ...profilePicture, 85 | }); 86 | } 87 | 88 | return { content }; 89 | } catch (e) { 90 | if (isAxiosError(e)) { 91 | return { 92 | isError: true, 93 | content: [ 94 | { 95 | type: "text", 96 | text: `[${e.response?.status} ${e.response?.statusText}] Linkedin API error: ${e.response?.data?.message}`, 97 | }, 98 | ], 99 | }; 100 | } 101 | 102 | if (e instanceof z.ZodError) { 103 | return { 104 | isError: true, 105 | content: [ 106 | { 107 | type: "text", 108 | text: `Unexpected Linkedin API response format: ${JSON.stringify( 109 | e.issues 110 | )}`, 111 | }, 112 | ], 113 | }; 114 | } 115 | 116 | return { 117 | isError: true, 118 | content: [{ type: "text", text: JSON.stringify(e) }], 119 | }; 120 | } 121 | }; 122 | 123 | public createPost = async ( 124 | post: { content: string }, 125 | linkedinTokens: OAuthTokens 126 | ): Promise => { 127 | try { 128 | const { data } = await this._linkedinClient.get({ 129 | resourcePath: "/me", 130 | queryParams: { 131 | projection: "(id)", 132 | }, 133 | accessToken: linkedinTokens.access_token, 134 | }); 135 | const { id: personId } = await z 136 | .object({ 137 | id: z.string(), 138 | }) 139 | .parse(data); 140 | 141 | await this._linkedinClient.create({ 142 | resourcePath: "/posts", 143 | entity: { 144 | author: `urn:li:person:${personId}`, 145 | commentary: post.content, 146 | visibility: "PUBLIC", 147 | distribution: { 148 | feedDistribution: "MAIN_FEED", 149 | targetEntities: [], 150 | thirdPartyDistributionChannels: [], 151 | }, 152 | lifecycleState: "PUBLISHED", 153 | isReshareDisabledByAuthor: false, 154 | }, 155 | accessToken: linkedinTokens.access_token, 156 | }); 157 | 158 | return { 159 | content: [ 160 | { 161 | type: "text", 162 | text: "Your post has been successfully created!", 163 | }, 164 | ], 165 | }; 166 | } catch (e) { 167 | if (isAxiosError(e)) { 168 | return { 169 | isError: true, 170 | content: [ 171 | { 172 | type: "text", 173 | text: `[${e.response?.status} ${e.response?.statusText}] Linkedin API error: ${e.response?.data?.message}`, 174 | }, 175 | ], 176 | }; 177 | } 178 | 179 | if (e instanceof z.ZodError) { 180 | return { 181 | isError: true, 182 | content: [ 183 | { 184 | type: "text", 185 | text: `Unexpected Linkedin API response format: ${JSON.stringify( 186 | e.issues 187 | )}`, 188 | }, 189 | ], 190 | }; 191 | } 192 | 193 | return { 194 | isError: true, 195 | content: [{ type: "text", text: JSON.stringify(e) }], 196 | }; 197 | } 198 | }; 199 | } 200 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@modelcontextprotocol/sdk': 12 | specifier: 1.7.0 13 | version: 1.7.0 14 | axios: 15 | specifier: ^1.8.3 16 | version: 1.8.3 17 | express: 18 | specifier: ^4.21.2 19 | version: 4.21.2 20 | jsonwebtoken: 21 | specifier: ^9.0.2 22 | version: 9.0.2 23 | linkedin-api-client: 24 | specifier: ^0.3.0 25 | version: 0.3.0 26 | raw-body: 27 | specifier: ^3.0.0 28 | version: 3.0.0 29 | vitest: 30 | specifier: ^3.0.9 31 | version: 3.0.9(@types/node@20.17.24)(tsx@4.19.3) 32 | zod: 33 | specifier: ^3.24.2 34 | version: 3.24.2 35 | devDependencies: 36 | '@types/express': 37 | specifier: ^5.0.0 38 | version: 5.0.0 39 | '@types/jsonwebtoken': 40 | specifier: ^9.0.9 41 | version: 9.0.9 42 | '@types/node': 43 | specifier: ^20.11.24 44 | version: 20.17.24 45 | tsx: 46 | specifier: ^4.19.3 47 | version: 4.19.3 48 | typescript: 49 | specifier: ^5.3.3 50 | version: 5.8.2 51 | 52 | packages: 53 | 54 | '@esbuild/aix-ppc64@0.25.1': 55 | resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} 56 | engines: {node: '>=18'} 57 | cpu: [ppc64] 58 | os: [aix] 59 | 60 | '@esbuild/android-arm64@0.25.1': 61 | resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} 62 | engines: {node: '>=18'} 63 | cpu: [arm64] 64 | os: [android] 65 | 66 | '@esbuild/android-arm@0.25.1': 67 | resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} 68 | engines: {node: '>=18'} 69 | cpu: [arm] 70 | os: [android] 71 | 72 | '@esbuild/android-x64@0.25.1': 73 | resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} 74 | engines: {node: '>=18'} 75 | cpu: [x64] 76 | os: [android] 77 | 78 | '@esbuild/darwin-arm64@0.25.1': 79 | resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} 80 | engines: {node: '>=18'} 81 | cpu: [arm64] 82 | os: [darwin] 83 | 84 | '@esbuild/darwin-x64@0.25.1': 85 | resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} 86 | engines: {node: '>=18'} 87 | cpu: [x64] 88 | os: [darwin] 89 | 90 | '@esbuild/freebsd-arm64@0.25.1': 91 | resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} 92 | engines: {node: '>=18'} 93 | cpu: [arm64] 94 | os: [freebsd] 95 | 96 | '@esbuild/freebsd-x64@0.25.1': 97 | resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} 98 | engines: {node: '>=18'} 99 | cpu: [x64] 100 | os: [freebsd] 101 | 102 | '@esbuild/linux-arm64@0.25.1': 103 | resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} 104 | engines: {node: '>=18'} 105 | cpu: [arm64] 106 | os: [linux] 107 | 108 | '@esbuild/linux-arm@0.25.1': 109 | resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} 110 | engines: {node: '>=18'} 111 | cpu: [arm] 112 | os: [linux] 113 | 114 | '@esbuild/linux-ia32@0.25.1': 115 | resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} 116 | engines: {node: '>=18'} 117 | cpu: [ia32] 118 | os: [linux] 119 | 120 | '@esbuild/linux-loong64@0.25.1': 121 | resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} 122 | engines: {node: '>=18'} 123 | cpu: [loong64] 124 | os: [linux] 125 | 126 | '@esbuild/linux-mips64el@0.25.1': 127 | resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} 128 | engines: {node: '>=18'} 129 | cpu: [mips64el] 130 | os: [linux] 131 | 132 | '@esbuild/linux-ppc64@0.25.1': 133 | resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} 134 | engines: {node: '>=18'} 135 | cpu: [ppc64] 136 | os: [linux] 137 | 138 | '@esbuild/linux-riscv64@0.25.1': 139 | resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} 140 | engines: {node: '>=18'} 141 | cpu: [riscv64] 142 | os: [linux] 143 | 144 | '@esbuild/linux-s390x@0.25.1': 145 | resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} 146 | engines: {node: '>=18'} 147 | cpu: [s390x] 148 | os: [linux] 149 | 150 | '@esbuild/linux-x64@0.25.1': 151 | resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} 152 | engines: {node: '>=18'} 153 | cpu: [x64] 154 | os: [linux] 155 | 156 | '@esbuild/netbsd-arm64@0.25.1': 157 | resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} 158 | engines: {node: '>=18'} 159 | cpu: [arm64] 160 | os: [netbsd] 161 | 162 | '@esbuild/netbsd-x64@0.25.1': 163 | resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} 164 | engines: {node: '>=18'} 165 | cpu: [x64] 166 | os: [netbsd] 167 | 168 | '@esbuild/openbsd-arm64@0.25.1': 169 | resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} 170 | engines: {node: '>=18'} 171 | cpu: [arm64] 172 | os: [openbsd] 173 | 174 | '@esbuild/openbsd-x64@0.25.1': 175 | resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} 176 | engines: {node: '>=18'} 177 | cpu: [x64] 178 | os: [openbsd] 179 | 180 | '@esbuild/sunos-x64@0.25.1': 181 | resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} 182 | engines: {node: '>=18'} 183 | cpu: [x64] 184 | os: [sunos] 185 | 186 | '@esbuild/win32-arm64@0.25.1': 187 | resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} 188 | engines: {node: '>=18'} 189 | cpu: [arm64] 190 | os: [win32] 191 | 192 | '@esbuild/win32-ia32@0.25.1': 193 | resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} 194 | engines: {node: '>=18'} 195 | cpu: [ia32] 196 | os: [win32] 197 | 198 | '@esbuild/win32-x64@0.25.1': 199 | resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} 200 | engines: {node: '>=18'} 201 | cpu: [x64] 202 | os: [win32] 203 | 204 | '@jridgewell/sourcemap-codec@1.5.0': 205 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 206 | 207 | '@modelcontextprotocol/sdk@1.7.0': 208 | resolution: {integrity: sha512-IYPe/FLpvF3IZrd/f5p5ffmWhMc3aEMuM2wGJASDqC2Ge7qatVCdbfPx3n/5xFeb19xN0j/911M2AaFuircsWA==} 209 | engines: {node: '>=18'} 210 | 211 | '@rollup/rollup-android-arm-eabi@4.36.0': 212 | resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==} 213 | cpu: [arm] 214 | os: [android] 215 | 216 | '@rollup/rollup-android-arm64@4.36.0': 217 | resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} 218 | cpu: [arm64] 219 | os: [android] 220 | 221 | '@rollup/rollup-darwin-arm64@4.36.0': 222 | resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} 223 | cpu: [arm64] 224 | os: [darwin] 225 | 226 | '@rollup/rollup-darwin-x64@4.36.0': 227 | resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} 228 | cpu: [x64] 229 | os: [darwin] 230 | 231 | '@rollup/rollup-freebsd-arm64@4.36.0': 232 | resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} 233 | cpu: [arm64] 234 | os: [freebsd] 235 | 236 | '@rollup/rollup-freebsd-x64@4.36.0': 237 | resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} 238 | cpu: [x64] 239 | os: [freebsd] 240 | 241 | '@rollup/rollup-linux-arm-gnueabihf@4.36.0': 242 | resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} 243 | cpu: [arm] 244 | os: [linux] 245 | 246 | '@rollup/rollup-linux-arm-musleabihf@4.36.0': 247 | resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} 248 | cpu: [arm] 249 | os: [linux] 250 | 251 | '@rollup/rollup-linux-arm64-gnu@4.36.0': 252 | resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} 253 | cpu: [arm64] 254 | os: [linux] 255 | 256 | '@rollup/rollup-linux-arm64-musl@4.36.0': 257 | resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} 258 | cpu: [arm64] 259 | os: [linux] 260 | 261 | '@rollup/rollup-linux-loongarch64-gnu@4.36.0': 262 | resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} 263 | cpu: [loong64] 264 | os: [linux] 265 | 266 | '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': 267 | resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} 268 | cpu: [ppc64] 269 | os: [linux] 270 | 271 | '@rollup/rollup-linux-riscv64-gnu@4.36.0': 272 | resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} 273 | cpu: [riscv64] 274 | os: [linux] 275 | 276 | '@rollup/rollup-linux-s390x-gnu@4.36.0': 277 | resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} 278 | cpu: [s390x] 279 | os: [linux] 280 | 281 | '@rollup/rollup-linux-x64-gnu@4.36.0': 282 | resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} 283 | cpu: [x64] 284 | os: [linux] 285 | 286 | '@rollup/rollup-linux-x64-musl@4.36.0': 287 | resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} 288 | cpu: [x64] 289 | os: [linux] 290 | 291 | '@rollup/rollup-win32-arm64-msvc@4.36.0': 292 | resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} 293 | cpu: [arm64] 294 | os: [win32] 295 | 296 | '@rollup/rollup-win32-ia32-msvc@4.36.0': 297 | resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} 298 | cpu: [ia32] 299 | os: [win32] 300 | 301 | '@rollup/rollup-win32-x64-msvc@4.36.0': 302 | resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} 303 | cpu: [x64] 304 | os: [win32] 305 | 306 | '@types/body-parser@1.19.5': 307 | resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} 308 | 309 | '@types/connect@3.4.38': 310 | resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} 311 | 312 | '@types/estree@1.0.6': 313 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 314 | 315 | '@types/express-serve-static-core@5.0.6': 316 | resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} 317 | 318 | '@types/express@5.0.0': 319 | resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} 320 | 321 | '@types/http-errors@2.0.4': 322 | resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} 323 | 324 | '@types/jsonwebtoken@9.0.9': 325 | resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} 326 | 327 | '@types/mime@1.3.5': 328 | resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} 329 | 330 | '@types/ms@2.1.0': 331 | resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} 332 | 333 | '@types/node@20.17.24': 334 | resolution: {integrity: sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA==} 335 | 336 | '@types/qs@6.9.18': 337 | resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} 338 | 339 | '@types/range-parser@1.2.7': 340 | resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} 341 | 342 | '@types/send@0.17.4': 343 | resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} 344 | 345 | '@types/serve-static@1.15.7': 346 | resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} 347 | 348 | '@vitest/expect@3.0.9': 349 | resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} 350 | 351 | '@vitest/mocker@3.0.9': 352 | resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} 353 | peerDependencies: 354 | msw: ^2.4.9 355 | vite: ^5.0.0 || ^6.0.0 356 | peerDependenciesMeta: 357 | msw: 358 | optional: true 359 | vite: 360 | optional: true 361 | 362 | '@vitest/pretty-format@3.0.9': 363 | resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} 364 | 365 | '@vitest/runner@3.0.9': 366 | resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} 367 | 368 | '@vitest/snapshot@3.0.9': 369 | resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} 370 | 371 | '@vitest/spy@3.0.9': 372 | resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} 373 | 374 | '@vitest/utils@3.0.9': 375 | resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} 376 | 377 | accepts@1.3.8: 378 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 379 | engines: {node: '>= 0.6'} 380 | 381 | accepts@2.0.0: 382 | resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} 383 | engines: {node: '>= 0.6'} 384 | 385 | array-flatten@1.1.1: 386 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 387 | 388 | assertion-error@2.0.1: 389 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 390 | engines: {node: '>=12'} 391 | 392 | asynckit@0.4.0: 393 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 394 | 395 | axios@1.8.3: 396 | resolution: {integrity: sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==} 397 | 398 | body-parser@1.20.3: 399 | resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} 400 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 401 | 402 | body-parser@2.1.0: 403 | resolution: {integrity: sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==} 404 | engines: {node: '>=18'} 405 | 406 | buffer-equal-constant-time@1.0.1: 407 | resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} 408 | 409 | bytes@3.1.2: 410 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 411 | engines: {node: '>= 0.8'} 412 | 413 | cac@6.7.14: 414 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 415 | engines: {node: '>=8'} 416 | 417 | call-bind-apply-helpers@1.0.2: 418 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 419 | engines: {node: '>= 0.4'} 420 | 421 | call-bound@1.0.4: 422 | resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 423 | engines: {node: '>= 0.4'} 424 | 425 | chai@5.2.0: 426 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 427 | engines: {node: '>=12'} 428 | 429 | check-error@2.1.1: 430 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 431 | engines: {node: '>= 16'} 432 | 433 | combined-stream@1.0.8: 434 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 435 | engines: {node: '>= 0.8'} 436 | 437 | content-disposition@0.5.4: 438 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 439 | engines: {node: '>= 0.6'} 440 | 441 | content-disposition@1.0.0: 442 | resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} 443 | engines: {node: '>= 0.6'} 444 | 445 | content-type@1.0.5: 446 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 447 | engines: {node: '>= 0.6'} 448 | 449 | cookie-signature@1.0.6: 450 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 451 | 452 | cookie-signature@1.2.2: 453 | resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} 454 | engines: {node: '>=6.6.0'} 455 | 456 | cookie@0.7.1: 457 | resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} 458 | engines: {node: '>= 0.6'} 459 | 460 | cors@2.8.5: 461 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 462 | engines: {node: '>= 0.10'} 463 | 464 | debug@2.6.9: 465 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 466 | peerDependencies: 467 | supports-color: '*' 468 | peerDependenciesMeta: 469 | supports-color: 470 | optional: true 471 | 472 | debug@4.3.6: 473 | resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} 474 | engines: {node: '>=6.0'} 475 | peerDependencies: 476 | supports-color: '*' 477 | peerDependenciesMeta: 478 | supports-color: 479 | optional: true 480 | 481 | debug@4.4.0: 482 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 483 | engines: {node: '>=6.0'} 484 | peerDependencies: 485 | supports-color: '*' 486 | peerDependenciesMeta: 487 | supports-color: 488 | optional: true 489 | 490 | deep-eql@5.0.2: 491 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 492 | engines: {node: '>=6'} 493 | 494 | delayed-stream@1.0.0: 495 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 496 | engines: {node: '>=0.4.0'} 497 | 498 | depd@2.0.0: 499 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 500 | engines: {node: '>= 0.8'} 501 | 502 | destroy@1.2.0: 503 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 504 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 505 | 506 | dunder-proto@1.0.1: 507 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 508 | engines: {node: '>= 0.4'} 509 | 510 | ecdsa-sig-formatter@1.0.11: 511 | resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} 512 | 513 | ee-first@1.1.1: 514 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 515 | 516 | encodeurl@1.0.2: 517 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 518 | engines: {node: '>= 0.8'} 519 | 520 | encodeurl@2.0.0: 521 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 522 | engines: {node: '>= 0.8'} 523 | 524 | es-define-property@1.0.1: 525 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 526 | engines: {node: '>= 0.4'} 527 | 528 | es-errors@1.3.0: 529 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 530 | engines: {node: '>= 0.4'} 531 | 532 | es-module-lexer@1.6.0: 533 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 534 | 535 | es-object-atoms@1.1.1: 536 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 537 | engines: {node: '>= 0.4'} 538 | 539 | es-set-tostringtag@2.1.0: 540 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 541 | engines: {node: '>= 0.4'} 542 | 543 | esbuild@0.25.1: 544 | resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} 545 | engines: {node: '>=18'} 546 | hasBin: true 547 | 548 | escape-html@1.0.3: 549 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 550 | 551 | estree-walker@3.0.3: 552 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 553 | 554 | etag@1.8.1: 555 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 556 | engines: {node: '>= 0.6'} 557 | 558 | eventsource-parser@3.0.0: 559 | resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} 560 | engines: {node: '>=18.0.0'} 561 | 562 | eventsource@3.0.5: 563 | resolution: {integrity: sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==} 564 | engines: {node: '>=18.0.0'} 565 | 566 | expect-type@1.2.0: 567 | resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} 568 | engines: {node: '>=12.0.0'} 569 | 570 | express-rate-limit@7.5.0: 571 | resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} 572 | engines: {node: '>= 16'} 573 | peerDependencies: 574 | express: ^4.11 || 5 || ^5.0.0-beta.1 575 | 576 | express@4.21.2: 577 | resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} 578 | engines: {node: '>= 0.10.0'} 579 | 580 | express@5.0.1: 581 | resolution: {integrity: sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==} 582 | engines: {node: '>= 18'} 583 | 584 | finalhandler@1.3.1: 585 | resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} 586 | engines: {node: '>= 0.8'} 587 | 588 | finalhandler@2.1.0: 589 | resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} 590 | engines: {node: '>= 0.8'} 591 | 592 | follow-redirects@1.15.9: 593 | resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} 594 | engines: {node: '>=4.0'} 595 | peerDependencies: 596 | debug: '*' 597 | peerDependenciesMeta: 598 | debug: 599 | optional: true 600 | 601 | form-data@4.0.2: 602 | resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} 603 | engines: {node: '>= 6'} 604 | 605 | forwarded@0.2.0: 606 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 607 | engines: {node: '>= 0.6'} 608 | 609 | fresh@0.5.2: 610 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 611 | engines: {node: '>= 0.6'} 612 | 613 | fresh@2.0.0: 614 | resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} 615 | engines: {node: '>= 0.8'} 616 | 617 | fsevents@2.3.3: 618 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 619 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 620 | os: [darwin] 621 | 622 | function-bind@1.1.2: 623 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 624 | 625 | get-intrinsic@1.3.0: 626 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 627 | engines: {node: '>= 0.4'} 628 | 629 | get-proto@1.0.1: 630 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 631 | engines: {node: '>= 0.4'} 632 | 633 | get-tsconfig@4.10.0: 634 | resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} 635 | 636 | gopd@1.2.0: 637 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 638 | engines: {node: '>= 0.4'} 639 | 640 | has-symbols@1.1.0: 641 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 642 | engines: {node: '>= 0.4'} 643 | 644 | has-tostringtag@1.0.2: 645 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 646 | engines: {node: '>= 0.4'} 647 | 648 | hasown@2.0.2: 649 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 650 | engines: {node: '>= 0.4'} 651 | 652 | http-errors@2.0.0: 653 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 654 | engines: {node: '>= 0.8'} 655 | 656 | iconv-lite@0.4.24: 657 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 658 | engines: {node: '>=0.10.0'} 659 | 660 | iconv-lite@0.5.2: 661 | resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} 662 | engines: {node: '>=0.10.0'} 663 | 664 | iconv-lite@0.6.3: 665 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 666 | engines: {node: '>=0.10.0'} 667 | 668 | inherits@2.0.4: 669 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 670 | 671 | ipaddr.js@1.9.1: 672 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 673 | engines: {node: '>= 0.10'} 674 | 675 | is-promise@4.0.0: 676 | resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 677 | 678 | jsonwebtoken@9.0.2: 679 | resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} 680 | engines: {node: '>=12', npm: '>=6'} 681 | 682 | jwa@1.4.1: 683 | resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} 684 | 685 | jws@3.2.2: 686 | resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} 687 | 688 | linkedin-api-client@0.3.0: 689 | resolution: {integrity: sha512-vxfjg0cpWtiMVYmAnjwppPLb5CI26bTPowiY6YZTAi/OjdQH1BWGD3i0gA8I9KcTgYdDHrY083zkHcmfK3jPCw==} 690 | engines: {node: '>=14.0.0'} 691 | 692 | lodash.includes@4.3.0: 693 | resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} 694 | 695 | lodash.isboolean@3.0.3: 696 | resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} 697 | 698 | lodash.isinteger@4.0.4: 699 | resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} 700 | 701 | lodash.isnumber@3.0.3: 702 | resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} 703 | 704 | lodash.isplainobject@4.0.6: 705 | resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} 706 | 707 | lodash.isstring@4.0.1: 708 | resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} 709 | 710 | lodash.once@4.1.1: 711 | resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} 712 | 713 | lodash@4.17.21: 714 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 715 | 716 | loupe@3.1.3: 717 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 718 | 719 | magic-string@0.30.17: 720 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 721 | 722 | math-intrinsics@1.1.0: 723 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 724 | engines: {node: '>= 0.4'} 725 | 726 | media-typer@0.3.0: 727 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 728 | engines: {node: '>= 0.6'} 729 | 730 | media-typer@1.1.0: 731 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 732 | engines: {node: '>= 0.8'} 733 | 734 | merge-descriptors@1.0.3: 735 | resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} 736 | 737 | merge-descriptors@2.0.0: 738 | resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} 739 | engines: {node: '>=18'} 740 | 741 | methods@1.1.2: 742 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 743 | engines: {node: '>= 0.6'} 744 | 745 | mime-db@1.52.0: 746 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 747 | engines: {node: '>= 0.6'} 748 | 749 | mime-db@1.53.0: 750 | resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} 751 | engines: {node: '>= 0.6'} 752 | 753 | mime-types@2.1.35: 754 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 755 | engines: {node: '>= 0.6'} 756 | 757 | mime-types@3.0.0: 758 | resolution: {integrity: sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==} 759 | engines: {node: '>= 0.6'} 760 | 761 | mime@1.6.0: 762 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 763 | engines: {node: '>=4'} 764 | hasBin: true 765 | 766 | ms@2.0.0: 767 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 768 | 769 | ms@2.1.2: 770 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 771 | 772 | ms@2.1.3: 773 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 774 | 775 | nanoid@3.3.10: 776 | resolution: {integrity: sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==} 777 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 778 | hasBin: true 779 | 780 | negotiator@0.6.3: 781 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 782 | engines: {node: '>= 0.6'} 783 | 784 | negotiator@1.0.0: 785 | resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 786 | engines: {node: '>= 0.6'} 787 | 788 | object-assign@4.1.1: 789 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 790 | engines: {node: '>=0.10.0'} 791 | 792 | object-inspect@1.13.4: 793 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 794 | engines: {node: '>= 0.4'} 795 | 796 | on-finished@2.4.1: 797 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 798 | engines: {node: '>= 0.8'} 799 | 800 | once@1.4.0: 801 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 802 | 803 | parseurl@1.3.3: 804 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 805 | engines: {node: '>= 0.8'} 806 | 807 | path-to-regexp@0.1.12: 808 | resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} 809 | 810 | path-to-regexp@8.2.0: 811 | resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} 812 | engines: {node: '>=16'} 813 | 814 | pathe@2.0.3: 815 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 816 | 817 | pathval@2.0.0: 818 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 819 | engines: {node: '>= 14.16'} 820 | 821 | picocolors@1.1.1: 822 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 823 | 824 | pkce-challenge@4.1.0: 825 | resolution: {integrity: sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==} 826 | engines: {node: '>=16.20.0'} 827 | 828 | postcss@8.5.3: 829 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 830 | engines: {node: ^10 || ^12 || >=14} 831 | 832 | proxy-addr@2.0.7: 833 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 834 | engines: {node: '>= 0.10'} 835 | 836 | proxy-from-env@1.1.0: 837 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} 838 | 839 | qs@6.13.0: 840 | resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} 841 | engines: {node: '>=0.6'} 842 | 843 | qs@6.14.0: 844 | resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} 845 | engines: {node: '>=0.6'} 846 | 847 | range-parser@1.2.1: 848 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 849 | engines: {node: '>= 0.6'} 850 | 851 | raw-body@2.5.2: 852 | resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} 853 | engines: {node: '>= 0.8'} 854 | 855 | raw-body@3.0.0: 856 | resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} 857 | engines: {node: '>= 0.8'} 858 | 859 | resolve-pkg-maps@1.0.0: 860 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 861 | 862 | rollup@4.36.0: 863 | resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} 864 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 865 | hasBin: true 866 | 867 | router@2.1.0: 868 | resolution: {integrity: sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==} 869 | engines: {node: '>= 18'} 870 | 871 | safe-buffer@5.2.1: 872 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 873 | 874 | safer-buffer@2.1.2: 875 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 876 | 877 | semver@7.7.1: 878 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 879 | engines: {node: '>=10'} 880 | hasBin: true 881 | 882 | send@0.19.0: 883 | resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} 884 | engines: {node: '>= 0.8.0'} 885 | 886 | send@1.1.0: 887 | resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==} 888 | engines: {node: '>= 18'} 889 | 890 | serve-static@1.16.2: 891 | resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} 892 | engines: {node: '>= 0.8.0'} 893 | 894 | serve-static@2.1.0: 895 | resolution: {integrity: sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==} 896 | engines: {node: '>= 18'} 897 | 898 | setprototypeof@1.2.0: 899 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 900 | 901 | side-channel-list@1.0.0: 902 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 903 | engines: {node: '>= 0.4'} 904 | 905 | side-channel-map@1.0.1: 906 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 907 | engines: {node: '>= 0.4'} 908 | 909 | side-channel-weakmap@1.0.2: 910 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 911 | engines: {node: '>= 0.4'} 912 | 913 | side-channel@1.1.0: 914 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 915 | engines: {node: '>= 0.4'} 916 | 917 | siginfo@2.0.0: 918 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 919 | 920 | source-map-js@1.2.1: 921 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 922 | engines: {node: '>=0.10.0'} 923 | 924 | stackback@0.0.2: 925 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 926 | 927 | statuses@2.0.1: 928 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 929 | engines: {node: '>= 0.8'} 930 | 931 | std-env@3.8.1: 932 | resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} 933 | 934 | tinybench@2.9.0: 935 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 936 | 937 | tinyexec@0.3.2: 938 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 939 | 940 | tinypool@1.0.2: 941 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 942 | engines: {node: ^18.0.0 || >=20.0.0} 943 | 944 | tinyrainbow@2.0.0: 945 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 946 | engines: {node: '>=14.0.0'} 947 | 948 | tinyspy@3.0.2: 949 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 950 | engines: {node: '>=14.0.0'} 951 | 952 | toidentifier@1.0.1: 953 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 954 | engines: {node: '>=0.6'} 955 | 956 | tsx@4.19.3: 957 | resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} 958 | engines: {node: '>=18.0.0'} 959 | hasBin: true 960 | 961 | type-is@1.6.18: 962 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 963 | engines: {node: '>= 0.6'} 964 | 965 | type-is@2.0.0: 966 | resolution: {integrity: sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==} 967 | engines: {node: '>= 0.6'} 968 | 969 | typescript@5.8.2: 970 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 971 | engines: {node: '>=14.17'} 972 | hasBin: true 973 | 974 | undici-types@6.19.8: 975 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 976 | 977 | unpipe@1.0.0: 978 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 979 | engines: {node: '>= 0.8'} 980 | 981 | utils-merge@1.0.1: 982 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 983 | engines: {node: '>= 0.4.0'} 984 | 985 | vary@1.1.2: 986 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 987 | engines: {node: '>= 0.8'} 988 | 989 | vite-node@3.0.9: 990 | resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==} 991 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 992 | hasBin: true 993 | 994 | vite@6.2.2: 995 | resolution: {integrity: sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==} 996 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 997 | hasBin: true 998 | peerDependencies: 999 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1000 | jiti: '>=1.21.0' 1001 | less: '*' 1002 | lightningcss: ^1.21.0 1003 | sass: '*' 1004 | sass-embedded: '*' 1005 | stylus: '*' 1006 | sugarss: '*' 1007 | terser: ^5.16.0 1008 | tsx: ^4.8.1 1009 | yaml: ^2.4.2 1010 | peerDependenciesMeta: 1011 | '@types/node': 1012 | optional: true 1013 | jiti: 1014 | optional: true 1015 | less: 1016 | optional: true 1017 | lightningcss: 1018 | optional: true 1019 | sass: 1020 | optional: true 1021 | sass-embedded: 1022 | optional: true 1023 | stylus: 1024 | optional: true 1025 | sugarss: 1026 | optional: true 1027 | terser: 1028 | optional: true 1029 | tsx: 1030 | optional: true 1031 | yaml: 1032 | optional: true 1033 | 1034 | vitest@3.0.9: 1035 | resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} 1036 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1037 | hasBin: true 1038 | peerDependencies: 1039 | '@edge-runtime/vm': '*' 1040 | '@types/debug': ^4.1.12 1041 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1042 | '@vitest/browser': 3.0.9 1043 | '@vitest/ui': 3.0.9 1044 | happy-dom: '*' 1045 | jsdom: '*' 1046 | peerDependenciesMeta: 1047 | '@edge-runtime/vm': 1048 | optional: true 1049 | '@types/debug': 1050 | optional: true 1051 | '@types/node': 1052 | optional: true 1053 | '@vitest/browser': 1054 | optional: true 1055 | '@vitest/ui': 1056 | optional: true 1057 | happy-dom: 1058 | optional: true 1059 | jsdom: 1060 | optional: true 1061 | 1062 | why-is-node-running@2.3.0: 1063 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1064 | engines: {node: '>=8'} 1065 | hasBin: true 1066 | 1067 | wrappy@1.0.2: 1068 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1069 | 1070 | zod-to-json-schema@3.24.3: 1071 | resolution: {integrity: sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==} 1072 | peerDependencies: 1073 | zod: ^3.24.1 1074 | 1075 | zod@3.24.2: 1076 | resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} 1077 | 1078 | snapshots: 1079 | 1080 | '@esbuild/aix-ppc64@0.25.1': 1081 | optional: true 1082 | 1083 | '@esbuild/android-arm64@0.25.1': 1084 | optional: true 1085 | 1086 | '@esbuild/android-arm@0.25.1': 1087 | optional: true 1088 | 1089 | '@esbuild/android-x64@0.25.1': 1090 | optional: true 1091 | 1092 | '@esbuild/darwin-arm64@0.25.1': 1093 | optional: true 1094 | 1095 | '@esbuild/darwin-x64@0.25.1': 1096 | optional: true 1097 | 1098 | '@esbuild/freebsd-arm64@0.25.1': 1099 | optional: true 1100 | 1101 | '@esbuild/freebsd-x64@0.25.1': 1102 | optional: true 1103 | 1104 | '@esbuild/linux-arm64@0.25.1': 1105 | optional: true 1106 | 1107 | '@esbuild/linux-arm@0.25.1': 1108 | optional: true 1109 | 1110 | '@esbuild/linux-ia32@0.25.1': 1111 | optional: true 1112 | 1113 | '@esbuild/linux-loong64@0.25.1': 1114 | optional: true 1115 | 1116 | '@esbuild/linux-mips64el@0.25.1': 1117 | optional: true 1118 | 1119 | '@esbuild/linux-ppc64@0.25.1': 1120 | optional: true 1121 | 1122 | '@esbuild/linux-riscv64@0.25.1': 1123 | optional: true 1124 | 1125 | '@esbuild/linux-s390x@0.25.1': 1126 | optional: true 1127 | 1128 | '@esbuild/linux-x64@0.25.1': 1129 | optional: true 1130 | 1131 | '@esbuild/netbsd-arm64@0.25.1': 1132 | optional: true 1133 | 1134 | '@esbuild/netbsd-x64@0.25.1': 1135 | optional: true 1136 | 1137 | '@esbuild/openbsd-arm64@0.25.1': 1138 | optional: true 1139 | 1140 | '@esbuild/openbsd-x64@0.25.1': 1141 | optional: true 1142 | 1143 | '@esbuild/sunos-x64@0.25.1': 1144 | optional: true 1145 | 1146 | '@esbuild/win32-arm64@0.25.1': 1147 | optional: true 1148 | 1149 | '@esbuild/win32-ia32@0.25.1': 1150 | optional: true 1151 | 1152 | '@esbuild/win32-x64@0.25.1': 1153 | optional: true 1154 | 1155 | '@jridgewell/sourcemap-codec@1.5.0': {} 1156 | 1157 | '@modelcontextprotocol/sdk@1.7.0': 1158 | dependencies: 1159 | content-type: 1.0.5 1160 | cors: 2.8.5 1161 | eventsource: 3.0.5 1162 | express: 5.0.1 1163 | express-rate-limit: 7.5.0(express@5.0.1) 1164 | pkce-challenge: 4.1.0 1165 | raw-body: 3.0.0 1166 | zod: 3.24.2 1167 | zod-to-json-schema: 3.24.3(zod@3.24.2) 1168 | transitivePeerDependencies: 1169 | - supports-color 1170 | 1171 | '@rollup/rollup-android-arm-eabi@4.36.0': 1172 | optional: true 1173 | 1174 | '@rollup/rollup-android-arm64@4.36.0': 1175 | optional: true 1176 | 1177 | '@rollup/rollup-darwin-arm64@4.36.0': 1178 | optional: true 1179 | 1180 | '@rollup/rollup-darwin-x64@4.36.0': 1181 | optional: true 1182 | 1183 | '@rollup/rollup-freebsd-arm64@4.36.0': 1184 | optional: true 1185 | 1186 | '@rollup/rollup-freebsd-x64@4.36.0': 1187 | optional: true 1188 | 1189 | '@rollup/rollup-linux-arm-gnueabihf@4.36.0': 1190 | optional: true 1191 | 1192 | '@rollup/rollup-linux-arm-musleabihf@4.36.0': 1193 | optional: true 1194 | 1195 | '@rollup/rollup-linux-arm64-gnu@4.36.0': 1196 | optional: true 1197 | 1198 | '@rollup/rollup-linux-arm64-musl@4.36.0': 1199 | optional: true 1200 | 1201 | '@rollup/rollup-linux-loongarch64-gnu@4.36.0': 1202 | optional: true 1203 | 1204 | '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': 1205 | optional: true 1206 | 1207 | '@rollup/rollup-linux-riscv64-gnu@4.36.0': 1208 | optional: true 1209 | 1210 | '@rollup/rollup-linux-s390x-gnu@4.36.0': 1211 | optional: true 1212 | 1213 | '@rollup/rollup-linux-x64-gnu@4.36.0': 1214 | optional: true 1215 | 1216 | '@rollup/rollup-linux-x64-musl@4.36.0': 1217 | optional: true 1218 | 1219 | '@rollup/rollup-win32-arm64-msvc@4.36.0': 1220 | optional: true 1221 | 1222 | '@rollup/rollup-win32-ia32-msvc@4.36.0': 1223 | optional: true 1224 | 1225 | '@rollup/rollup-win32-x64-msvc@4.36.0': 1226 | optional: true 1227 | 1228 | '@types/body-parser@1.19.5': 1229 | dependencies: 1230 | '@types/connect': 3.4.38 1231 | '@types/node': 20.17.24 1232 | 1233 | '@types/connect@3.4.38': 1234 | dependencies: 1235 | '@types/node': 20.17.24 1236 | 1237 | '@types/estree@1.0.6': {} 1238 | 1239 | '@types/express-serve-static-core@5.0.6': 1240 | dependencies: 1241 | '@types/node': 20.17.24 1242 | '@types/qs': 6.9.18 1243 | '@types/range-parser': 1.2.7 1244 | '@types/send': 0.17.4 1245 | 1246 | '@types/express@5.0.0': 1247 | dependencies: 1248 | '@types/body-parser': 1.19.5 1249 | '@types/express-serve-static-core': 5.0.6 1250 | '@types/qs': 6.9.18 1251 | '@types/serve-static': 1.15.7 1252 | 1253 | '@types/http-errors@2.0.4': {} 1254 | 1255 | '@types/jsonwebtoken@9.0.9': 1256 | dependencies: 1257 | '@types/ms': 2.1.0 1258 | '@types/node': 20.17.24 1259 | 1260 | '@types/mime@1.3.5': {} 1261 | 1262 | '@types/ms@2.1.0': {} 1263 | 1264 | '@types/node@20.17.24': 1265 | dependencies: 1266 | undici-types: 6.19.8 1267 | 1268 | '@types/qs@6.9.18': {} 1269 | 1270 | '@types/range-parser@1.2.7': {} 1271 | 1272 | '@types/send@0.17.4': 1273 | dependencies: 1274 | '@types/mime': 1.3.5 1275 | '@types/node': 20.17.24 1276 | 1277 | '@types/serve-static@1.15.7': 1278 | dependencies: 1279 | '@types/http-errors': 2.0.4 1280 | '@types/node': 20.17.24 1281 | '@types/send': 0.17.4 1282 | 1283 | '@vitest/expect@3.0.9': 1284 | dependencies: 1285 | '@vitest/spy': 3.0.9 1286 | '@vitest/utils': 3.0.9 1287 | chai: 5.2.0 1288 | tinyrainbow: 2.0.0 1289 | 1290 | '@vitest/mocker@3.0.9(vite@6.2.2(@types/node@20.17.24)(tsx@4.19.3))': 1291 | dependencies: 1292 | '@vitest/spy': 3.0.9 1293 | estree-walker: 3.0.3 1294 | magic-string: 0.30.17 1295 | optionalDependencies: 1296 | vite: 6.2.2(@types/node@20.17.24)(tsx@4.19.3) 1297 | 1298 | '@vitest/pretty-format@3.0.9': 1299 | dependencies: 1300 | tinyrainbow: 2.0.0 1301 | 1302 | '@vitest/runner@3.0.9': 1303 | dependencies: 1304 | '@vitest/utils': 3.0.9 1305 | pathe: 2.0.3 1306 | 1307 | '@vitest/snapshot@3.0.9': 1308 | dependencies: 1309 | '@vitest/pretty-format': 3.0.9 1310 | magic-string: 0.30.17 1311 | pathe: 2.0.3 1312 | 1313 | '@vitest/spy@3.0.9': 1314 | dependencies: 1315 | tinyspy: 3.0.2 1316 | 1317 | '@vitest/utils@3.0.9': 1318 | dependencies: 1319 | '@vitest/pretty-format': 3.0.9 1320 | loupe: 3.1.3 1321 | tinyrainbow: 2.0.0 1322 | 1323 | accepts@1.3.8: 1324 | dependencies: 1325 | mime-types: 2.1.35 1326 | negotiator: 0.6.3 1327 | 1328 | accepts@2.0.0: 1329 | dependencies: 1330 | mime-types: 3.0.0 1331 | negotiator: 1.0.0 1332 | 1333 | array-flatten@1.1.1: {} 1334 | 1335 | assertion-error@2.0.1: {} 1336 | 1337 | asynckit@0.4.0: {} 1338 | 1339 | axios@1.8.3: 1340 | dependencies: 1341 | follow-redirects: 1.15.9 1342 | form-data: 4.0.2 1343 | proxy-from-env: 1.1.0 1344 | transitivePeerDependencies: 1345 | - debug 1346 | 1347 | body-parser@1.20.3: 1348 | dependencies: 1349 | bytes: 3.1.2 1350 | content-type: 1.0.5 1351 | debug: 2.6.9 1352 | depd: 2.0.0 1353 | destroy: 1.2.0 1354 | http-errors: 2.0.0 1355 | iconv-lite: 0.4.24 1356 | on-finished: 2.4.1 1357 | qs: 6.13.0 1358 | raw-body: 2.5.2 1359 | type-is: 1.6.18 1360 | unpipe: 1.0.0 1361 | transitivePeerDependencies: 1362 | - supports-color 1363 | 1364 | body-parser@2.1.0: 1365 | dependencies: 1366 | bytes: 3.1.2 1367 | content-type: 1.0.5 1368 | debug: 4.4.0 1369 | http-errors: 2.0.0 1370 | iconv-lite: 0.5.2 1371 | on-finished: 2.4.1 1372 | qs: 6.14.0 1373 | raw-body: 3.0.0 1374 | type-is: 2.0.0 1375 | transitivePeerDependencies: 1376 | - supports-color 1377 | 1378 | buffer-equal-constant-time@1.0.1: {} 1379 | 1380 | bytes@3.1.2: {} 1381 | 1382 | cac@6.7.14: {} 1383 | 1384 | call-bind-apply-helpers@1.0.2: 1385 | dependencies: 1386 | es-errors: 1.3.0 1387 | function-bind: 1.1.2 1388 | 1389 | call-bound@1.0.4: 1390 | dependencies: 1391 | call-bind-apply-helpers: 1.0.2 1392 | get-intrinsic: 1.3.0 1393 | 1394 | chai@5.2.0: 1395 | dependencies: 1396 | assertion-error: 2.0.1 1397 | check-error: 2.1.1 1398 | deep-eql: 5.0.2 1399 | loupe: 3.1.3 1400 | pathval: 2.0.0 1401 | 1402 | check-error@2.1.1: {} 1403 | 1404 | combined-stream@1.0.8: 1405 | dependencies: 1406 | delayed-stream: 1.0.0 1407 | 1408 | content-disposition@0.5.4: 1409 | dependencies: 1410 | safe-buffer: 5.2.1 1411 | 1412 | content-disposition@1.0.0: 1413 | dependencies: 1414 | safe-buffer: 5.2.1 1415 | 1416 | content-type@1.0.5: {} 1417 | 1418 | cookie-signature@1.0.6: {} 1419 | 1420 | cookie-signature@1.2.2: {} 1421 | 1422 | cookie@0.7.1: {} 1423 | 1424 | cors@2.8.5: 1425 | dependencies: 1426 | object-assign: 4.1.1 1427 | vary: 1.1.2 1428 | 1429 | debug@2.6.9: 1430 | dependencies: 1431 | ms: 2.0.0 1432 | 1433 | debug@4.3.6: 1434 | dependencies: 1435 | ms: 2.1.2 1436 | 1437 | debug@4.4.0: 1438 | dependencies: 1439 | ms: 2.1.3 1440 | 1441 | deep-eql@5.0.2: {} 1442 | 1443 | delayed-stream@1.0.0: {} 1444 | 1445 | depd@2.0.0: {} 1446 | 1447 | destroy@1.2.0: {} 1448 | 1449 | dunder-proto@1.0.1: 1450 | dependencies: 1451 | call-bind-apply-helpers: 1.0.2 1452 | es-errors: 1.3.0 1453 | gopd: 1.2.0 1454 | 1455 | ecdsa-sig-formatter@1.0.11: 1456 | dependencies: 1457 | safe-buffer: 5.2.1 1458 | 1459 | ee-first@1.1.1: {} 1460 | 1461 | encodeurl@1.0.2: {} 1462 | 1463 | encodeurl@2.0.0: {} 1464 | 1465 | es-define-property@1.0.1: {} 1466 | 1467 | es-errors@1.3.0: {} 1468 | 1469 | es-module-lexer@1.6.0: {} 1470 | 1471 | es-object-atoms@1.1.1: 1472 | dependencies: 1473 | es-errors: 1.3.0 1474 | 1475 | es-set-tostringtag@2.1.0: 1476 | dependencies: 1477 | es-errors: 1.3.0 1478 | get-intrinsic: 1.3.0 1479 | has-tostringtag: 1.0.2 1480 | hasown: 2.0.2 1481 | 1482 | esbuild@0.25.1: 1483 | optionalDependencies: 1484 | '@esbuild/aix-ppc64': 0.25.1 1485 | '@esbuild/android-arm': 0.25.1 1486 | '@esbuild/android-arm64': 0.25.1 1487 | '@esbuild/android-x64': 0.25.1 1488 | '@esbuild/darwin-arm64': 0.25.1 1489 | '@esbuild/darwin-x64': 0.25.1 1490 | '@esbuild/freebsd-arm64': 0.25.1 1491 | '@esbuild/freebsd-x64': 0.25.1 1492 | '@esbuild/linux-arm': 0.25.1 1493 | '@esbuild/linux-arm64': 0.25.1 1494 | '@esbuild/linux-ia32': 0.25.1 1495 | '@esbuild/linux-loong64': 0.25.1 1496 | '@esbuild/linux-mips64el': 0.25.1 1497 | '@esbuild/linux-ppc64': 0.25.1 1498 | '@esbuild/linux-riscv64': 0.25.1 1499 | '@esbuild/linux-s390x': 0.25.1 1500 | '@esbuild/linux-x64': 0.25.1 1501 | '@esbuild/netbsd-arm64': 0.25.1 1502 | '@esbuild/netbsd-x64': 0.25.1 1503 | '@esbuild/openbsd-arm64': 0.25.1 1504 | '@esbuild/openbsd-x64': 0.25.1 1505 | '@esbuild/sunos-x64': 0.25.1 1506 | '@esbuild/win32-arm64': 0.25.1 1507 | '@esbuild/win32-ia32': 0.25.1 1508 | '@esbuild/win32-x64': 0.25.1 1509 | 1510 | escape-html@1.0.3: {} 1511 | 1512 | estree-walker@3.0.3: 1513 | dependencies: 1514 | '@types/estree': 1.0.6 1515 | 1516 | etag@1.8.1: {} 1517 | 1518 | eventsource-parser@3.0.0: {} 1519 | 1520 | eventsource@3.0.5: 1521 | dependencies: 1522 | eventsource-parser: 3.0.0 1523 | 1524 | expect-type@1.2.0: {} 1525 | 1526 | express-rate-limit@7.5.0(express@5.0.1): 1527 | dependencies: 1528 | express: 5.0.1 1529 | 1530 | express@4.21.2: 1531 | dependencies: 1532 | accepts: 1.3.8 1533 | array-flatten: 1.1.1 1534 | body-parser: 1.20.3 1535 | content-disposition: 0.5.4 1536 | content-type: 1.0.5 1537 | cookie: 0.7.1 1538 | cookie-signature: 1.0.6 1539 | debug: 2.6.9 1540 | depd: 2.0.0 1541 | encodeurl: 2.0.0 1542 | escape-html: 1.0.3 1543 | etag: 1.8.1 1544 | finalhandler: 1.3.1 1545 | fresh: 0.5.2 1546 | http-errors: 2.0.0 1547 | merge-descriptors: 1.0.3 1548 | methods: 1.1.2 1549 | on-finished: 2.4.1 1550 | parseurl: 1.3.3 1551 | path-to-regexp: 0.1.12 1552 | proxy-addr: 2.0.7 1553 | qs: 6.13.0 1554 | range-parser: 1.2.1 1555 | safe-buffer: 5.2.1 1556 | send: 0.19.0 1557 | serve-static: 1.16.2 1558 | setprototypeof: 1.2.0 1559 | statuses: 2.0.1 1560 | type-is: 1.6.18 1561 | utils-merge: 1.0.1 1562 | vary: 1.1.2 1563 | transitivePeerDependencies: 1564 | - supports-color 1565 | 1566 | express@5.0.1: 1567 | dependencies: 1568 | accepts: 2.0.0 1569 | body-parser: 2.1.0 1570 | content-disposition: 1.0.0 1571 | content-type: 1.0.5 1572 | cookie: 0.7.1 1573 | cookie-signature: 1.2.2 1574 | debug: 4.3.6 1575 | depd: 2.0.0 1576 | encodeurl: 2.0.0 1577 | escape-html: 1.0.3 1578 | etag: 1.8.1 1579 | finalhandler: 2.1.0 1580 | fresh: 2.0.0 1581 | http-errors: 2.0.0 1582 | merge-descriptors: 2.0.0 1583 | methods: 1.1.2 1584 | mime-types: 3.0.0 1585 | on-finished: 2.4.1 1586 | once: 1.4.0 1587 | parseurl: 1.3.3 1588 | proxy-addr: 2.0.7 1589 | qs: 6.13.0 1590 | range-parser: 1.2.1 1591 | router: 2.1.0 1592 | safe-buffer: 5.2.1 1593 | send: 1.1.0 1594 | serve-static: 2.1.0 1595 | setprototypeof: 1.2.0 1596 | statuses: 2.0.1 1597 | type-is: 2.0.0 1598 | utils-merge: 1.0.1 1599 | vary: 1.1.2 1600 | transitivePeerDependencies: 1601 | - supports-color 1602 | 1603 | finalhandler@1.3.1: 1604 | dependencies: 1605 | debug: 2.6.9 1606 | encodeurl: 2.0.0 1607 | escape-html: 1.0.3 1608 | on-finished: 2.4.1 1609 | parseurl: 1.3.3 1610 | statuses: 2.0.1 1611 | unpipe: 1.0.0 1612 | transitivePeerDependencies: 1613 | - supports-color 1614 | 1615 | finalhandler@2.1.0: 1616 | dependencies: 1617 | debug: 4.4.0 1618 | encodeurl: 2.0.0 1619 | escape-html: 1.0.3 1620 | on-finished: 2.4.1 1621 | parseurl: 1.3.3 1622 | statuses: 2.0.1 1623 | transitivePeerDependencies: 1624 | - supports-color 1625 | 1626 | follow-redirects@1.15.9: {} 1627 | 1628 | form-data@4.0.2: 1629 | dependencies: 1630 | asynckit: 0.4.0 1631 | combined-stream: 1.0.8 1632 | es-set-tostringtag: 2.1.0 1633 | mime-types: 2.1.35 1634 | 1635 | forwarded@0.2.0: {} 1636 | 1637 | fresh@0.5.2: {} 1638 | 1639 | fresh@2.0.0: {} 1640 | 1641 | fsevents@2.3.3: 1642 | optional: true 1643 | 1644 | function-bind@1.1.2: {} 1645 | 1646 | get-intrinsic@1.3.0: 1647 | dependencies: 1648 | call-bind-apply-helpers: 1.0.2 1649 | es-define-property: 1.0.1 1650 | es-errors: 1.3.0 1651 | es-object-atoms: 1.1.1 1652 | function-bind: 1.1.2 1653 | get-proto: 1.0.1 1654 | gopd: 1.2.0 1655 | has-symbols: 1.1.0 1656 | hasown: 2.0.2 1657 | math-intrinsics: 1.1.0 1658 | 1659 | get-proto@1.0.1: 1660 | dependencies: 1661 | dunder-proto: 1.0.1 1662 | es-object-atoms: 1.1.1 1663 | 1664 | get-tsconfig@4.10.0: 1665 | dependencies: 1666 | resolve-pkg-maps: 1.0.0 1667 | 1668 | gopd@1.2.0: {} 1669 | 1670 | has-symbols@1.1.0: {} 1671 | 1672 | has-tostringtag@1.0.2: 1673 | dependencies: 1674 | has-symbols: 1.1.0 1675 | 1676 | hasown@2.0.2: 1677 | dependencies: 1678 | function-bind: 1.1.2 1679 | 1680 | http-errors@2.0.0: 1681 | dependencies: 1682 | depd: 2.0.0 1683 | inherits: 2.0.4 1684 | setprototypeof: 1.2.0 1685 | statuses: 2.0.1 1686 | toidentifier: 1.0.1 1687 | 1688 | iconv-lite@0.4.24: 1689 | dependencies: 1690 | safer-buffer: 2.1.2 1691 | 1692 | iconv-lite@0.5.2: 1693 | dependencies: 1694 | safer-buffer: 2.1.2 1695 | 1696 | iconv-lite@0.6.3: 1697 | dependencies: 1698 | safer-buffer: 2.1.2 1699 | 1700 | inherits@2.0.4: {} 1701 | 1702 | ipaddr.js@1.9.1: {} 1703 | 1704 | is-promise@4.0.0: {} 1705 | 1706 | jsonwebtoken@9.0.2: 1707 | dependencies: 1708 | jws: 3.2.2 1709 | lodash.includes: 4.3.0 1710 | lodash.isboolean: 3.0.3 1711 | lodash.isinteger: 4.0.4 1712 | lodash.isnumber: 3.0.3 1713 | lodash.isplainobject: 4.0.6 1714 | lodash.isstring: 4.0.1 1715 | lodash.once: 4.1.1 1716 | ms: 2.1.3 1717 | semver: 7.7.1 1718 | 1719 | jwa@1.4.1: 1720 | dependencies: 1721 | buffer-equal-constant-time: 1.0.1 1722 | ecdsa-sig-formatter: 1.0.11 1723 | safe-buffer: 5.2.1 1724 | 1725 | jws@3.2.2: 1726 | dependencies: 1727 | jwa: 1.4.1 1728 | safe-buffer: 5.2.1 1729 | 1730 | linkedin-api-client@0.3.0: 1731 | dependencies: 1732 | axios: 1.8.3 1733 | lodash: 4.17.21 1734 | qs: 6.14.0 1735 | transitivePeerDependencies: 1736 | - debug 1737 | 1738 | lodash.includes@4.3.0: {} 1739 | 1740 | lodash.isboolean@3.0.3: {} 1741 | 1742 | lodash.isinteger@4.0.4: {} 1743 | 1744 | lodash.isnumber@3.0.3: {} 1745 | 1746 | lodash.isplainobject@4.0.6: {} 1747 | 1748 | lodash.isstring@4.0.1: {} 1749 | 1750 | lodash.once@4.1.1: {} 1751 | 1752 | lodash@4.17.21: {} 1753 | 1754 | loupe@3.1.3: {} 1755 | 1756 | magic-string@0.30.17: 1757 | dependencies: 1758 | '@jridgewell/sourcemap-codec': 1.5.0 1759 | 1760 | math-intrinsics@1.1.0: {} 1761 | 1762 | media-typer@0.3.0: {} 1763 | 1764 | media-typer@1.1.0: {} 1765 | 1766 | merge-descriptors@1.0.3: {} 1767 | 1768 | merge-descriptors@2.0.0: {} 1769 | 1770 | methods@1.1.2: {} 1771 | 1772 | mime-db@1.52.0: {} 1773 | 1774 | mime-db@1.53.0: {} 1775 | 1776 | mime-types@2.1.35: 1777 | dependencies: 1778 | mime-db: 1.52.0 1779 | 1780 | mime-types@3.0.0: 1781 | dependencies: 1782 | mime-db: 1.53.0 1783 | 1784 | mime@1.6.0: {} 1785 | 1786 | ms@2.0.0: {} 1787 | 1788 | ms@2.1.2: {} 1789 | 1790 | ms@2.1.3: {} 1791 | 1792 | nanoid@3.3.10: {} 1793 | 1794 | negotiator@0.6.3: {} 1795 | 1796 | negotiator@1.0.0: {} 1797 | 1798 | object-assign@4.1.1: {} 1799 | 1800 | object-inspect@1.13.4: {} 1801 | 1802 | on-finished@2.4.1: 1803 | dependencies: 1804 | ee-first: 1.1.1 1805 | 1806 | once@1.4.0: 1807 | dependencies: 1808 | wrappy: 1.0.2 1809 | 1810 | parseurl@1.3.3: {} 1811 | 1812 | path-to-regexp@0.1.12: {} 1813 | 1814 | path-to-regexp@8.2.0: {} 1815 | 1816 | pathe@2.0.3: {} 1817 | 1818 | pathval@2.0.0: {} 1819 | 1820 | picocolors@1.1.1: {} 1821 | 1822 | pkce-challenge@4.1.0: {} 1823 | 1824 | postcss@8.5.3: 1825 | dependencies: 1826 | nanoid: 3.3.10 1827 | picocolors: 1.1.1 1828 | source-map-js: 1.2.1 1829 | 1830 | proxy-addr@2.0.7: 1831 | dependencies: 1832 | forwarded: 0.2.0 1833 | ipaddr.js: 1.9.1 1834 | 1835 | proxy-from-env@1.1.0: {} 1836 | 1837 | qs@6.13.0: 1838 | dependencies: 1839 | side-channel: 1.1.0 1840 | 1841 | qs@6.14.0: 1842 | dependencies: 1843 | side-channel: 1.1.0 1844 | 1845 | range-parser@1.2.1: {} 1846 | 1847 | raw-body@2.5.2: 1848 | dependencies: 1849 | bytes: 3.1.2 1850 | http-errors: 2.0.0 1851 | iconv-lite: 0.4.24 1852 | unpipe: 1.0.0 1853 | 1854 | raw-body@3.0.0: 1855 | dependencies: 1856 | bytes: 3.1.2 1857 | http-errors: 2.0.0 1858 | iconv-lite: 0.6.3 1859 | unpipe: 1.0.0 1860 | 1861 | resolve-pkg-maps@1.0.0: {} 1862 | 1863 | rollup@4.36.0: 1864 | dependencies: 1865 | '@types/estree': 1.0.6 1866 | optionalDependencies: 1867 | '@rollup/rollup-android-arm-eabi': 4.36.0 1868 | '@rollup/rollup-android-arm64': 4.36.0 1869 | '@rollup/rollup-darwin-arm64': 4.36.0 1870 | '@rollup/rollup-darwin-x64': 4.36.0 1871 | '@rollup/rollup-freebsd-arm64': 4.36.0 1872 | '@rollup/rollup-freebsd-x64': 4.36.0 1873 | '@rollup/rollup-linux-arm-gnueabihf': 4.36.0 1874 | '@rollup/rollup-linux-arm-musleabihf': 4.36.0 1875 | '@rollup/rollup-linux-arm64-gnu': 4.36.0 1876 | '@rollup/rollup-linux-arm64-musl': 4.36.0 1877 | '@rollup/rollup-linux-loongarch64-gnu': 4.36.0 1878 | '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0 1879 | '@rollup/rollup-linux-riscv64-gnu': 4.36.0 1880 | '@rollup/rollup-linux-s390x-gnu': 4.36.0 1881 | '@rollup/rollup-linux-x64-gnu': 4.36.0 1882 | '@rollup/rollup-linux-x64-musl': 4.36.0 1883 | '@rollup/rollup-win32-arm64-msvc': 4.36.0 1884 | '@rollup/rollup-win32-ia32-msvc': 4.36.0 1885 | '@rollup/rollup-win32-x64-msvc': 4.36.0 1886 | fsevents: 2.3.3 1887 | 1888 | router@2.1.0: 1889 | dependencies: 1890 | is-promise: 4.0.0 1891 | parseurl: 1.3.3 1892 | path-to-regexp: 8.2.0 1893 | 1894 | safe-buffer@5.2.1: {} 1895 | 1896 | safer-buffer@2.1.2: {} 1897 | 1898 | semver@7.7.1: {} 1899 | 1900 | send@0.19.0: 1901 | dependencies: 1902 | debug: 2.6.9 1903 | depd: 2.0.0 1904 | destroy: 1.2.0 1905 | encodeurl: 1.0.2 1906 | escape-html: 1.0.3 1907 | etag: 1.8.1 1908 | fresh: 0.5.2 1909 | http-errors: 2.0.0 1910 | mime: 1.6.0 1911 | ms: 2.1.3 1912 | on-finished: 2.4.1 1913 | range-parser: 1.2.1 1914 | statuses: 2.0.1 1915 | transitivePeerDependencies: 1916 | - supports-color 1917 | 1918 | send@1.1.0: 1919 | dependencies: 1920 | debug: 4.3.6 1921 | destroy: 1.2.0 1922 | encodeurl: 2.0.0 1923 | escape-html: 1.0.3 1924 | etag: 1.8.1 1925 | fresh: 0.5.2 1926 | http-errors: 2.0.0 1927 | mime-types: 2.1.35 1928 | ms: 2.1.3 1929 | on-finished: 2.4.1 1930 | range-parser: 1.2.1 1931 | statuses: 2.0.1 1932 | transitivePeerDependencies: 1933 | - supports-color 1934 | 1935 | serve-static@1.16.2: 1936 | dependencies: 1937 | encodeurl: 2.0.0 1938 | escape-html: 1.0.3 1939 | parseurl: 1.3.3 1940 | send: 0.19.0 1941 | transitivePeerDependencies: 1942 | - supports-color 1943 | 1944 | serve-static@2.1.0: 1945 | dependencies: 1946 | encodeurl: 2.0.0 1947 | escape-html: 1.0.3 1948 | parseurl: 1.3.3 1949 | send: 1.1.0 1950 | transitivePeerDependencies: 1951 | - supports-color 1952 | 1953 | setprototypeof@1.2.0: {} 1954 | 1955 | side-channel-list@1.0.0: 1956 | dependencies: 1957 | es-errors: 1.3.0 1958 | object-inspect: 1.13.4 1959 | 1960 | side-channel-map@1.0.1: 1961 | dependencies: 1962 | call-bound: 1.0.4 1963 | es-errors: 1.3.0 1964 | get-intrinsic: 1.3.0 1965 | object-inspect: 1.13.4 1966 | 1967 | side-channel-weakmap@1.0.2: 1968 | dependencies: 1969 | call-bound: 1.0.4 1970 | es-errors: 1.3.0 1971 | get-intrinsic: 1.3.0 1972 | object-inspect: 1.13.4 1973 | side-channel-map: 1.0.1 1974 | 1975 | side-channel@1.1.0: 1976 | dependencies: 1977 | es-errors: 1.3.0 1978 | object-inspect: 1.13.4 1979 | side-channel-list: 1.0.0 1980 | side-channel-map: 1.0.1 1981 | side-channel-weakmap: 1.0.2 1982 | 1983 | siginfo@2.0.0: {} 1984 | 1985 | source-map-js@1.2.1: {} 1986 | 1987 | stackback@0.0.2: {} 1988 | 1989 | statuses@2.0.1: {} 1990 | 1991 | std-env@3.8.1: {} 1992 | 1993 | tinybench@2.9.0: {} 1994 | 1995 | tinyexec@0.3.2: {} 1996 | 1997 | tinypool@1.0.2: {} 1998 | 1999 | tinyrainbow@2.0.0: {} 2000 | 2001 | tinyspy@3.0.2: {} 2002 | 2003 | toidentifier@1.0.1: {} 2004 | 2005 | tsx@4.19.3: 2006 | dependencies: 2007 | esbuild: 0.25.1 2008 | get-tsconfig: 4.10.0 2009 | optionalDependencies: 2010 | fsevents: 2.3.3 2011 | 2012 | type-is@1.6.18: 2013 | dependencies: 2014 | media-typer: 0.3.0 2015 | mime-types: 2.1.35 2016 | 2017 | type-is@2.0.0: 2018 | dependencies: 2019 | content-type: 1.0.5 2020 | media-typer: 1.1.0 2021 | mime-types: 3.0.0 2022 | 2023 | typescript@5.8.2: {} 2024 | 2025 | undici-types@6.19.8: {} 2026 | 2027 | unpipe@1.0.0: {} 2028 | 2029 | utils-merge@1.0.1: {} 2030 | 2031 | vary@1.1.2: {} 2032 | 2033 | vite-node@3.0.9(@types/node@20.17.24)(tsx@4.19.3): 2034 | dependencies: 2035 | cac: 6.7.14 2036 | debug: 4.4.0 2037 | es-module-lexer: 1.6.0 2038 | pathe: 2.0.3 2039 | vite: 6.2.2(@types/node@20.17.24)(tsx@4.19.3) 2040 | transitivePeerDependencies: 2041 | - '@types/node' 2042 | - jiti 2043 | - less 2044 | - lightningcss 2045 | - sass 2046 | - sass-embedded 2047 | - stylus 2048 | - sugarss 2049 | - supports-color 2050 | - terser 2051 | - tsx 2052 | - yaml 2053 | 2054 | vite@6.2.2(@types/node@20.17.24)(tsx@4.19.3): 2055 | dependencies: 2056 | esbuild: 0.25.1 2057 | postcss: 8.5.3 2058 | rollup: 4.36.0 2059 | optionalDependencies: 2060 | '@types/node': 20.17.24 2061 | fsevents: 2.3.3 2062 | tsx: 4.19.3 2063 | 2064 | vitest@3.0.9(@types/node@20.17.24)(tsx@4.19.3): 2065 | dependencies: 2066 | '@vitest/expect': 3.0.9 2067 | '@vitest/mocker': 3.0.9(vite@6.2.2(@types/node@20.17.24)(tsx@4.19.3)) 2068 | '@vitest/pretty-format': 3.0.9 2069 | '@vitest/runner': 3.0.9 2070 | '@vitest/snapshot': 3.0.9 2071 | '@vitest/spy': 3.0.9 2072 | '@vitest/utils': 3.0.9 2073 | chai: 5.2.0 2074 | debug: 4.4.0 2075 | expect-type: 1.2.0 2076 | magic-string: 0.30.17 2077 | pathe: 2.0.3 2078 | std-env: 3.8.1 2079 | tinybench: 2.9.0 2080 | tinyexec: 0.3.2 2081 | tinypool: 1.0.2 2082 | tinyrainbow: 2.0.0 2083 | vite: 6.2.2(@types/node@20.17.24)(tsx@4.19.3) 2084 | vite-node: 3.0.9(@types/node@20.17.24)(tsx@4.19.3) 2085 | why-is-node-running: 2.3.0 2086 | optionalDependencies: 2087 | '@types/node': 20.17.24 2088 | transitivePeerDependencies: 2089 | - jiti 2090 | - less 2091 | - lightningcss 2092 | - msw 2093 | - sass 2094 | - sass-embedded 2095 | - stylus 2096 | - sugarss 2097 | - supports-color 2098 | - terser 2099 | - tsx 2100 | - yaml 2101 | 2102 | why-is-node-running@2.3.0: 2103 | dependencies: 2104 | siginfo: 2.0.0 2105 | stackback: 0.0.2 2106 | 2107 | wrappy@1.0.2: {} 2108 | 2109 | zod-to-json-schema@3.24.3(zod@3.24.2): 2110 | dependencies: 2111 | zod: 3.24.2 2112 | 2113 | zod@3.24.2: {} 2114 | --------------------------------------------------------------------------------