From a549b9b0c96163ad9a4aae4702b8142d97b000f9 Mon Sep 17 00:00:00 2001 From: Colum Ferry Date: Thu, 18 Jul 2024 18:46:06 +0100 Subject: [PATCH] feat(module-federation): use proxy servers to proxy to single file server for static remotes (#26782) ## Current Behavior Remotes that are served for a host are usually served from a single file server running on a single port. We perform some mapping logic during the build of the host application to update the locations the remotes can be found at to point to the single file server. This works, but it's also wrong, as it breaks the flow that users expect. It also breaks dynamic remotes. ## Expected Behavior Continue to serve the remotes from a single file server, as this helps reduce the amount of resources used on developers machines. Use express to create proxy servers that will proxy requests from the original remote location to the single file server. This allows applications to continue to work without us having to interfere and map any remote locations. It also solves the issue with dynamic remotes. ## Related Issue(s) Fixes #26318 --- e2e/react/src/react-module-federation.test.ts | 100 ++---- package.json | 3 +- packages/angular/ng-package.json | 3 + .../lib/build-static-remotes.ts | 7 +- .../module-federation-dev-server/lib/index.ts | 1 - .../lib/start-static-remotes-file-server.ts | 8 +- .../module-federation-dev-server.impl.ts | 43 +-- .../module-federation-dev-server.impl.ts | 86 ++--- .../host/lib/add-module-federation-files.ts | 9 +- .../remote/lib/add-remote-to-dynamic-host.ts | 18 +- packages/webpack/package.json | 2 + .../module-federation/get-remotes-for-host.ts | 15 +- .../parse-static-remotes-config.ts | 5 +- .../module-federation/start-remote-proxies.ts | 27 ++ pnpm-lock.yaml | 306 ++++++------------ 15 files changed, 253 insertions(+), 380 deletions(-) rename packages/{angular/src/executors/module-federation-dev-server/lib => webpack/src/utils/module-federation}/parse-static-remotes-config.ts (83%) create mode 100644 packages/webpack/src/utils/module-federation/start-remote-proxies.ts diff --git a/e2e/react/src/react-module-federation.test.ts b/e2e/react/src/react-module-federation.test.ts index d55ca519bb1a2..87cbd97baf7fa 100644 --- a/e2e/react/src/react-module-federation.test.ts +++ b/e2e/react/src/react-module-federation.test.ts @@ -20,13 +20,13 @@ import { join } from 'path'; import { createTreeWithEmptyWorkspace } from 'nx/src/devkit-testing-exports'; describe('React Module Federation', () => { - beforeAll(() => { - newProject({ packages: ['@nx/react'] }); - }); + describe('Default Configuration', () => { + beforeAll(() => { + newProject({ packages: ['@nx/react'] }); + }); - afterAll(() => cleanupProject()); + afterAll(() => cleanupProject()); - describe('Default Configuration', () => { it.each` js ${false} @@ -39,9 +39,6 @@ describe('React Module Federation', () => { const remote2 = uniq('remote2'); const remote3 = uniq('remote3'); - // Since we are using a single-file server for the remotes - const defaultRemotePort = 4201; - runCLI( `generate @nx/react:host ${shell} --remotes=${remote1},${remote2},${remote3} --e2eTestRunner=cypress --style=css --no-interactive --skipFormat --js=${js}` ); @@ -65,54 +62,6 @@ describe('React Module Federation', () => { ), }); - if (js) { - updateFile( - `apps/${shell}/webpack.config.js`, - stripIndents` - const { composePlugins, withNx } = require('@nx/webpack'); - const { withReact } = require('@nx/react'); - const { withModuleFederation } = require('@nx/react/module-federation'); - - const baseConfig = require('./module-federation.config'); - - const config = { - ...baseConfig, - remotes: [ - '${remote1}', - ['${remote2}', 'http://localhost:${defaultRemotePort}/${remote2}/remoteEntry.js'], - ['${remote3}', 'http://localhost:${defaultRemotePort}/${remote3}/remoteEntry.js'], - ], - }; - - // Nx plugins for webpack to build config object from Nx options and context. - module.exports = composePlugins(withNx(), withReact(), withModuleFederation(config)); - ` - ); - } else { - updateFile( - `apps/${shell}/webpack.config.ts`, - stripIndents` - import { composePlugins, withNx } from '@nx/webpack'; - import { withReact } from '@nx/react'; - import { withModuleFederation } from '@nx/react/module-federation'; - - import baseConfig from './module-federation.config'; - - const config = { - ...baseConfig, - remotes: [ - '${remote1}', - ['${remote2}', 'http://localhost:${defaultRemotePort}/${remote2}/remoteEntry.js'], - ['${remote3}', 'http://localhost:${defaultRemotePort}/${remote3}/remoteEntry.js'], - ], - }; - - // Nx plugins for webpack to build config object from Nx options and context. - export default composePlugins(withNx(), withReact(), withModuleFederation(config)); - ` - ); - } - updateFile( `apps/${shell}-e2e/src/integration/app.spec.${js ? 'js' : 'ts'}`, stripIndents` @@ -153,11 +102,7 @@ describe('React Module Federation', () => { output.includes(`http://localhost:${readPort(shell)}`) ); - await killProcessAndPorts( - serveResult.pid, - readPort(shell), - defaultRemotePort - ); + await killProcessAndPorts(serveResult.pid, readPort(shell)); if (runE2ETests()) { const e2eResultsSwc = await runCommandUntil( @@ -165,11 +110,7 @@ describe('React Module Federation', () => { (output) => output.includes('All specs passed!') ); - await killProcessAndPorts( - e2eResultsSwc.pid, - readPort(shell), - defaultRemotePort - ); + await killProcessAndPorts(e2eResultsSwc.pid, readPort(shell)); const e2eResultsTsNode = await runCommandUntil( `e2e ${shell}-e2e --no-watch --verbose`, @@ -179,11 +120,7 @@ describe('React Module Federation', () => { env: { NX_PREFER_TS_NODE: 'true' }, } ); - await killProcessAndPorts( - e2eResultsTsNode.pid, - readPort(shell), - defaultRemotePort - ); + await killProcessAndPorts(e2eResultsTsNode.pid, readPort(shell)); } }, 500_000 @@ -924,14 +861,20 @@ describe('React Module Federation', () => { }); afterAll(() => cleanupProject()); - it('should load remote dynamic module', async () => { + it('ttt should load remote dynamic module', async () => { const shell = uniq('shell'); const remote = uniq('remote'); + const remotePort = 4205; runCLI( `generate @nx/react:host ${shell} --remotes=${remote} --e2eTestRunner=cypress --dynamic=true --project-name-and-root-format=as-provided --no-interactive --skipFormat` ); + updateJson(`${remote}/project.json`, (project) => { + project.targets.serve.options.port = remotePort; + return project; + }); + // Webpack prod config should not exists when loading dynamic modules expect( fileExists(`${tmpProjPath()}/${shell}/webpack.config.prod.ts`) @@ -942,12 +885,20 @@ describe('React Module Federation', () => { ) ).toBeTruthy(); + updateJson( + `${shell}/src/assets/module-federation.manifest.json`, + (json) => { + return { + [remote]: `http://localhost:${remotePort}`, + }; + } + ); + const manifest = readJson( `${shell}/src/assets/module-federation.manifest.json` ); - expect(manifest[remote]).toBeDefined(); - expect(manifest[remote]).toEqual('http://localhost:4201'); + expect(manifest[remote]).toEqual('http://localhost:4205'); // update e2e updateFile( @@ -981,7 +932,6 @@ describe('React Module Federation', () => { expect(remoteOutput).toContain('Successfully ran target build'); const shellPort = readPort(shell); - const remotePort = readPort(remote); if (runE2ETests()) { // Serve Remote since it is dynamic and won't be started with the host diff --git a/package.json b/package.json index 108a778d2708c..2da74ed931eb8 100644 --- a/package.json +++ b/package.json @@ -180,7 +180,7 @@ "eslint-plugin-react": "7.32.2", "eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-storybook": "^0.6.12", - "express": "^4.18.1", + "express": "^4.19.2", "fast-xml-parser": "^4.2.7", "figures": "3.2.0", "file-type": "^16.2.0", @@ -192,6 +192,7 @@ "gpt3-tokenizer": "^1.1.5", "handlebars": "4.7.7", "html-webpack-plugin": "5.5.0", + "http-proxy-middleware": "^3.0.0", "http-server": "14.1.0", "husky": "^8.0.1", "identity-obj-proxy": "3.0.0", diff --git a/packages/angular/ng-package.json b/packages/angular/ng-package.json index b9bfbdce2d90c..1973ef2d3805c 100644 --- a/packages/angular/ng-package.json +++ b/packages/angular/ng-package.json @@ -21,6 +21,9 @@ "ts-node", "tsconfig-paths", "semver", + "webpack", + "express", + "http-proxy-middleware", "http-server", "magic-string", "enquirer", diff --git a/packages/angular/src/executors/module-federation-dev-server/lib/build-static-remotes.ts b/packages/angular/src/executors/module-federation-dev-server/lib/build-static-remotes.ts index e8e4cb8a1e253..57ad6d8474904 100644 --- a/packages/angular/src/executors/module-federation-dev-server/lib/build-static-remotes.ts +++ b/packages/angular/src/executors/module-federation-dev-server/lib/build-static-remotes.ts @@ -1,10 +1,10 @@ import { type Schema } from '../schema'; import { type ExecutorContext, logger } from '@nx/devkit'; -import type { StaticRemotesConfig } from './parse-static-remotes-config'; import { workspaceDataDirectory } from 'nx/src/utils/cache-directory'; import { fork } from 'node:child_process'; import { join } from 'node:path'; import { createWriteStream } from 'node:fs'; +import type { StaticRemotesConfig } from '@nx/webpack/src/utils/module-federation/parse-static-remotes-config'; export async function buildStaticRemotes( staticRemotesConfig: StaticRemotesConfig, @@ -23,9 +23,6 @@ export async function buildStaticRemotes( staticRemotesConfig.config[app].urlSegment }`; } - process.env.NX_MF_DEV_SERVER_STATIC_REMOTES = JSON.stringify( - mappedLocationOfRemotes - ); await new Promise((res) => { logger.info( @@ -81,4 +78,6 @@ export async function buildStaticRemotes( process.on('SIGTERM', () => staticProcess.kill('SIGTERM')); process.on('exit', () => staticProcess.kill('SIGTERM')); }); + + return mappedLocationOfRemotes; } diff --git a/packages/angular/src/executors/module-federation-dev-server/lib/index.ts b/packages/angular/src/executors/module-federation-dev-server/lib/index.ts index 7b020a218cf4d..331719948e2b9 100644 --- a/packages/angular/src/executors/module-federation-dev-server/lib/index.ts +++ b/packages/angular/src/executors/module-federation-dev-server/lib/index.ts @@ -1,5 +1,4 @@ export * from './build-static-remotes'; export * from './normalize-options'; -export * from './parse-static-remotes-config'; export * from './start-dev-remotes'; export * from './start-static-remotes-file-server'; diff --git a/packages/angular/src/executors/module-federation-dev-server/lib/start-static-remotes-file-server.ts b/packages/angular/src/executors/module-federation-dev-server/lib/start-static-remotes-file-server.ts index d15e028b3e2e9..135d49daca440 100644 --- a/packages/angular/src/executors/module-federation-dev-server/lib/start-static-remotes-file-server.ts +++ b/packages/angular/src/executors/module-federation-dev-server/lib/start-static-remotes-file-server.ts @@ -3,13 +3,19 @@ import { type Schema } from '../schema'; import fileServerExecutor from '@nx/web/src/executors/file-server/file-server.impl'; import { join } from 'path'; import { cpSync } from 'fs'; -import type { StaticRemotesConfig } from './parse-static-remotes-config'; +import type { StaticRemotesConfig } from '@nx/webpack/src/utils/module-federation/parse-static-remotes-config'; export function startStaticRemotesFileServer( staticRemotesConfig: StaticRemotesConfig, context: ExecutorContext, options: Schema ) { + if ( + !staticRemotesConfig.remotes || + staticRemotesConfig.remotes.length === 0 + ) { + return; + } let shouldMoveToCommonLocation = false; let commonOutputDirectory: string; for (const app of staticRemotesConfig.remotes) { diff --git a/packages/angular/src/executors/module-federation-dev-server/module-federation-dev-server.impl.ts b/packages/angular/src/executors/module-federation-dev-server/module-federation-dev-server.impl.ts index 4cd42dfea615f..655f4d666e8ff 100644 --- a/packages/angular/src/executors/module-federation-dev-server/module-federation-dev-server.impl.ts +++ b/packages/angular/src/executors/module-federation-dev-server/module-federation-dev-server.impl.ts @@ -7,7 +7,6 @@ import { type Schema } from './schema'; import { buildStaticRemotes, normalizeOptions, - parseStaticRemotesConfig, startRemotes, startStaticRemotesFileServer, } from './lib'; @@ -31,6 +30,8 @@ import { } from '../../builders/utilities/module-federation'; import { extname, join } from 'path'; import { existsSync } from 'fs'; +import { startRemoteProxies } from '@nx/webpack/src/utils/module-federation/start-remote-proxies'; +import { parseStaticRemotesConfig } from '@nx/webpack/src/utils/module-federation/parse-static-remotes-config'; export async function* moduleFederationDevServerExecutor( schema: Schema, @@ -39,7 +40,6 @@ export async function* moduleFederationDevServerExecutor( // Force Node to resolve to look for the nx binary that is inside node_modules const nxBin = require.resolve('nx/bin/nx'); const options = normalizeOptions(schema); - options.staticRemotesPort ??= options.port + 1; const { projects: workspaceProjects } = readProjectsConfigurationFromProjectGraph(context.projectGraph); @@ -123,30 +123,23 @@ export async function* moduleFederationDevServerExecutor( pathToManifestFile ); + options.staticRemotesPort ??= remotes.staticRemotePort; + // Set NX_MF_DEV_REMOTES for the Nx Runtime Library Control Plugin process.env.NX_MF_DEV_REMOTES = JSON.stringify( remotes.devRemotes.map((r) => (typeof r === 'string' ? r : r.remoteName)) ); - if (remotes.devRemotes.length > 0 && !schema.staticRemotesPort) { - options.staticRemotesPort = options.devRemotes.reduce((portToUse, r) => { - const remoteName = typeof r === 'string' ? r : r.remoteName; - const remotePort = - context.projectGraph.nodes[remoteName].data.targets['serve'].options - .port; - if (remotePort >= portToUse) { - return remotePort + 1; - } else { - return portToUse; - } - }, options.staticRemotesPort); - } - const staticRemotesConfig = parseStaticRemotesConfig( - remotes.staticRemotes, + [...remotes.staticRemotes, ...remotes.dynamicRemotes], context ); - await buildStaticRemotes(staticRemotesConfig, nxBin, context, options); + const mappedLocationsOfStaticRemotes = await buildStaticRemotes( + staticRemotesConfig, + nxBin, + context, + options + ); const devRemoteIters = await startRemotes( remotes.devRemotes, @@ -156,18 +149,13 @@ export async function* moduleFederationDevServerExecutor( 'serve' ); - const dynamicRemoteIters = await startRemotes( - remotes.dynamicRemotes, - workspaceProjects, - options, + const staticRemotesIter = startStaticRemotesFileServer( + staticRemotesConfig, context, - 'serve-static' + options ); - const staticRemotesIter = - remotes.staticRemotes.length > 0 - ? startStaticRemotesFileServer(staticRemotesConfig, context, options) - : undefined; + startRemoteProxies(staticRemotesConfig, mappedLocationsOfStaticRemotes); const removeBaseUrlEmission = (iter: AsyncIterable) => mapAsyncIterable(iter, (v) => ({ @@ -178,7 +166,6 @@ export async function* moduleFederationDevServerExecutor( return yield* combineAsyncIterables( removeBaseUrlEmission(currIter), ...devRemoteIters.map(removeBaseUrlEmission), - ...dynamicRemoteIters.map(removeBaseUrlEmission), ...(staticRemotesIter ? [removeBaseUrlEmission(staticRemotesIter)] : []), createAsyncIterable<{ success: true; baseUrl: string }>( async ({ next, done }) => { diff --git a/packages/react/src/executors/module-federation-dev-server/module-federation-dev-server.impl.ts b/packages/react/src/executors/module-federation-dev-server/module-federation-dev-server.impl.ts index 8dc8b75e27cff..6a30320eb2790 100644 --- a/packages/react/src/executors/module-federation-dev-server/module-federation-dev-server.impl.ts +++ b/packages/react/src/executors/module-federation-dev-server/module-federation-dev-server.impl.ts @@ -20,10 +20,15 @@ import { import { waitForPortOpen } from '@nx/web/src/utils/wait-for-port-open'; import { workspaceDataDirectory } from 'nx/src/utils/cache-directory'; import { fork } from 'node:child_process'; -import { basename, dirname, join } from 'node:path'; -import { createWriteStream, cpSync } from 'node:fs'; +import { join } from 'node:path'; +import { cpSync, createWriteStream } from 'node:fs'; import { existsSync } from 'fs'; import { extname } from 'path'; +import { startRemoteProxies } from '@nx/webpack/src/utils/module-federation/start-remote-proxies'; +import { + parseStaticRemotesConfig, + type StaticRemotesConfig, +} from '@nx/webpack/src/utils/module-federation/parse-static-remotes-config'; type ModuleFederationDevServerOptions = WebDevServerOptions & { devRemotes?: ( @@ -56,6 +61,12 @@ function startStaticRemotesFileServer( context: ExecutorContext, options: ModuleFederationDevServerOptions ) { + if ( + !staticRemotesConfig.remotes || + staticRemotesConfig.remotes.length === 0 + ) { + return; + } let shouldMoveToCommonLocation = false; let commonOutputDirectory: string; for (const app of staticRemotesConfig.remotes) { @@ -238,45 +249,14 @@ async function buildStaticRemotes( process.on('SIGTERM', () => staticProcess.kill('SIGTERM')); process.on('exit', () => staticProcess.kill('SIGTERM')); }); -} - -type StaticRemoteConfig = { - basePath: string; - outputPath: string; - urlSegment: string; -}; - -type StaticRemotesConfig = { - remotes: string[]; - config: Record | undefined; -}; - -export function parseStaticRemotesConfig( - staticRemotes: string[] | undefined, - context: ExecutorContext -): StaticRemotesConfig { - if (!staticRemotes?.length) { - return { remotes: [], config: undefined }; - } - - const config: Record = {}; - for (const app of staticRemotes) { - const outputPath = - context.projectGraph.nodes[app].data.targets['build'].options.outputPath; - const basePath = dirname(outputPath); - const urlSegment = basename(outputPath); - config[app] = { basePath, outputPath, urlSegment }; - } - return { remotes: staticRemotes, config }; + return mappedLocationOfRemotes; } export default async function* moduleFederationDevServer( options: ModuleFederationDevServerOptions, context: ExecutorContext ): AsyncIterableIterator<{ success: boolean; baseUrl?: string }> { - const initialStaticRemotesPorts = options.staticRemotesPort; - options.staticRemotesPort ??= options.port + 1; // Force Node to resolve to look for the nx binary that is inside node_modules const nxBin = require.resolve('nx/bin/nx'); const currIter = options.static @@ -344,31 +324,23 @@ export default async function* moduleFederationDevServer( }, pathToManifestFile ); + options.staticRemotesPort ??= remotes.staticRemotePort; // Set NX_MF_DEV_REMOTES for the Nx Runtime Library Control Plugin process.env.NX_MF_DEV_REMOTES = JSON.stringify( remotes.devRemotes.map((r) => (typeof r === 'string' ? r : r.remoteName)) ); - if (remotes.devRemotes.length > 0 && !initialStaticRemotesPorts) { - options.staticRemotesPort = options.devRemotes.reduce((portToUse, r) => { - const remoteName = typeof r === 'string' ? r : r.remoteName; - const remotePort = - context.projectGraph.nodes[remoteName].data.targets['serve'].options - .port; - if (remotePort >= portToUse) { - return remotePort + 1; - } else { - return portToUse; - } - }, options.staticRemotesPort); - } - const staticRemotesConfig = parseStaticRemotesConfig( - remotes.staticRemotes, + [...remotes.staticRemotes, ...remotes.dynamicRemotes], context ); - await buildStaticRemotes(staticRemotesConfig, nxBin, context, options); + const mappedLocationsOfStaticRemotes = await buildStaticRemotes( + staticRemotesConfig, + nxBin, + context, + options + ); const devRemoteIters = await startRemotes( remotes.devRemotes, @@ -376,22 +348,18 @@ export default async function* moduleFederationDevServer( options, 'serve' ); - const dynamicRemotesIters = await startRemotes( - remotes.dynamicRemotes, + + const staticRemotesIter = startStaticRemotesFileServer( + staticRemotesConfig, context, - options, - 'serve-static' + options ); - const staticRemotesIter = - remotes.staticRemotes.length > 0 - ? startStaticRemotesFileServer(staticRemotesConfig, context, options) - : undefined; + startRemoteProxies(staticRemotesConfig, mappedLocationsOfStaticRemotes); return yield* combineAsyncIterables( currIter, ...devRemoteIters, - ...dynamicRemotesIters, ...(staticRemotesIter ? [staticRemotesIter] : []), createAsyncIterable<{ success: true; baseUrl: string }>( async ({ next, done }) => { diff --git a/packages/react/src/generators/host/lib/add-module-federation-files.ts b/packages/react/src/generators/host/lib/add-module-federation-files.ts index 9aaf8e35e7d4f..a3a6f97326811 100644 --- a/packages/react/src/generators/host/lib/add-module-federation-files.ts +++ b/packages/react/src/generators/host/lib/add-module-federation-files.ts @@ -87,7 +87,14 @@ export function addModuleFederationFiles( processWebpackConfig(options, host, 'webpack.config.prod.js'); processWebpackConfig(options, host, 'webpack.config.prod.ts'); if (!host.exists(pathToMFManifest)) { - host.write(pathToMFManifest, '{}'); + host.write( + pathToMFManifest, + `{ + ${defaultRemoteManifest + .map(({ name, port }) => `"${name}": "http://localhost:${port}"`) + .join(',\n')} + }` + ); } } } diff --git a/packages/react/src/generators/remote/lib/add-remote-to-dynamic-host.ts b/packages/react/src/generators/remote/lib/add-remote-to-dynamic-host.ts index 42bd6d7b97964..fb1349493ae10 100644 --- a/packages/react/src/generators/remote/lib/add-remote-to-dynamic-host.ts +++ b/packages/react/src/generators/remote/lib/add-remote-to-dynamic-host.ts @@ -6,12 +6,14 @@ export function addRemoteToDynamicHost( remotePort: number, pathToMfManifest: string ) { - const current = tree.read(pathToMfManifest, 'utf8'); - tree.write( - pathToMfManifest, - JSON.stringify({ - ...JSON.parse(current), - [remoteName]: `http://localhost:${remotePort}`, - }) - ); + if (tree.exists(pathToMfManifest)) { + const current = tree.read(pathToMfManifest, 'utf8'); + tree.write( + pathToMfManifest, + JSON.stringify({ + ...JSON.parse(current), + [remoteName]: `http://localhost:${remotePort}`, + }) + ); + } } diff --git a/packages/webpack/package.json b/packages/webpack/package.json index b14c8422fd250..e4224dae1bba4 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -42,7 +42,9 @@ "copy-webpack-plugin": "^10.2.4", "css-loader": "^6.4.0", "css-minimizer-webpack-plugin": "^5.0.0", + "express": "^4.19.2", "fork-ts-checker-webpack-plugin": "7.2.13", + "http-proxy-middleware": "^3.0.0", "less": "4.1.3", "less-loader": "11.1.0", "license-webpack-plugin": "^4.0.2", diff --git a/packages/webpack/src/utils/module-federation/get-remotes-for-host.ts b/packages/webpack/src/utils/module-federation/get-remotes-for-host.ts index 39495d730a9b2..93646ab0d7397 100644 --- a/packages/webpack/src/utils/module-federation/get-remotes-for-host.ts +++ b/packages/webpack/src/utils/module-federation/get-remotes-for-host.ts @@ -121,8 +121,8 @@ export function getRemotes( ); const staticRemotes = knownRemotes.filter((r) => !devServeApps.has(r)); - const devServeRemotes = [...knownRemotes, ...dynamicRemotes].filter((r) => - devServeApps.has(r) + const devServeRemotes = [...knownRemotes, ...knownDynamicRemotes].filter( + (r) => devServeApps.has(r) ); const staticDynamicRemotes = knownDynamicRemotes.filter( (r) => !devServeApps.has(r) @@ -130,12 +130,23 @@ export function getRemotes( const remotePorts = [...devServeRemotes, ...staticDynamicRemotes].map( (r) => context.projectGraph.nodes[r].data.targets['serve'].options.port ); + const staticRemotePort = + Math.max( + ...([ + ...remotePorts, + ...staticRemotes.map( + (r) => + context.projectGraph.nodes[r].data.targets['serve'].options.port + ), + ] as number[]) + ) + 1; return { staticRemotes, devRemotes: devServeRemotes, dynamicRemotes: staticDynamicRemotes, remotePorts, + staticRemotePort, }; } diff --git a/packages/angular/src/executors/module-federation-dev-server/lib/parse-static-remotes-config.ts b/packages/webpack/src/utils/module-federation/parse-static-remotes-config.ts similarity index 83% rename from packages/angular/src/executors/module-federation-dev-server/lib/parse-static-remotes-config.ts rename to packages/webpack/src/utils/module-federation/parse-static-remotes-config.ts index baf79ada0ce42..460b6f7a2e3e8 100644 --- a/packages/angular/src/executors/module-federation-dev-server/lib/parse-static-remotes-config.ts +++ b/packages/webpack/src/utils/module-federation/parse-static-remotes-config.ts @@ -5,6 +5,7 @@ export type StaticRemoteConfig = { basePath: string; outputPath: string; urlSegment: string; + port: number; }; export type StaticRemotesConfig = { @@ -26,7 +27,9 @@ export function parseStaticRemotesConfig( context.projectGraph.nodes[app].data.targets['build'].options.outputPath; const basePath = dirname(outputPath); const urlSegment = basename(outputPath); - config[app] = { basePath, outputPath, urlSegment }; + const port = + context.projectGraph.nodes[app].data.targets['serve'].options.port; + config[app] = { basePath, outputPath, urlSegment, port }; } return { remotes: staticRemotes, config }; diff --git a/packages/webpack/src/utils/module-federation/start-remote-proxies.ts b/packages/webpack/src/utils/module-federation/start-remote-proxies.ts new file mode 100644 index 0000000000000..b3f004d4b4235 --- /dev/null +++ b/packages/webpack/src/utils/module-federation/start-remote-proxies.ts @@ -0,0 +1,27 @@ +import type { Express } from 'express'; +import { logger } from '@nx/devkit'; +import { StaticRemotesConfig } from './parse-static-remotes-config'; + +export function startRemoteProxies( + staticRemotesConfig: StaticRemotesConfig, + mappedLocationsOfRemotes: Record +) { + const { createProxyMiddleware } = require('http-proxy-middleware'); + const express = require('express'); + logger.info(`NX Starting static remotes proxies...`); + for (const app of staticRemotesConfig.remotes) { + const expressProxy: Express = express(); + expressProxy.use( + createProxyMiddleware({ + target: mappedLocationsOfRemotes[app], + changeOrigin: true, + }) + ); + const proxyServer = expressProxy.listen( + staticRemotesConfig.config[app].port + ); + process.on('SIGTERM', () => proxyServer.close()); + process.on('exit', () => proxyServer.close()); + } + logger.info(`NX Static remotes proxies started successfully`); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b17a3ed0df62..54c1de3e1c854 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -630,8 +630,8 @@ devDependencies: specifier: ^0.6.12 version: 0.6.12(eslint@8.57.0)(typescript@5.5.3) express: - specifier: ^4.18.1 - version: 4.18.1 + specifier: ^4.19.2 + version: 4.19.2 fast-xml-parser: specifier: ^4.2.7 version: 4.2.7 @@ -665,6 +665,9 @@ devDependencies: html-webpack-plugin: specifier: 5.5.0 version: 5.5.0(webpack@5.88.0) + http-proxy-middleware: + specifier: ^3.0.0 + version: 3.0.0 http-server: specifier: 14.1.0 version: 14.1.0 @@ -9239,7 +9242,7 @@ packages: resolution: {integrity: sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 dev: true /@ljharb/through@2.3.13: @@ -13660,7 +13663,7 @@ packages: esbuild-plugins-node-modules-polyfill: 1.6.1(esbuild@0.17.6) execa: 5.1.1 exit-hook: 2.2.1 - express: 4.18.2 + express: 4.19.2 fs-extra: 10.1.0 get-port: 5.1.1 gunzip-maybe: 1.4.2 @@ -14823,7 +14826,7 @@ packages: '@types/find-cache-dir': 3.2.1 browser-assert: 1.2.1 es-module-lexer: 0.9.3 - express: 4.18.2 + express: 4.19.2 find-cache-dir: 3.3.2 fs-extra: 11.2.0 magic-string: 0.30.10 @@ -14861,7 +14864,7 @@ packages: case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 css-loader: 6.10.0(webpack@5.88.0) - express: 4.18.2 + express: 4.19.2 fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.5.3)(webpack@5.88.0) fs-extra: 11.2.0 html-webpack-plugin: 5.5.0(webpack@5.88.0) @@ -15069,7 +15072,7 @@ packages: cli-table3: 0.6.3 compression: 1.7.4 detect-port: 1.5.1 - express: 4.18.2 + express: 4.19.2 fs-extra: 11.1.1 globby: 11.1.0 ip: 2.0.0 @@ -18539,7 +18542,7 @@ packages: /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 is-array-buffer: 3.0.2 dev: true @@ -18578,10 +18581,10 @@ packages: resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.0 es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 is-string: 1.0.7 dev: true @@ -18607,11 +18610,11 @@ packages: resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 dev: true /array.prototype.flat@1.3.1: @@ -18628,7 +18631,7 @@ packages: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.0 @@ -18648,7 +18651,7 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.0 @@ -18669,10 +18672,10 @@ packages: engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 dev: true @@ -18869,7 +18872,7 @@ packages: /axios@1.6.2: resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} dependencies: - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.2 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -18879,7 +18882,7 @@ packages: /axios@1.7.2: resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} dependencies: - follow-redirects: 1.15.6 + follow-redirects: 1.15.6(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -19425,26 +19428,6 @@ packages: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true - /body-parser@1.20.0: - resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.10.3 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -19463,6 +19446,7 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + dev: true /body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} @@ -19482,7 +19466,6 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true /bonjour-service@1.0.14: resolution: {integrity: sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==} @@ -19828,8 +19811,9 @@ packages: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.2.0 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} @@ -19840,7 +19824,6 @@ packages: function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: true /call-me-maybe@1.0.1: resolution: {integrity: sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==} @@ -20508,11 +20491,11 @@ packages: /content-type@1.0.4: resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} engines: {node: '>= 0.6'} + dev: true /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - dev: true /conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} @@ -20694,11 +20677,11 @@ packages: /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} + dev: true /cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - dev: true /cookies@0.8.0: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} @@ -21662,14 +21645,6 @@ packages: engines: {node: '>=10'} dev: true - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - /define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -21677,7 +21652,6 @@ packages: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: true /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} @@ -21692,7 +21666,7 @@ packages: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 dev: true @@ -21700,8 +21674,8 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 dev: true @@ -22228,14 +22202,14 @@ packages: resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 es-to-primitive: 1.2.1 function-bind: 1.1.2 function.prototype.name: 1.1.5 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 get-symbol-description: 1.0.0 has: 1.0.3 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 has-symbols: 1.0.3 internal-slot: 1.0.5 is-callable: 1.2.7 @@ -22244,7 +22218,7 @@ packages: is-shared-array-buffer: 1.0.2 is-string: 1.0.7 is-weakref: 1.0.2 - object-inspect: 1.12.2 + object-inspect: 1.13.1 object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.5.1 @@ -22261,15 +22235,15 @@ packages: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + call-bind: 1.0.7 es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 @@ -22304,25 +22278,23 @@ packages: engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 - dev: true /es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - dev: true /es-iterator-helpers@1.0.15: resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} dependencies: asynciterator.prototype: 1.0.0 - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 es-set-tostringtag: 2.0.2 function-bind: 1.1.2 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 globalthis: 1.0.3 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 has-proto: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.5 @@ -22345,7 +22317,7 @@ packages: resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 has-tostringtag: 1.0.0 hasown: 2.0.0 dev: true @@ -23402,45 +23374,6 @@ packages: resolution: {integrity: sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==} dev: true - /express@4.18.1: - resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.0 - content-disposition: 0.5.4 - content-type: 1.0.4 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.10.3 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -23478,6 +23411,7 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color + dev: true /express@4.18.3: resolution: {integrity: sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==} @@ -23487,7 +23421,7 @@ packages: array-flatten: 1.1.1 body-parser: 1.20.2 content-disposition: 0.5.4 - content-type: 1.0.4 + content-type: 1.0.5 cookie: 0.5.0 cookie-signature: 1.0.6 debug: 2.6.9 @@ -23526,7 +23460,7 @@ packages: array-flatten: 1.1.1 body-parser: 1.20.2 content-disposition: 0.5.4 - content-type: 1.0.4 + content-type: 1.0.5 cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 @@ -23555,7 +23489,6 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true /ext-list@2.2.2: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} @@ -23940,7 +23873,7 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true - /follow-redirects@1.15.2(debug@4.3.4): + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -23948,10 +23881,9 @@ packages: peerDependenciesMeta: debug: optional: true - dependencies: - debug: 4.3.4(supports-color@8.1.1) + dev: false - /follow-redirects@1.15.6: + /follow-redirects@1.15.6(debug@4.3.4): resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: @@ -23959,7 +23891,8 @@ packages: peerDependenciesMeta: debug: optional: true - dev: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -24255,7 +24188,7 @@ packages: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 functions-have-names: 1.2.3 @@ -24265,7 +24198,7 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 functions-have-names: 1.2.3 @@ -24335,6 +24268,7 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 + dev: true /get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} @@ -24345,7 +24279,6 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 - dev: true /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} @@ -24407,8 +24340,8 @@ packages: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 dev: true /get-symbol-from-current-process-h@1.0.2: @@ -24766,7 +24699,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 /got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} @@ -24896,16 +24829,10 @@ packages: engines: {node: '>=8'} dev: true - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - dependencies: - get-intrinsic: 1.2.2 - /has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: es-define-property: 1.0.0 - dev: true /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} @@ -25172,6 +25099,7 @@ packages: setprototypeof: 1.1.1 statuses: 1.5.0 toidentifier: 1.0.0 + dev: false /http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} @@ -25293,7 +25221,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -25654,7 +25582,7 @@ packages: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 has: 1.0.3 side-channel: 1.0.4 dev: true @@ -25748,15 +25676,15 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-tostringtag: 1.0.0 dev: true /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-typed-array: 1.1.12 dev: true @@ -25787,7 +25715,7 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-tostringtag: 1.0.0 dev: true @@ -25872,7 +25800,7 @@ packages: /is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 dev: true /is-fullwidth-code-point@3.0.0: @@ -25967,7 +25895,7 @@ packages: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 dev: true @@ -26069,7 +25997,7 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-tostringtag: 1.0.0 dev: true @@ -26080,7 +26008,7 @@ packages: /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 dev: true /is-ssh@1.4.0: @@ -26136,7 +26064,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + call-bind: 1.0.7 es-abstract: 1.22.3 for-each: 0.3.3 has-tostringtag: 1.0.0 @@ -26167,14 +26095,14 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 dev: true /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 dev: true /is-what@3.14.1: @@ -26314,7 +26242,7 @@ packages: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.4 set-function-name: 2.0.1 @@ -27242,7 +27170,7 @@ packages: escape-html: 1.0.3 fresh: 0.5.2 http-assert: 1.5.0 - http-errors: 1.7.3 + http-errors: 1.8.1 is-generator-function: 1.0.10 koa-compose: 4.1.0 koa-convert: 1.2.0 @@ -30078,18 +30006,14 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - /object-inspect@1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} - /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 dev: true @@ -30102,7 +30026,7 @@ packages: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 @@ -30130,7 +30054,7 @@ packages: resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 dev: true @@ -30138,10 +30062,10 @@ packages: /object.groupby@1.0.1: resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 dev: true /object.hasown@1.1.2: @@ -30164,7 +30088,7 @@ packages: resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 dev: true @@ -32456,13 +32380,6 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true - /qs@6.10.3: - resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true - /qs@6.10.4: resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} engines: {node: '>=0.6'} @@ -32536,6 +32453,7 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 + dev: true /raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} @@ -32545,7 +32463,6 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true /raw-loader@4.0.2(webpack@5.88.0): resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} @@ -33112,10 +33029,10 @@ packages: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 dev: true @@ -33163,7 +33080,7 @@ packages: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 set-function-name: 2.0.1 dev: true @@ -33666,8 +33583,8 @@ packages: resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 dev: true @@ -33685,8 +33602,8 @@ packages: /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-regex: 1.1.4 dev: true @@ -34021,16 +33938,6 @@ packages: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: true - /set-function-length@1.2.0: - resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - /set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -34041,15 +33948,14 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: true /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 + define-data-property: 1.1.4 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 dev: true /setimmediate-napi@1.0.6: @@ -34068,6 +33974,7 @@ packages: /setprototypeof@1.1.1: resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + dev: false /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -34146,9 +34053,9 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.12.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -34749,7 +34656,7 @@ packages: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 dev: true @@ -34757,7 +34664,7 @@ packages: /string.prototype.trimend@1.0.5: resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 dev: true @@ -34765,7 +34672,7 @@ packages: /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 dev: true @@ -34773,7 +34680,7 @@ packages: /string.prototype.trimstart@1.0.5: resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 dev: true @@ -34781,7 +34688,7 @@ packages: /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.3 dev: true @@ -35640,6 +35547,7 @@ packages: /toidentifier@1.0.0: resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} engines: {node: '>=0.6'} + dev: false /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} @@ -36087,8 +35995,8 @@ packages: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-typed-array: 1.1.12 dev: true @@ -36096,7 +36004,7 @@ packages: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -36107,7 +36015,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -36116,7 +36024,7 @@ packages: /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 is-typed-array: 1.1.12 dev: true @@ -36194,7 +36102,7 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -37658,7 +37566,7 @@ packages: compression: 1.7.4 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 - express: 4.18.2 + express: 4.19.2 graceful-fs: 4.2.10 html-entities: 2.3.3 http-proxy-middleware: 2.0.6(@types/express@4.17.15) @@ -38073,7 +37981,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 @@ -38084,7 +37992,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + call-bind: 1.0.7 es-abstract: 1.22.3 for-each: 0.3.3 has-tostringtag: 1.0.0