From 11ca695f119a132bd5793ef6ffae568d249a21de Mon Sep 17 00:00:00 2001 From: Maarten Zuidhoorn Date: Fri, 7 Feb 2025 12:16:26 +0100 Subject: [PATCH] Update logging and add tests --- packages/snaps-cli/package.json | 1 - .../src/commands/build/build.test.ts | 55 ++- .../snaps-cli/src/commands/build/build.ts | 32 +- .../src/commands/build/implementation.ts | 6 +- .../src/commands/build/utils.test.ts | 70 ++++ .../snaps-cli/src/commands/build/utils.ts | 29 ++ .../src/types/webpack-bundle-analyzer.d.ts | 22 + packages/snaps-cli/src/utils/logging.test.ts | 23 +- packages/snaps-cli/src/utils/logging.ts | 19 +- packages/snaps-cli/src/utils/steps.test.ts | 38 ++ packages/snaps-cli/src/utils/steps.ts | 22 +- .../webpack/__snapshots__/config.test.ts.snap | 51 ++- packages/snaps-cli/src/webpack/config.ts | 12 +- yarn.lock | 384 +----------------- 14 files changed, 334 insertions(+), 430 deletions(-) create mode 100644 packages/snaps-cli/src/commands/build/utils.test.ts create mode 100644 packages/snaps-cli/src/commands/build/utils.ts create mode 100644 packages/snaps-cli/src/types/webpack-bundle-analyzer.d.ts diff --git a/packages/snaps-cli/package.json b/packages/snaps-cli/package.json index f2ba46b56a..8bc2bccb8c 100644 --- a/packages/snaps-cli/package.json +++ b/packages/snaps-cli/package.json @@ -129,7 +129,6 @@ "@types/jest": "^27.5.1", "@types/node": "18.14.2", "@types/serve-handler": "^6.1.0", - "@types/webpack-bundle-analyzer": "^4.7.0", "@types/yargs": "^17.0.24", "@typescript-eslint/eslint-plugin": "^5.42.1", "@typescript-eslint/parser": "^6.21.0", diff --git a/packages/snaps-cli/src/commands/build/build.test.ts b/packages/snaps-cli/src/commands/build/build.test.ts index 7b26e287b8..cb915416b4 100644 --- a/packages/snaps-cli/src/commands/build/build.test.ts +++ b/packages/snaps-cli/src/commands/build/build.test.ts @@ -1,5 +1,7 @@ import { DEFAULT_SNAP_BUNDLE } from '@metamask/snaps-utils/test-utils'; import fs from 'fs'; +import type { Compiler } from 'webpack'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; import { getMockConfig } from '../../test-utils'; import { evaluate } from '../eval'; @@ -10,6 +12,10 @@ jest.mock('fs'); jest.mock('../eval'); jest.mock('./implementation'); +jest.mock('webpack-bundle-analyzer', () => ({ + BundleAnalyzerPlugin: jest.fn(), +})); + describe('buildHandler', () => { it('builds a snap', async () => { await fs.promises.writeFile('/input.js', DEFAULT_SNAP_BUNDLE); @@ -37,7 +43,54 @@ describe('buildHandler', () => { ); }); - it('does note evaluate if the evaluate option is set to false', async () => { + it('analyzes a snap bundle', async () => { + await fs.promises.writeFile('/input.js', DEFAULT_SNAP_BUNDLE); + + jest.spyOn(console, 'log').mockImplementation(); + const config = getMockConfig('webpack', { + input: '/input.js', + output: { + path: '/foo', + filename: 'output.js', + }, + }); + + const compiler: Compiler = { + // @ts-expect-error: Mock `Compiler` object. + options: { + plugins: [new BundleAnalyzerPlugin()], + }, + }; + + const plugin = jest.mocked(BundleAnalyzerPlugin); + const instance = plugin.mock.instances[0]; + + // @ts-expect-error: Partial `server` mock. + instance.server = Promise.resolve({ + http: { + address: () => 'http://localhost:8888', + }, + }); + + jest.mocked(build).mockResolvedValueOnce(compiler); + + await buildHandler(config, true); + + expect(process.exitCode).not.toBe(1); + expect(build).toHaveBeenCalledWith(config, { + analyze: true, + evaluate: false, + spinner: expect.any(Object), + }); + + expect(console.log).toHaveBeenCalledWith( + expect.stringContaining( + 'Bundle analyzer running at http://localhost:8888.', + ), + ); + }); + + it('does not evaluate if the evaluate option is set to false', async () => { await fs.promises.writeFile('/input.js', DEFAULT_SNAP_BUNDLE); jest.spyOn(console, 'log').mockImplementation(); diff --git a/packages/snaps-cli/src/commands/build/build.ts b/packages/snaps-cli/src/commands/build/build.ts index d6acdb906a..5e7aa28cbf 100644 --- a/packages/snaps-cli/src/commands/build/build.ts +++ b/packages/snaps-cli/src/commands/build/build.ts @@ -1,16 +1,19 @@ import { isFile } from '@metamask/snaps-utils/node'; +import { assert } from '@metamask/utils'; import { resolve as pathResolve } from 'path'; import type { ProcessedConfig, ProcessedWebpackConfig } from '../../config'; import { CommandError } from '../../errors'; import type { Steps } from '../../utils'; -import { executeSteps, info } from '../../utils'; +import { success, executeSteps, info } from '../../utils'; import { evaluate } from '../eval'; import { build } from './implementation'; +import { getBundleAnalyzerPort } from './utils'; type BuildContext = { analyze: boolean; config: ProcessedWebpackConfig; + port?: number; }; const steps: Steps = [ @@ -31,7 +34,22 @@ const steps: Steps = [ task: async ({ analyze, config, spinner }) => { // We don't evaluate the bundle here, because it's done in a separate // step. - return await build(config, { analyze, evaluate: false, spinner }); + const compiler = await build(config, { + analyze, + evaluate: false, + spinner, + }); + + if (analyze) { + return { + analyze, + config, + spinner, + port: await getBundleAnalyzerPort(compiler), + }; + } + + return undefined; }, }, { @@ -49,6 +67,16 @@ const steps: Steps = [ info(`Snap bundle evaluated successfully.`, spinner); }, }, + { + name: 'Running analyser.', + condition: ({ analyze }) => analyze, + task: async ({ spinner, port }) => { + assert(port, 'Port is not defined.'); + success(`Bundle analyzer running at http://localhost:${port}.`, spinner); + + spinner.stop(); + }, + }, ] as const; /** diff --git a/packages/snaps-cli/src/commands/build/implementation.ts b/packages/snaps-cli/src/commands/build/implementation.ts index 3139a22c18..07ed9b9655 100644 --- a/packages/snaps-cli/src/commands/build/implementation.ts +++ b/packages/snaps-cli/src/commands/build/implementation.ts @@ -1,3 +1,5 @@ +import type { Compiler } from 'webpack'; + import type { ProcessedWebpackConfig } from '../../config'; import type { WebpackOptions } from '../../webpack'; import { getCompiler } from '../../webpack'; @@ -14,7 +16,7 @@ export async function build( options?: WebpackOptions, ) { const compiler = await getCompiler(config, options); - return await new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { compiler.run((runError) => { if (runError) { reject(runError); @@ -27,7 +29,7 @@ export async function build( return; } - resolve(); + resolve(compiler); }); }); }); diff --git a/packages/snaps-cli/src/commands/build/utils.test.ts b/packages/snaps-cli/src/commands/build/utils.test.ts new file mode 100644 index 0000000000..e5208d912f --- /dev/null +++ b/packages/snaps-cli/src/commands/build/utils.test.ts @@ -0,0 +1,70 @@ +import type { Compiler } from 'webpack'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; + +import { getBundleAnalyzerPort } from './utils'; + +jest.mock('webpack-bundle-analyzer', () => ({ + BundleAnalyzerPlugin: jest.fn(), +})); + +describe('getBundleAnalyzerPort', () => { + it('returns the port of the bundle analyzer server', async () => { + const compiler: Compiler = { + // @ts-expect-error: Mock `Compiler` object. + options: { + plugins: [new BundleAnalyzerPlugin()], + }, + }; + + const plugin = jest.mocked(BundleAnalyzerPlugin); + const instance = plugin.mock.instances[0]; + + // @ts-expect-error: Partial `server` mock. + instance.server = Promise.resolve({ + http: { + address: () => 'http://localhost:8888', + }, + }); + + const port = await getBundleAnalyzerPort(compiler); + expect(port).toBe(8888); + }); + + it('returns the port of the bundle analyzer server that returns an object', async () => { + const compiler: Compiler = { + // @ts-expect-error: Mock `Compiler` object. + options: { + plugins: [new BundleAnalyzerPlugin()], + }, + }; + + const plugin = jest.mocked(BundleAnalyzerPlugin); + const instance = plugin.mock.instances[0]; + + // @ts-expect-error: Partial `server` mock. + instance.server = Promise.resolve({ + http: { + address: () => { + return { + port: 8888, + }; + }, + }, + }); + + const port = await getBundleAnalyzerPort(compiler); + expect(port).toBe(8888); + }); + + it('returns undefined if the bundle analyzer server is not available', async () => { + const compiler: Compiler = { + // @ts-expect-error: Mock `Compiler` object. + options: { + plugins: [new BundleAnalyzerPlugin()], + }, + }; + + const port = await getBundleAnalyzerPort(compiler); + expect(port).toBeUndefined(); + }); +}); diff --git a/packages/snaps-cli/src/commands/build/utils.ts b/packages/snaps-cli/src/commands/build/utils.ts new file mode 100644 index 0000000000..d570e777e4 --- /dev/null +++ b/packages/snaps-cli/src/commands/build/utils.ts @@ -0,0 +1,29 @@ +import type { Compiler } from 'webpack'; +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; + +/** + * Get the port of the bundle analyzer server. + * + * @param compiler - The Webpack compiler. + * @returns The port of the bundle analyzer server. + */ +export async function getBundleAnalyzerPort(compiler: Compiler) { + const analyzerPlugin = compiler.options.plugins.find( + (plugin): plugin is BundleAnalyzerPlugin => + plugin instanceof BundleAnalyzerPlugin, + ); + + if (analyzerPlugin?.server) { + const { http } = await analyzerPlugin.server; + + const address = http.address(); + if (typeof address === 'string') { + const { port } = new URL(address); + return parseInt(port, 10); + } + + return address?.port; + } + + return undefined; +} diff --git a/packages/snaps-cli/src/types/webpack-bundle-analyzer.d.ts b/packages/snaps-cli/src/types/webpack-bundle-analyzer.d.ts new file mode 100644 index 0000000000..0e47c2b4c6 --- /dev/null +++ b/packages/snaps-cli/src/types/webpack-bundle-analyzer.d.ts @@ -0,0 +1,22 @@ +declare module 'webpack-bundle-analyzer' { + import type { Server } from 'http'; + import type { Compiler, WebpackPluginInstance } from 'webpack'; + + export type BundleAnalyzerPluginOptions = { + analyzerPort?: number | undefined; + logLevel?: 'info' | 'warn' | 'error' | 'silent' | undefined; + openAnalyzer?: boolean | undefined; + }; + + export class BundleAnalyzerPlugin implements WebpackPluginInstance { + readonly opts: BundleAnalyzerPluginOptions; + + server?: Promise<{ + http: Server; + }>; + + constructor(options?: BundleAnalyzerPluginOptions); + + apply(compiler: Compiler): void; + } +} diff --git a/packages/snaps-cli/src/utils/logging.test.ts b/packages/snaps-cli/src/utils/logging.test.ts index 5a3f3683e0..19a8d6f633 100644 --- a/packages/snaps-cli/src/utils/logging.test.ts +++ b/packages/snaps-cli/src/utils/logging.test.ts @@ -1,7 +1,26 @@ -import { blue, dim, red, yellow } from 'chalk'; +import { blue, dim, green, red, yellow } from 'chalk'; import type { Ora } from 'ora'; -import { error, info, warn } from './logging'; +import { error, info, success, warn } from './logging'; + +describe('success', () => { + it('logs a success message', () => { + const log = jest.spyOn(console, 'log').mockImplementation(); + + success('foo'); + expect(log).toHaveBeenCalledWith(`${green('✔')} foo`); + }); + + it('clears a spinner if provided', () => { + jest.spyOn(console, 'warn').mockImplementation(); + + const spinner = { clear: jest.fn(), frame: jest.fn() } as unknown as Ora; + success('foo', spinner); + + expect(spinner.clear).toHaveBeenCalled(); + expect(spinner.frame).toHaveBeenCalled(); + }); +}); describe('warn', () => { it('logs a warning message', () => { diff --git a/packages/snaps-cli/src/utils/logging.ts b/packages/snaps-cli/src/utils/logging.ts index 2d88dab9f4..28a759c67c 100644 --- a/packages/snaps-cli/src/utils/logging.ts +++ b/packages/snaps-cli/src/utils/logging.ts @@ -1,9 +1,24 @@ import { logError, logInfo, logWarning } from '@metamask/snaps-utils'; -import { blue, dim, red, yellow } from 'chalk'; +import { blue, dim, green, red, yellow } from 'chalk'; import type { Ora } from 'ora'; /** - * Log a warning message. The message is prefixed with "Warning:". + * Log a success message. The message is prefixed with a green checkmark. + * + * @param message - The message to log. + * @param spinner - The spinner to clear. + */ +export function success(message: string, spinner?: Ora) { + if (spinner) { + spinner.clear(); + spinner.frame(); + } + + logInfo(`${green('✔')} ${message}`); +} + +/** + * Log a warning message. The message is prefixed with a yellow warning sign. * * @param message - The message to log. * @param spinner - The spinner to clear. diff --git a/packages/snaps-cli/src/utils/steps.test.ts b/packages/snaps-cli/src/utils/steps.test.ts index 971f5e19ef..af0641b234 100644 --- a/packages/snaps-cli/src/utils/steps.test.ts +++ b/packages/snaps-cli/src/utils/steps.test.ts @@ -63,6 +63,44 @@ describe('executeSteps', () => { }); }); + it('updates the context if a step returns an object', async () => { + const steps = [ + { + name: 'Step 1', + task: jest.fn(), + }, + { + name: 'Step 2', + task: jest.fn().mockResolvedValue({ foo: 'baz' }), + }, + { + name: 'Step 3', + task: jest.fn(), + }, + ]; + + const context = { + foo: 'bar', + }; + + await executeSteps(steps, context); + + expect(steps[0].task).toHaveBeenCalledWith({ + ...context, + spinner: expect.any(Object), + }); + + expect(steps[0].task).toHaveBeenCalledWith({ + ...context, + spinner: expect.any(Object), + }); + + expect(steps[2].task).toHaveBeenCalledWith({ + foo: 'baz', + spinner: expect.any(Object), + }); + }); + it('sets the exit code to 1 if a step throws an error', async () => { const log = jest.spyOn(console, 'error').mockImplementation(); diff --git a/packages/snaps-cli/src/utils/steps.ts b/packages/snaps-cli/src/utils/steps.ts index d75074d0de..67509d0af6 100644 --- a/packages/snaps-cli/src/utils/steps.ts +++ b/packages/snaps-cli/src/utils/steps.ts @@ -8,7 +8,7 @@ import { error } from './logging'; export type Step> = { name: string; condition?: (context: Context) => boolean; - task: (context: Context & { spinner: Ora }) => Promise; + task: (context: Context & { spinner: Ora }) => Promise; }; export type Steps> = Readonly< @@ -34,21 +34,27 @@ export async function executeSteps>( spinner.start(); try { - for (const step of steps) { + await steps.reduce>(async (contextPromise, step) => { + const currentContext = await contextPromise; + // If the step has a condition, and it returns false, we skip the step. - if (step.condition && !step.condition(context)) { - continue; + if (step.condition && !step.condition(currentContext)) { + return currentContext; } // Calling `start` here instead of setting `spinner.text` seems to work // better when the process doesn't have a TTY. spinner.start(dim(step.name)); - await step.task({ - ...context, + const newContext = await step.task({ + ...currentContext, spinner, }); - } + + // If the task returns a new context, we use it. Otherwise, we keep the + // current context. + return newContext ?? currentContext; + }, Promise.resolve(context)); // The spinner may have been stopped by a step, so we only succeed if it's // still spinning. @@ -58,6 +64,8 @@ export async function executeSteps>( } catch (_error) { error(getErrorMessage(_error), spinner); spinner.stop(); + + // eslint-disable-next-line require-atomic-updates process.exitCode = 1; } } diff --git a/packages/snaps-cli/src/webpack/__snapshots__/config.test.ts.snap b/packages/snaps-cli/src/webpack/__snapshots__/config.test.ts.snap index 382933b893..e418d5dc33 100644 --- a/packages/snaps-cli/src/webpack/__snapshots__/config.test.ts.snap +++ b/packages/snaps-cli/src/webpack/__snapshots__/config.test.ts.snap @@ -3542,33 +3542,6 @@ exports[`getDefaultConfiguration returns the default Webpack configuration when "hints": false, }, "plugins": [ - BundleAnalyzerPlugin { - "logger": Logger { - "activeLevels": Set { - "info", - "warn", - "error", - "silent", - }, - }, - "opts": { - "analyzerHost": "127.0.0.1", - "analyzerMode": "server", - "analyzerPort": 8888, - "analyzerUrl": [Function], - "defaultSizes": "parsed", - "excludeAssets": null, - "generateStatsFile": false, - "logLevel": "info", - "openAnalyzer": true, - "reportFilename": null, - "reportTitle": [Function], - "startAnalyzer": true, - "statsFilename": "stats.json", - "statsOptions": null, - }, - "server": null, - }, SnapsWebpackPlugin { "options": { "eval": undefined, @@ -3611,6 +3584,30 @@ exports[`getDefaultConfiguration returns the default Webpack configuration when "builtIns": true, }, }, + BundleAnalyzerPlugin { + "logger": Logger { + "activeLevels": Set { + "silent", + }, + }, + "opts": { + "analyzerHost": "127.0.0.1", + "analyzerMode": "server", + "analyzerPort": 0, + "analyzerUrl": [Function], + "defaultSizes": "parsed", + "excludeAssets": null, + "generateStatsFile": false, + "logLevel": "silent", + "openAnalyzer": false, + "reportFilename": null, + "reportTitle": [Function], + "startAnalyzer": true, + "statsFilename": "stats.json", + "statsOptions": null, + }, + "server": null, + }, ], "resolve": { "extensions": [ diff --git a/packages/snaps-cli/src/webpack/config.ts b/packages/snaps-cli/src/webpack/config.ts index e2666c2504..65fb5b00c4 100644 --- a/packages/snaps-cli/src/webpack/config.ts +++ b/packages/snaps-cli/src/webpack/config.ts @@ -3,7 +3,7 @@ import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; import type { Ora } from 'ora'; import { resolve } from 'path'; import TerserPlugin from 'terser-webpack-plugin'; -import type { Configuration, WebpackPluginInstance } from 'webpack'; +import type { Configuration } from 'webpack'; import { DefinePlugin, ProgressPlugin, ProvidePlugin } from 'webpack'; import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; @@ -288,9 +288,6 @@ export async function getDefaultConfiguration( * @see https://webpack.js.org/configuration/plugins/ */ plugins: [ - options.analyze && - (new BundleAnalyzerPlugin() as unknown as WebpackPluginInstance), - /** * The `ForkTsCheckerWebpackPlugin` is a Webpack plugin that checks * Typescript type definitions, it does this in a separate process for speed. @@ -363,6 +360,13 @@ export async function getDefaultConfiguration( options.spinner, ), + options.analyze && + new BundleAnalyzerPlugin({ + analyzerPort: 0, + logLevel: 'silent', + openAnalyzer: false, + }), + /** * The `ProviderPlugin` is a Webpack plugin that automatically load * modules instead of having to import or require them everywhere. diff --git a/yarn.lock b/yarn.lock index 5160fb6c02..1ac66cff43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3704,13 +3704,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10/97106439d750a409c22c8bff822d648f6a71f3aa9bc8e5129efdc36343cd3096ddc4eeb1c62d2fe48e9bdd4db37b05d4646a17114ecebd3bbcacfa2de51c3c1d - languageName: node - linkType: hard - "@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1": version: 1.1.2 resolution: "@jridgewell/set-array@npm:1.1.2" @@ -3742,13 +3735,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd - languageName: node - linkType: hard - "@jridgewell/trace-mapping@npm:0.3.9": version: 0.3.9 resolution: "@jridgewell/trace-mapping@npm:0.3.9" @@ -3769,16 +3755,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc - languageName: node - linkType: hard - "@jspm/core@npm:^2.0.1": version: 2.0.1 resolution: "@jspm/core@npm:2.0.1" @@ -5670,7 +5646,6 @@ __metadata: "@types/jest": "npm:^27.5.1" "@types/node": "npm:18.14.2" "@types/serve-handler": "npm:^6.1.0" - "@types/webpack-bundle-analyzer": "npm:^4.7.0" "@types/yargs": "npm:^17.0.24" "@typescript-eslint/eslint-plugin": "npm:^5.42.1" "@typescript-eslint/parser": "npm:^6.21.0" @@ -7729,16 +7704,6 @@ __metadata: languageName: node linkType: hard -"@types/eslint-scope@npm:^3.7.7": - version: 3.7.7 - resolution: "@types/eslint-scope@npm:3.7.7" - dependencies: - "@types/eslint": "npm:*" - "@types/estree": "npm:*" - checksum: 10/e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e - languageName: node - linkType: hard - "@types/eslint@npm:*": version: 8.4.1 resolution: "@types/eslint@npm:8.4.1" @@ -7756,13 +7721,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:^1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d - languageName: node - linkType: hard - "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": version: 4.17.35 resolution: "@types/express-serve-static-core@npm:4.17.35" @@ -8276,17 +8234,6 @@ __metadata: languageName: node linkType: hard -"@types/webpack-bundle-analyzer@npm:^4.7.0": - version: 4.7.0 - resolution: "@types/webpack-bundle-analyzer@npm:4.7.0" - dependencies: - "@types/node": "npm:*" - tapable: "npm:^2.2.0" - webpack: "npm:^5" - checksum: 10/2d9a2d4e26b1239623df97caceddd37a14c258623bccf27aca9da65b963cad33fdbfdc3a4770a58dbd2f9e6f591f62990616938aa52edf58aae3f6166c0045c1 - languageName: node - linkType: hard - "@types/webpack-env@npm:^1.18.1": version: 1.18.1 resolution: "@types/webpack-env@npm:1.18.1" @@ -8872,16 +8819,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/ast@npm:1.14.1" - dependencies: - "@webassemblyjs/helper-numbers": "npm:1.13.2" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" - checksum: 10/f83e6abe38057f5d87c1fb356513a371a8b43c9b87657f2790741a66b1ef8ecf958d1391bc42f27c5fb33f58ab8286a38ea849fdd21f433cd4df1307424bab45 - languageName: node - linkType: hard - "@webassemblyjs/floating-point-hex-parser@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" @@ -8889,13 +8826,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" - checksum: 10/e866ec8433f4a70baa511df5e8f2ebcd6c24f4e2cc6274c7c5aabe2bcce3459ea4680e0f35d450e1f3602acf3913b6b8e4f15069c8cfd34ae8609fb9a7d01795 - languageName: node - linkType: hard - "@webassemblyjs/helper-api-error@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" @@ -8903,13 +8833,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" - checksum: 10/48b5df7fd3095bb252f59a139fe2cbd999a62ac9b488123e9a0da3906ad8a2f2da7b2eb21d328c01a90da987380928706395c2897d1f3ed9e2125b6d75a920d0 - languageName: node - linkType: hard - "@webassemblyjs/helper-buffer@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-buffer@npm:1.11.6" @@ -8917,13 +8840,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" - checksum: 10/9690afeafa5e765a34620aa6216e9d40f9126d4e37e9726a2594bf60cab6b211ef20ab6670fd3c4449dd4a3497e69e49b2b725c8da0fb213208c7f45f15f5d5b - languageName: node - linkType: hard - "@webassemblyjs/helper-numbers@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" @@ -8935,17 +8851,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" - dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" - "@webassemblyjs/helper-api-error": "npm:1.13.2" - "@xtuc/long": "npm:4.2.2" - checksum: 10/e4c7d0b09811e1cda8eec644a022b560b28f4e974f50195375ccd007df5ee48a922a6dcff5ac40b6a8ec850d56d0ea6419318eee49fec7819ede14e90417a6a4 - languageName: node - linkType: hard - "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" @@ -8953,13 +8858,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" - checksum: 10/3edd191fff7296df1ef3b023bdbe6cb5ea668f6386fd197ccfce46015c6f2a8cc9763cfb86503a0b94973ad27996645afff2252ee39a236513833259a47af6ed - languageName: node - linkType: hard - "@webassemblyjs/helper-wasm-section@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.6" @@ -8972,18 +8870,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@webassemblyjs/helper-buffer": "npm:1.14.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" - "@webassemblyjs/wasm-gen": "npm:1.14.1" - checksum: 10/6b73874f906532512371181d7088460f767966f26309e836060c5a8e4e4bfe6d523fb5f4c034b34aa22ebb1192815f95f0e264298769485c1f0980fdd63ae0ce - languageName: node - linkType: hard - "@webassemblyjs/ieee754@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/ieee754@npm:1.11.6" @@ -8993,15 +8879,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/ieee754@npm:1.13.2" - dependencies: - "@xtuc/ieee754": "npm:^1.2.0" - checksum: 10/d7e3520baa37a7309fa7db4d73d69fb869878853b1ebd4b168821bd03fcc4c0e1669c06231315b0039035d9a7a462e53de3ad982da4a426a4b0743b5888e8673 - languageName: node - linkType: hard - "@webassemblyjs/leb128@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/leb128@npm:1.11.6" @@ -9011,15 +8888,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/leb128@npm:1.13.2" - dependencies: - "@xtuc/long": "npm:4.2.2" - checksum: 10/3a10542c86807061ec3230bac8ee732289c852b6bceb4b88ebd521a12fbcecec7c432848284b298154f28619e2746efbed19d6904aef06c49ef20a0b85f650cf - languageName: node - linkType: hard - "@webassemblyjs/utf8@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/utf8@npm:1.11.6" @@ -9027,13 +8895,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/utf8@npm:1.13.2" - checksum: 10/27885e5d19f339501feb210867d69613f281eda695ac508f04d69fa3398133d05b6870969c0242b054dc05420ed1cc49a64dea4fe0588c18d211cddb0117cc54 - languageName: node - linkType: hard - "@webassemblyjs/wasm-edit@npm:^1.11.5": version: 1.11.6 resolution: "@webassemblyjs/wasm-edit@npm:1.11.6" @@ -9050,22 +8911,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:^1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@webassemblyjs/helper-buffer": "npm:1.14.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" - "@webassemblyjs/helper-wasm-section": "npm:1.14.1" - "@webassemblyjs/wasm-gen": "npm:1.14.1" - "@webassemblyjs/wasm-opt": "npm:1.14.1" - "@webassemblyjs/wasm-parser": "npm:1.14.1" - "@webassemblyjs/wast-printer": "npm:1.14.1" - checksum: 10/c62c50eadcf80876713f8c9f24106b18cf208160ab842fcb92060fd78c37bf37e7fcf0b7cbf1afc05d230277c2ce0f3f728432082c472dd1293e184a95f9dbdd - languageName: node - linkType: hard - "@webassemblyjs/wasm-gen@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" @@ -9079,19 +8924,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" - "@webassemblyjs/ieee754": "npm:1.13.2" - "@webassemblyjs/leb128": "npm:1.13.2" - "@webassemblyjs/utf8": "npm:1.13.2" - checksum: 10/6085166b0987d3031355fe17a4f9ef0f412e08098d95454059aced2bd72a4c3df2bc099fa4d32d640551fc3eca1ac1a997b44432e46dc9d84642688e42c17ed4 - languageName: node - linkType: hard - "@webassemblyjs/wasm-opt@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" @@ -9104,18 +8936,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@webassemblyjs/helper-buffer": "npm:1.14.1" - "@webassemblyjs/wasm-gen": "npm:1.14.1" - "@webassemblyjs/wasm-parser": "npm:1.14.1" - checksum: 10/fa5d1ef8d2156e7390927f938f513b7fb4440dd6804b3d6c8622b7b1cf25a3abf1a5809f615896d4918e04b27b52bc3cbcf18faf2d563cb563ae0a9204a492db - languageName: node - linkType: hard - "@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": version: 1.11.6 resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" @@ -9130,20 +8950,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@webassemblyjs/helper-api-error": "npm:1.13.2" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" - "@webassemblyjs/ieee754": "npm:1.13.2" - "@webassemblyjs/leb128": "npm:1.13.2" - "@webassemblyjs/utf8": "npm:1.13.2" - checksum: 10/07d9805fda88a893c984ed93d5a772d20d671e9731358ab61c6c1af8e0e58d1c42fc230c18974dfddebc9d2dd7775d514ba4d445e70080b16478b4b16c39c7d9 - languageName: node - linkType: hard - "@webassemblyjs/wast-printer@npm:1.11.6": version: 1.11.6 resolution: "@webassemblyjs/wast-printer@npm:1.11.6" @@ -9154,16 +8960,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wast-printer@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@xtuc/long": "npm:4.2.2" - checksum: 10/cef09aad2fcd291bfcf9efdae2ea1e961a1ba0f925d1d9dcdd8c746d32fbaf431b6d26a0241699c0e39f82139018aa720b4ceb84ac6f4c78f13072747480db69 - languageName: node - linkType: hard - "@webpack-cli/configtest@npm:^2.1.1": version: 2.1.1 resolution: "@webpack-cli/configtest@npm:2.1.1" @@ -9364,7 +9160,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.14.0": +"acorn@npm:^8.0.4, acorn@npm:^8.11.0": version: 8.14.0 resolution: "acorn@npm:8.14.0" bin: @@ -10477,20 +10273,6 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.24.0": - version: 4.24.4 - resolution: "browserslist@npm:4.24.4" - dependencies: - caniuse-lite: "npm:^1.0.30001688" - electron-to-chromium: "npm:^1.5.73" - node-releases: "npm:^2.0.19" - update-browserslist-db: "npm:^1.1.1" - bin: - browserslist: cli.js - checksum: 10/11fda105e803d891311a21a1f962d83599319165faf471c2d70e045dff82a12128f5b50b1fcba665a2352ad66147aaa248a9d2355a80aadc3f53375eb3de2e48 - languageName: node - linkType: hard - "bs-logger@npm:0.x": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" @@ -10776,13 +10558,6 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001697 - resolution: "caniuse-lite@npm:1.0.30001697" - checksum: 10/cd0ca97e71f4157ff3d26990a24122586a973a14086ad43c459c2f0f2f9876b327eee57c2315bb04bd5e826e77d0b6f55723c583c78be0eaf0f3f171afaf7eff - languageName: node - linkType: hard - "chainsaw@npm:~0.1.0": version: 0.1.0 resolution: "chainsaw@npm:0.1.0" @@ -12501,13 +12276,6 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.73": - version: 1.5.93 - resolution: "electron-to-chromium@npm:1.5.93" - checksum: 10/14fed9c0a0b4db86aff4267aa66afa5072a1b779b687252a059e25b2e72d2bf7c09147cf4ae8eae866c1ed7552b022d0f18239a00cda9e31b216eb5f203c72cc - languageName: node - linkType: hard - "elliptic@npm:^6.5.3, elliptic@npm:^6.5.4": version: 6.5.7 resolution: "elliptic@npm:6.5.7" @@ -12593,16 +12361,6 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.1": - version: 5.18.1 - resolution: "enhanced-resolve@npm:5.18.1" - dependencies: - graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: 10/50e81c7fe2239fba5670ebce78a34709906ed3a79274aa416434f7307b252e0b7824d76a7dd403eca795571dc6afd9a44183fc45a68475e8f2fdfbae6e92fcc3 - languageName: node - linkType: hard - "entities@npm:^2.0.0": version: 2.2.0 resolution: "entities@npm:2.2.0" @@ -13138,13 +12896,6 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.2.0": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 - languageName: node - linkType: hard - "escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" @@ -14866,7 +14617,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -18486,13 +18237,6 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.19": - version: 2.0.19 - resolution: "node-releases@npm:2.0.19" - checksum: 10/c2b33b4f0c40445aee56141f13ca692fa6805db88510e5bbb3baadb2da13e1293b738e638e15e4a8eb668bb9e97debb08e7a35409b477b5cc18f171d35a83045 - languageName: node - linkType: hard - "nopt@npm:^5.0.0": version: 5.0.0 resolution: "nopt@npm:5.0.0" @@ -19266,13 +19010,6 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.1.1": - version: 1.1.1 - resolution: "picocolors@npm:1.1.1" - checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 - languageName: node - linkType: hard - "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -20983,18 +20720,6 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.3.0": - version: 4.3.0 - resolution: "schema-utils@npm:4.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.9" - ajv: "npm:^8.9.0" - ajv-formats: "npm:^2.1.1" - ajv-keywords: "npm:^5.1.0" - checksum: 10/86c5a7c72a275c56f140bc3cdd832d56efb11428c88ad588127db12cb9b2c83ccaa9540e115d7baa9c6175b5e360094457e29c44e6fb76787c9498c2eb6df5d6 - languageName: node - linkType: hard - "select-hose@npm:^2.0.0": version: 2.0.0 resolution: "select-hose@npm:2.0.0" @@ -21093,15 +20818,6 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.2": - version: 6.0.2 - resolution: "serialize-javascript@npm:6.0.2" - dependencies: - randombytes: "npm:^2.1.0" - checksum: 10/445a420a6fa2eaee4b70cbd884d538e259ab278200a2ededd73253ada17d5d48e91fb1f4cd224a236ab62ea7ba0a70c6af29fc93b4f3d3078bf7da1c031fde58 - languageName: node - linkType: hard - "serve-handler@npm:^6.1.5": version: 6.1.6 resolution: "serve-handler@npm:6.1.6" @@ -22163,28 +21879,6 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.10": - version: 5.3.11 - resolution: "terser-webpack-plugin@npm:5.3.11" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.25" - jest-worker: "npm:^27.4.5" - schema-utils: "npm:^4.3.0" - serialize-javascript: "npm:^6.0.2" - terser: "npm:^5.31.1" - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: 10/a8f7c92c75aa42628adfa4d171d4695c366c1852ecb4a24e72dd6fec86e383e12ac24b627e798fedff4e213c21fe851cebc61be3ab5a2537e6e42bea46690aa3 - languageName: node - linkType: hard - "terser-webpack-plugin@npm:^5.3.7, terser-webpack-plugin@npm:^5.3.9": version: 5.3.9 resolution: "terser-webpack-plugin@npm:5.3.9" @@ -22221,20 +21915,6 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.31.1": - version: 5.38.0 - resolution: "terser@npm:5.38.0" - dependencies: - "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" - commander: "npm:^2.20.0" - source-map-support: "npm:~0.5.20" - bin: - terser: bin/terser - checksum: 10/91d20ab35836861e1500a298b3f401b93f0a564cd4a52cd0da79f1a0a8fdbce4967cfc9b77f037603273a31af698eee2b27bbfab4dc5812d334035c9be18256b - languageName: node - linkType: hard - "test-exclude@npm:^6.0.0": version: 6.0.0 resolution: "test-exclude@npm:6.0.0" @@ -22953,20 +22633,6 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.1": - version: 1.1.2 - resolution: "update-browserslist-db@npm:1.1.2" - dependencies: - escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.1" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10/e7bf8221dfb21eba4a770cd803df94625bb04f65a706aa94c567de9600fe4eb6133fda016ec471dad43b9e7959c1bffb6580b5e20a87808d2e8a13e3892699a9 - languageName: node - linkType: hard - "uqr@npm:^0.1.2": version: 0.1.2 resolution: "uqr@npm:0.1.2" @@ -23338,16 +23004,6 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.4.1": - version: 2.4.2 - resolution: "watchpack@npm:2.4.2" - dependencies: - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.1.2" - checksum: 10/6bd4c051d9af189a6c781c3158dcb3069f432a0c144159eeb0a44117412105c61b2b683a5c9eebc4324625e0e9b76536387d0ba354594fa6cbbdf1ef60bee4c3 - languageName: node - linkType: hard - "wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": version: 1.7.3 resolution: "wbuf@npm:1.7.3" @@ -23620,42 +23276,6 @@ __metadata: languageName: node linkType: hard -"webpack@npm:^5": - version: 5.97.1 - resolution: "webpack@npm:5.97.1" - dependencies: - "@types/eslint-scope": "npm:^3.7.7" - "@types/estree": "npm:^1.0.6" - "@webassemblyjs/ast": "npm:^1.14.1" - "@webassemblyjs/wasm-edit": "npm:^1.14.1" - "@webassemblyjs/wasm-parser": "npm:^1.14.1" - acorn: "npm:^8.14.0" - browserslist: "npm:^4.24.0" - chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.17.1" - es-module-lexer: "npm:^1.2.1" - eslint-scope: "npm:5.1.1" - events: "npm:^3.2.0" - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.2.11" - json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" - mime-types: "npm:^2.1.27" - neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.2.0" - tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.10" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 10/665bd3b8c84b20f0b1f250159865e4d3e9b76c682030313d49124d5f8e96357ccdcc799dd9fe0ebf010fdb33dbc59d9863d79676a308e868e360ac98f7c09987 - languageName: node - linkType: hard - "webpack@npm:^5.88.0": version: 5.88.0 resolution: "webpack@npm:5.88.0"