From b2992eb56b6b6e32658a26f552b53a0a86d6aeb9 Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Thu, 29 Oct 2026 14:55:05 +0000 Subject: [PATCH] breaking: Remove remaining core-served endpoints from cli-server-api --- packages/cli-server-api/package.json | 10 +- .../securityHeaderesMiddleware.test.ts | 54 ---- .../__tests__/statusPageMiddleware.test.ts | 45 ---- packages/cli-server-api/src/index.ts | 33 +-- .../src/securityHeadersMiddleware.ts | 49 ---- .../src/statusPageMiddleware.ts | 22 -- .../websocket/createEventsSocketEndpoint.ts | 197 -------------- .../websocket/createMessageSocketEndpoint.ts | 251 ------------------ yarn.lock | 88 +----- 9 files changed, 6 insertions(+), 743 deletions(-) delete mode 100644 packages/cli-server-api/src/__tests__/securityHeaderesMiddleware.test.ts delete mode 100644 packages/cli-server-api/src/__tests__/statusPageMiddleware.test.ts delete mode 100644 packages/cli-server-api/src/securityHeadersMiddleware.ts delete mode 100644 packages/cli-server-api/src/statusPageMiddleware.ts delete mode 100644 packages/cli-server-api/src/websocket/createEventsSocketEndpoint.ts delete mode 100644 packages/cli-server-api/src/websocket/createMessageSocketEndpoint.ts diff --git a/packages/cli-server-api/package.json b/packages/cli-server-api/package.json index dda7de1df..f2b6a39f9 100644 --- a/packages/cli-server-api/package.json +++ b/packages/cli-server-api/package.json @@ -8,19 +8,13 @@ }, "dependencies": { "@react-native-community/cli-tools": "21.0.0-alpha.1", - "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^29.7.0", - "serve-static": "^1.13.1", - "ws": "^6.2.3" + "serve-static": "^1.13.1" }, "devDependencies": { - "@types/compression": "^1.7.2", "@types/connect": "^3.4.33", - "@types/errorhandler": "^1.5.0", - "@types/ws": "^7.4.7" + "@types/errorhandler": "^1.5.0" }, "files": [ "build", diff --git a/packages/cli-server-api/src/__tests__/securityHeaderesMiddleware.test.ts b/packages/cli-server-api/src/__tests__/securityHeaderesMiddleware.test.ts deleted file mode 100644 index 5b23c3e2a..000000000 --- a/packages/cli-server-api/src/__tests__/securityHeaderesMiddleware.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import securityHeadersMiddleware from '../securityHeadersMiddleware'; - -describe('securityHeadersMiddleware', () => { - let req, res, next; - - beforeEach(() => { - req = { - headers: {}, - }; - res = { - setHeader: () => {}, - }; - next = jest.fn(); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - it('should block requests from different origins', () => { - req.headers.origin = 'https://example.com'; - const middleware = securityHeadersMiddleware({}); - middleware(req, res, next); - expect(next).toHaveBeenCalledWith(expect.any(Error)); - }); - - it('should allow requests from localhost', () => { - req.headers.origin = 'http://localhost:3000'; - const middleware = securityHeadersMiddleware({}); - middleware(req, res, next); - expect(next).toHaveBeenCalled(); - }); - - it('should allow requests from devtools', () => { - req.headers.origin = 'devtools://devtools'; - const middleware = securityHeadersMiddleware({}); - middleware(req, res, next); - expect(next).toHaveBeenCalled(); - }); - - it('should allow requests from custom host if provided in options', () => { - req.headers.origin = 'http://customhost.com'; - const middleware = securityHeadersMiddleware({host: 'customhost.com'}); - middleware(req, res, next); - expect(next).toHaveBeenCalled(); - }); - - it('should block requests from custom host if provided in options but not matching', () => { - req.headers.origin = 'http://anotherhost.com'; - const middleware = securityHeadersMiddleware({host: 'customhost.com'}); - middleware(req, res, next); - expect(next).toHaveBeenCalledWith(expect.any(Error)); - }); -}); diff --git a/packages/cli-server-api/src/__tests__/statusPageMiddleware.test.ts b/packages/cli-server-api/src/__tests__/statusPageMiddleware.test.ts deleted file mode 100644 index 8d92ff55e..000000000 --- a/packages/cli-server-api/src/__tests__/statusPageMiddleware.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import http from 'http'; -import statusPageMiddleware from './../statusPageMiddleware'; - -describe('statusPageMiddleware', () => { - let res: jest.Mocked; - let mockReq: http.IncomingMessage; - - beforeEach(() => { - res = { - setHeader: jest.fn(), - end: jest.fn(), - } as any; - - mockReq = {} as any; - }); - - afterEach(() => { - jest.restoreAllMocks(); - }); - - it('should set headers and end the response', () => { - jest.spyOn(process, 'cwd').mockReturnValue('/mocked/path'); - - statusPageMiddleware(mockReq, res); - - // We're strictly checking response here, because React Native is strongly depending on this response. Changing the response might be a breaking change. - expect(res.setHeader).toHaveBeenCalledWith( - 'X-React-Native-Project-Root', - '/mocked/path', - ); - expect(res.end).toHaveBeenCalledWith('packager-status:running'); - }); - - it('should set headers and end the response with decoded value', () => { - jest.spyOn(process, 'cwd').mockReturnValue('/привіт/path'); - - statusPageMiddleware(mockReq, res); - - expect(res.setHeader).toHaveBeenCalledWith( - 'X-React-Native-Project-Root', - '/%D0%BF%D1%80%D0%B8%D0%B2%D1%96%D1%82/path', - ); - expect(res.end).toHaveBeenCalledWith('packager-status:running'); - }); -}); diff --git a/packages/cli-server-api/src/index.ts b/packages/cli-server-api/src/index.ts index 70bbf44e1..4a6742422 100644 --- a/packages/cli-server-api/src/index.ts +++ b/packages/cli-server-api/src/index.ts @@ -1,19 +1,10 @@ -import http from 'http'; - -import compression from 'compression'; import connect from 'connect'; import errorhandler from 'errorhandler'; -import nocache from 'nocache'; import serveStatic from 'serve-static'; import indexPageMiddleware from './indexPageMiddleware'; -import securityHeadersMiddleware from './securityHeadersMiddleware'; -import statusPageMiddleware from './statusPageMiddleware'; import systraceProfileMiddleware from './systraceProfileMiddleware'; -import createMessageSocketEndpoint from './websocket/createMessageSocketEndpoint'; -import createEventsSocketEndpoint from './websocket/createEventsSocketEndpoint'; - type MiddlewareOptions = { host?: string; watchFolders: ReadonlyArray; @@ -21,24 +12,10 @@ type MiddlewareOptions = { }; export function createDevServerMiddleware(options: MiddlewareOptions) { - const messageSocketEndpoint = createMessageSocketEndpoint(); - const broadcast = messageSocketEndpoint.broadcast; - - const eventsSocketEndpoint = createEventsSocketEndpoint(broadcast); - const middleware = connect() - .use(securityHeadersMiddleware(options)) - // @ts-ignore compression and connect types mismatch - .use(compression()) - .use(nocache()) .use('/', indexPageMiddleware) - .use('/status', statusPageMiddleware) // @ts-ignore mismatch .use('/systrace', systraceProfileMiddleware) - .use('/reload', (_req: http.IncomingMessage, res: http.ServerResponse) => { - broadcast('reload'); - res.end('OK'); - }) // @ts-ignore mismatch .use(errorhandler()); @@ -47,13 +24,5 @@ export function createDevServerMiddleware(options: MiddlewareOptions) { middleware.use(serveStatic(folder)); }); - return { - websocketEndpoints: { - '/message': messageSocketEndpoint.server, - '/events': eventsSocketEndpoint.server, - }, - messageSocketEndpoint, - eventsSocketEndpoint, - middleware, - }; + return {middleware}; } diff --git a/packages/cli-server-api/src/securityHeadersMiddleware.ts b/packages/cli-server-api/src/securityHeadersMiddleware.ts deleted file mode 100644 index 1f2e00c82..000000000 --- a/packages/cli-server-api/src/securityHeadersMiddleware.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -import http from 'http'; - -type MiddlewareOptions = { - host?: string; -}; - -type MiddlewareFn = ( - req: http.IncomingMessage, - res: http.ServerResponse, - next: (err?: any) => void, -) => void; - -export default function securityHeadersMiddleware( - options: MiddlewareOptions, -): MiddlewareFn { - return ( - req: http.IncomingMessage, - res: http.ServerResponse, - next: (err?: any) => void, - ) => { - const host = options.host ? options.host : 'localhost'; - // Block any cross origin request. - if ( - typeof req.headers.origin === 'string' && - !req.headers.origin.match(new RegExp('^https?://' + host + ':')) && - !req.headers.origin.startsWith('devtools://devtools') - ) { - next( - new Error( - 'Unauthorized request from ' + - req.headers.origin + - '. This may happen because of a conflicting browser extension. Please try to disable it and try again.', - ), - ); - return; - } - - // Block MIME-type sniffing. - res.setHeader('X-Content-Type-Options', 'nosniff'); - - next(); - }; -} diff --git a/packages/cli-server-api/src/statusPageMiddleware.ts b/packages/cli-server-api/src/statusPageMiddleware.ts deleted file mode 100644 index b7d690752..000000000 --- a/packages/cli-server-api/src/statusPageMiddleware.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -import http from 'http'; - -/** - * Status page so that anyone who needs to can verify that the packager is - * running on 8081 and not another program / service. - */ -export default function statusPageMiddleware( - _req: http.IncomingMessage, - res: http.ServerResponse, -) { - res.setHeader( - 'X-React-Native-Project-Root', - new URL(`file:///${process.cwd()}`).pathname.slice(1), - ); - res.end('packager-status:running'); -} diff --git a/packages/cli-server-api/src/websocket/createEventsSocketEndpoint.ts b/packages/cli-server-api/src/websocket/createEventsSocketEndpoint.ts deleted file mode 100644 index a5979b264..000000000 --- a/packages/cli-server-api/src/websocket/createEventsSocketEndpoint.ts +++ /dev/null @@ -1,197 +0,0 @@ -import {Server as WebSocketServer} from 'ws'; -import {logger} from '@react-native-community/cli-tools'; -import prettyFormat, {plugins} from 'pretty-format'; - -/** - * The eventsSocket websocket listens at the 'events/` for websocket - * connections, on which all Metro reports will be emitted. - * - * This is mostly useful for developer tools (clients) that wants to monitor Metro, - * and the apps connected to Metro. - * - * The eventsSocket provides the following features: - * - it reports any Metro event (that is reported through a reporter) to all clients - * - it reports any console.log's (and friends) from the connected app to all clients - * (as client_log event) - * - it allows connected clients to send commands through Metro to the connected app. - * This reuses the generic command mechanism. - * Two useful commands are 'reload' and 'devmenu'. - */ - -type Command = { - version: number; - type: 'command'; - command: string; - params?: any; -}; - -/** - * This number is used to version the communication protocol between - * Dev tooling like Flipper and Metro, so that in the future we can recognize - * messages coming from old clients, so that it will be simpler to implement - * backward compatibility. - * - * We start at 2 as the protocol is currently the same as used internally at FB, - * which happens to be at version 2 as well. - */ -const PROTOCOL_VERSION = 2; - -function parseMessage(data: string): T | undefined { - try { - const message = JSON.parse(data); - if (message.version === PROTOCOL_VERSION) { - return message; - } - logger.error( - 'Received message had wrong protocol version: ' + message.version, - ); - } catch { - logger.error('Failed to parse the message as JSON:\n' + data); - } - return undefined; -} - -/** - * Two types of messages will arrive in this function, - * 1) messages generated by Metro itself (through the reporter abstraction) - * those are yet to be serialized, and can contain any kind of data structure - * 2) a specific event generated by Metro is `client_log`, which describes - * console.* calls in the app. - * The arguments send to the console are pretty printed so that they can be - * displayed in a nicer way in dev tools - * - * @param message - */ -function serializeMessage(message: any) { - // We do want to send Metro report messages, but their contents is not guaranteed to be serializable. - // For some known types we will pretty print otherwise not serializable parts first: - let toSerialize = message; - if (message && message.error && message.error instanceof Error) { - toSerialize = { - ...message, - error: prettyFormat(message.error, { - escapeString: true, - highlight: true, - maxDepth: 3, - min: true, - }), - }; - } else if (message && message.type === 'client_log') { - toSerialize = { - ...message, - data: message.data.map((item: any) => - typeof item === 'string' - ? item - : prettyFormat(item, { - escapeString: true, - highlight: true, - maxDepth: 3, - min: true, - plugins: [plugins.ReactElement], - }), - ), - }; - } - try { - return JSON.stringify(toSerialize); - } catch (e) { - logger.error('Failed to serialize: ' + e); - return null; - } -} - -/** - * Starts the eventsSocket at the given path - * - */ -export default function createEventsSocketEndpoint( - broadcast: (method: string, params?: Record) => void, -): { - server: WebSocketServer; - reportEvent: (event: any) => void; -} { - const wss = new WebSocketServer({ - noServer: true, - verifyClient({origin}: {origin: string}) { - // This exposes the full JS logs and enables issuing commands like reload - // so let's make sure only locally running stuff can connect to it - // origin is only checked if it is set, e.g. when the request is made from a (CORS) browser - // any 'back-end' connection isn't CORS at all, and has full control over the origin header, - // so there is no point in checking it security wise - return ( - !origin || - origin.startsWith('http://localhost:') || - origin.startsWith('file:') - ); - }, - }); - - const clients = new Map(); - let nextClientId = 0; - - /** - * broadCastEvent is called by reportEvent (below), which is called by the - * default reporter of this server, to make sure that all Metro events are - * broadcasted to all connected clients - * (that is, all devtools such as Flipper, _not_: connected apps) - * - * @param message - */ - function broadCastEvent(message: any) { - if (!clients.size) { - return; - } - const serialized = serializeMessage(message); - if (!serialized) { - return; - } - for (const ws of clients.values()) { - try { - ws.send(serialized); - } catch (e) { - logger.error( - `Failed to send broadcast to client due to:\n ${( - e as any - ).toString()}`, - ); - } - } - } - - wss.on('connection', function (clientWs) { - const clientId = `client#${nextClientId++}`; - - clients.set(clientId, clientWs); - - clientWs.onclose = clientWs.onerror = () => { - clients.delete(clientId); - }; - - clientWs.onmessage = (event) => { - const message: Command | undefined = parseMessage(event.data.toString()); - if (message == null) { - return; - } - if (message.type === 'command') { - try { - /** - * messageSocket.broadcast (not to be confused with our own broadcast above) - * forwards a command to all connected React Native applications. - */ - broadcast(message.command, message.params); - } catch (e) { - logger.error('Failed to forward message to clients: ', e as any); - } - } else { - logger.error('Unknown message type: ', message.type); - } - }; - }); - - return { - server: wss, - reportEvent: (event: any) => { - broadCastEvent(event); - }, - }; -} diff --git a/packages/cli-server-api/src/websocket/createMessageSocketEndpoint.ts b/packages/cli-server-api/src/websocket/createMessageSocketEndpoint.ts deleted file mode 100644 index b4da72780..000000000 --- a/packages/cli-server-api/src/websocket/createMessageSocketEndpoint.ts +++ /dev/null @@ -1,251 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import url from 'url'; -import {Server as WebSocketServer} from 'ws'; -import {logger} from '@react-native-community/cli-tools'; - -const PROTOCOL_VERSION = 2; - -type IdObject = { - requestId: string; - clientId: string; -}; - -type Message = { - version?: string; - id?: IdObject; - method?: string; - target: string; - result?: any; - error?: Error; - params?: Record; -}; - -function parseMessage(data: string, binary: any) { - if (binary) { - logger.error('Expected text message, got binary!'); - return undefined; - } - try { - const message = JSON.parse(data); - if (message.version === PROTOCOL_VERSION) { - return message; - } - logger.error( - `Received message had wrong protocol version: ${message.version}`, - ); - } catch (e) { - logger.error(`Failed to parse the message as JSON:\n${data}`); - } - return undefined; -} - -function isBroadcast(message: Message) { - return ( - typeof message.method === 'string' && - message.id === undefined && - message.target === undefined - ); -} - -function isRequest(message: Message) { - return ( - typeof message.method === 'string' && typeof message.target === 'string' - ); -} - -function isResponse(message: Message) { - return ( - typeof message.id === 'object' && - typeof message.id.requestId !== 'undefined' && - typeof message.id.clientId === 'string' && - (message.result !== undefined || message.error !== undefined) - ); -} - -export default function createMessageSocketEndpoint(): { - server: WebSocketServer; - broadcast: (method: string, params?: Record) => void; -} { - const wss = new WebSocketServer({ - noServer: true, - }); - const clients = new Map(); - let nextClientId = 0; - - function getClientWs(clientId: string) { - const clientWs = clients.get(clientId); - if (clientWs === undefined) { - throw new Error( - `could not find id "${clientId}" while forwarding request`, - ); - } - return clientWs; - } - - function handleSendBroadcast( - broadcasterId: string | null, - message: Partial, - ) { - const forwarded = { - version: PROTOCOL_VERSION, - method: message.method, - params: message.params, - }; - if (clients.size === 0) { - logger.warn( - `No apps connected. Sending "${message.method}" to all React Native apps failed. Make sure your app is running in the simulator or on a phone connected via USB.`, - ); - } - for (const [otherId, otherWs] of clients) { - if (otherId !== broadcasterId) { - try { - otherWs.send(JSON.stringify(forwarded)); - } catch (e) { - logger.error( - `Failed to send broadcast to client: '${otherId}' ` + - `due to:\n ${(e as any).toString()}`, - ); - } - } - } - } - - wss.on('connection', (clientWs) => { - const clientId = `client#${nextClientId++}`; - - function handleCaughtError(message: Message, error: Error) { - const errorMessage = { - id: message.id, - method: message.method, - target: message.target, - error: message.error === undefined ? 'undefined' : 'defined', - params: message.params === undefined ? 'undefined' : 'defined', - result: message.result === undefined ? 'undefined' : 'defined', - }; - - if (message.id === undefined) { - logger.error( - `Handling message from ${clientId} failed with:\n${error}\n` + - `message:\n${JSON.stringify(errorMessage)}`, - ); - } else { - try { - clientWs.send( - JSON.stringify({ - version: PROTOCOL_VERSION, - error, - id: message.id, - }), - ); - } catch (e) { - logger.error( - `Failed to reply to ${clientId} with error:\n${error}` + - `\nmessage:\n${JSON.stringify(errorMessage)}` + - `\ndue to error: ${(e as any).toString()}`, - ); - } - } - } - - function handleServerRequest(message: Message) { - let result = null; - switch (message.method) { - case 'getid': - result = clientId; - break; - case 'getpeers': - result = {}; - clients.forEach((otherWs, otherId) => { - if (clientId !== otherId) { - result[otherId] = url.parse(otherWs.upgradeReq.url, true).query; - } - }); - break; - default: - throw new Error(`unknown method: ${message.method}`); - } - - clientWs.send( - JSON.stringify({ - version: PROTOCOL_VERSION, - result, - id: message.id, - }), - ); - } - - function forwardRequest(message: Message) { - getClientWs(message.target).send( - JSON.stringify({ - version: PROTOCOL_VERSION, - method: message.method, - params: message.params, - id: - message.id === undefined - ? undefined - : {requestId: message.id, clientId}, - }), - ); - } - - function forwardResponse(message: Message) { - if (!message.id) { - return; - } - getClientWs(message.id.clientId).send( - JSON.stringify({ - version: PROTOCOL_VERSION, - result: message.result, - error: message.error, - id: message.id.requestId, - }), - ); - } - - clients.set(clientId, clientWs); - const onCloseHandler = () => { - clientWs.onmessage = () => {}; - clients.delete(clientId); - }; - clientWs.onclose = onCloseHandler; - clientWs.onerror = onCloseHandler; - clientWs.onmessage = (event: any) => { - const message = parseMessage(event.data, event.binary); - if (message === undefined) { - logger.error('Received message not matching protocol'); - return; - } - - try { - if (isBroadcast(message)) { - handleSendBroadcast(clientId, message); - } else if (isRequest(message)) { - if (message.target === 'server') { - handleServerRequest(message); - } else { - forwardRequest(message); - } - } else if (isResponse(message)) { - forwardResponse(message); - } else { - throw new Error('Invalid message, did not match the protocol'); - } - } catch (e) { - handleCaughtError(message, (e as any).toString()); - } - }; - }); - - return { - server: wss, - broadcast: (method: string, params?: Record) => { - handleSendBroadcast(null, {method, params}); - }, - }; -} diff --git a/yarn.lock b/yarn.lock index bcd5c8703..99dc72d51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1497,13 +1497,6 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - "@jest/source-map@^25.2.1": version "25.2.1" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.1.tgz#b62ecf8ae76170b08eff8859b56eb7576df34ab8" @@ -2185,13 +2178,6 @@ resolved "https://registry.yarnpkg.com/@types/command-exists/-/command-exists-1.2.0.tgz#d97e0ed10097090e4ab0367ed425b0312fad86f3" integrity sha512-ugsxEJfsCuqMLSuCD4PIJkp5Uk2z6TCMRCgYVuhRo5cYQY3+1xXTQkSlPtkpGHuvWMjS2KTeVQXxkXRACMbM6A== -"@types/compression@^1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@types/compression/-/compression-1.7.2.tgz#7cc1cdb01b4730eea284615a68fc70a2cdfd5e71" - integrity sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg== - dependencies: - "@types/express" "*" - "@types/connect@*", "@types/connect@^3.4.33": version "3.4.33" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" @@ -2434,13 +2420,6 @@ resolved "https://registry.yarnpkg.com/@types/wcwidth/-/wcwidth-1.0.0.tgz#a58f4673050f98c46ae8f852340889343b21a1f5" integrity sha512-X/WFfwGCIisEnd9EOSsX/jt7BHPDkcvQVYwVzc1nsE2K5bC56mWKnmNs0wyjcGcQsP7Wxq2zWSmhDDbF5Z7dDg== -"@types/ws@^7.4.7": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -2590,7 +2569,7 @@ abbrev@^1.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.5, accepts@~1.3.7: +accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== @@ -2937,11 +2916,6 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - async@^3.2.3: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" @@ -3264,11 +3238,6 @@ byte-size@8.1.1: resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-8.1.1.tgz#3424608c62d59de5bfda05d31e0313c6174842ae" integrity sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg== -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - cacache@^17.0.0: version "17.1.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" @@ -3640,26 +3609,6 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.1: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -7600,7 +7549,7 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== @@ -7876,11 +7825,6 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nocache@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.1.tgz#54d8b53a7e0a0aa1a288cfceab8a3cefbcde67d4" - integrity sha512-Gh39xwJwBKy0OvFmWfBs/vDO4Nl7JhnJtkqNP76OUinQz7BiMoszHYrIDHHAaqVl/QKVxCEy4ZxC/XZninu7nQ== - node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" @@ -8312,11 +8256,6 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -8762,15 +8701,6 @@ pretty-format@^29.6.2: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -9296,7 +9226,7 @@ safe-array-concat@^1.0.1: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -10620,11 +10550,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -10881,13 +10806,6 @@ write-pkg@4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" -ws@^6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.3.tgz#ccc96e4add5fd6fedbc491903075c85c5a11d9ee" - integrity sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA== - dependencies: - async-limiter "~1.0.0" - ws@^7.4.6: version "7.5.10" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"